From 49406a1353c4a000249d10e3e4380dc1bde374f7 Mon Sep 17 00:00:00 2001 From: iOS Date: Sun, 24 Apr 2022 11:00:26 +0200 Subject: [PATCH] cleanup 2nd tour --- .obsidian/community-plugins.json | 3 +- .../data.json | 12 +- .../obsidian-activity-history/data.json | 14 +- .../obsidian-book-search-plugin/data.json | 4 + .../obsidian-book-search-plugin/main.js | 2120 ++ .../obsidian-book-search-plugin/manifest.json | 10 + .../obsidian-book-search-plugin/styles.css | 1 + .obsidian/plugins/obsidian-commits/data.json | 123 +- .obsidian/plugins/obsidian-map-view/main.js | 77 +- .../plugins/obsidian-map-view/manifest.json | 2 +- .obsidian/plugins/obsidian-memos/main.js | 24684 +++++++--------- .../plugins/obsidian-memos/manifest.json | 4 +- .obsidian/plugins/obsidian-memos/styles.css | 12953 ++++---- .../obsidian-reminder-plugin/data.json | 27 +- .../plugins/obsidian-task-collector/main.js | 66 +- .../obsidian-task-collector/manifest.json | 4 +- .../obsidian-task-collector/styles.css | 2 +- .obsidian/workspace | 24 +- 00.01 Admin/Calendars/2022-04-18.md | 6 +- 00.01 Admin/Calendars/2022-04-22.md | 6 +- 00.01 Admin/Calendars/2022-04-23.md | 104 + ...24 2nd tour élections présidentielles.md | 2 +- 00.01 Admin/Calendars/2022-04-24.md | 104 + ...ve one of psychology’s oldest puzzles.md | 2 +- ...n, a Rare Cello and an Enduring Mystery.md | 208 + ...reum Is Worried About Crypto's Future 1.md | 195 - .../The Miseducation of Maria Montessori.md | 2 +- ...avelling of an Expert on Serial Killers.md | 2 +- ... Majury Discovers the Dark Side of Fame.md | 2 +- ... Jay Penske. And He’s Fine With That..md | 2 +- ...amera observes elusive deep sea animals.md | 191 + 05.02 Networks/Configuring UFW.md | 6 +- 06.02 Investments/Crypto Tasks.md | 3 +- 06.02 Investments/Equity Tasks.md | 3 +- 06.02 Investments/VC Tasks.md | 3 +- 35 files changed, 20696 insertions(+), 20275 deletions(-) create mode 100644 .obsidian/plugins/obsidian-book-search-plugin/data.json create mode 100644 .obsidian/plugins/obsidian-book-search-plugin/main.js create mode 100644 .obsidian/plugins/obsidian-book-search-plugin/manifest.json create mode 100644 .obsidian/plugins/obsidian-book-search-plugin/styles.css create mode 100644 00.01 Admin/Calendars/2022-04-23.md create mode 100644 00.01 Admin/Calendars/2022-04-24.md create mode 100644 00.03 News/Jeffrey Epstein, a Rare Cello and an Enduring Mystery.md delete mode 100644 00.03 News/The Man Behind Ethereum Is Worried About Crypto's Future 1.md create mode 100644 00.03 News/“The Eye in the Sea” camera observes elusive deep sea animals.md diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index 4ee30a2e..d261ca6e 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -58,5 +58,6 @@ "obsidian-wikipedia", "obsidian-read-it-later", "obsidian-full-calendar", - "markdown-table-editor" + "markdown-table-editor", + "obsidian-book-search-plugin" ] \ No newline at end of file diff --git a/.obsidian/plugins/customizable-page-header-buttons/data.json b/.obsidian/plugins/customizable-page-header-buttons/data.json index f7a38224..93462c05 100644 --- a/.obsidian/plugins/customizable-page-header-buttons/data.json +++ b/.obsidian/plugins/customizable-page-header-buttons/data.json @@ -29,7 +29,17 @@ "icon": "feather-dollar-sign", "name": "Crypto Lookup: Insert Selected Crypto Ticker Extended", "showButtons": "both" + }, + { + "id": "obsidian-book-search-plugin:open-book-search-modal", + "icon": "lucide-book-open", + "name": "Book Search: Create new book note", + "showButtons": "both" } ], - "desktop": false + "desktop": false, + "titleLeft": [], + "titleRight": [], + "titleCenter": [], + "paneRelief": false } \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-activity-history/data.json b/.obsidian/plugins/obsidian-activity-history/data.json index b43d513f..24d580b9 100644 --- a/.obsidian/plugins/obsidian-activity-history/data.json +++ b/.obsidian/plugins/obsidian-activity-history/data.json @@ -12,8 +12,8 @@ "checkpointList": [ { "path": "/", - "date": "2022-04-22", - "size": 4046120 + "date": "2022-04-24", + "size": 4053203 } ], "activityHistory": [ @@ -438,7 +438,15 @@ }, { "date": "2022-04-22", - "value": 1022 + "value": 1310 + }, + { + "date": "2022-04-23", + "value": 73734 + }, + { + "date": "2022-04-24", + "value": 1013 } ] } diff --git a/.obsidian/plugins/obsidian-book-search-plugin/data.json b/.obsidian/plugins/obsidian-book-search-plugin/data.json new file mode 100644 index 00000000..0754d52a --- /dev/null +++ b/.obsidian/plugins/obsidian-book-search-plugin/data.json @@ -0,0 +1,4 @@ +{ + "folder": "00.02 Inbox", + "frontmatter": "Tag: [\"\"]\nDate: \nDocType: \"Source\"\nHierarchy: \"NonRoot\"\nTimeStamp:\nlocation:\nSource:\n Type: \"Book\"\n Author:\n Language:\n Published:\n Link:\n Read:\n Cover:" +} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-book-search-plugin/main.js b/.obsidian/plugins/obsidian-book-search-plugin/main.js new file mode 100644 index 00000000..a5efa410 --- /dev/null +++ b/.obsidian/plugins/obsidian-book-search-plugin/main.js @@ -0,0 +1,2120 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __propIsEnum = Object.prototype.propertyIsEnumerable; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + } + return a; +}; +var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); +var __export = (target, all) => { + __markAsModule(target); + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __reExport = (target, module2, desc) => { + if (module2 && typeof module2 === "object" || typeof module2 === "function") { + for (let key of __getOwnPropNames(module2)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); + } + return target; +}; +var __toModule = (module2) => { + return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); +}; +var __async = (__this, __arguments, generator) => { + return new Promise((resolve, reject) => { + var fulfilled = (value) => { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + }; + var rejected = (value) => { + try { + step(generator.throw(value)); + } catch (e) { + reject(e); + } + }; + var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); + step((generator = generator.apply(__this, __arguments)).next()); + }); +}; + +// src/main.ts +__export(exports, { + default: () => BookSearchPlugin +}); +var import_obsidian8 = __toModule(require("obsidian")); + +// src/book_search_modal.ts +var import_obsidian2 = __toModule(require("obsidian")); + +// src/apis/google_books_api.ts +var import_obsidian = __toModule(require("obsidian")); +var API_URL = "https://www.googleapis.com/books/v1/volumes"; +function getByQuery(query) { + return __async(this, null, function* () { + try { + const searchResults = yield apiGet(query); + if (searchResults.totalItems == 0) { + throw new Error("No results found."); + } + return searchResults.items.map(({ volumeInfo }) => formatForSuggestion(volumeInfo)); + } catch (error) { + console.warn(error); + throw error; + } + }); +} +function getISBN(item) { + let ISBN10 = ""; + let ISBN13 = ""; + let isbn10_data, isbn13_data; + if (item.industryIdentifiers) { + isbn10_data = item.industryIdentifiers.find((element) => element.type == "ISBN_10"); + isbn13_data = item.industryIdentifiers.find((element) => element.type == "ISBN_13"); + } + if (isbn10_data) + ISBN10 = isbn10_data.identifier.trim(); + if (isbn13_data) + ISBN13 = isbn13_data.identifier.trim(); + return { ISBN10, ISBN13 }; +} +function formatForSuggestion(item) { + var _a, _b; + const ISBN = getISBN(item); + const book = { + title: item.title, + author: formatList(item.authors), + category: formatList(item.categories), + publisher: item.publisher, + totalPage: item.pageCount, + coverUrl: `${(_b = (_a = item.imageLinks) == null ? void 0 : _a.thumbnail) != null ? _b : ""}`.replace("http:", "https:"), + publishDate: item.publishedDate ? `${new Date(item.publishedDate).getFullYear()}` : "", + isbn10: ISBN.ISBN10, + isbn13: ISBN.ISBN13 + }; + return book; +} +function formatList(list) { + if (!list || list.length === 0 || list[0] == "N/A") + return ""; + if (list.length === 1) + return `${list[0]}`; + return list.map((item) => `"${item.trim()}"`).join(", "); +} +function apiGet(query) { + return __async(this, null, function* () { + const finalURL = new URL(API_URL); + finalURL.searchParams.append("q", query); + const res = yield (0, import_obsidian.request)({ + url: finalURL.href, + method: "GET" + }); + return JSON.parse(res); + }); +} + +// src/book_search_modal.ts +var BookSearchModal = class extends import_obsidian2.Modal { + constructor(app, onSubmit) { + super(app); + this.onSubmit = onSubmit; + } + searchBook() { + return __async(this, null, function* () { + if (!this.query) { + throw new Error("No query entered."); + } + if (!this.isBusy) { + try { + this.isBusy = true; + this.okBtnRef.setDisabled(false); + this.okBtnRef.setButtonText("Requesting..."); + const searchResults = yield getByQuery(this.query); + this.onSubmit(null, searchResults); + } catch (err) { + this.onSubmit(err); + } finally { + this.close(); + } + } + }); + } + submitEnterCallback(event) { + if (event.key === "Enter") { + this.searchBook(); + } + } + onOpen() { + const { contentEl } = this; + contentEl.createEl("h2", { text: "Search Book" }); + const placeholder = "Search by keyword or ISBN"; + const textComponent = new import_obsidian2.TextComponent(contentEl); + textComponent.inputEl.style.width = "100%"; + textComponent.setPlaceholder(placeholder != null ? placeholder : "").onChange((value) => this.query = value).inputEl.addEventListener("keydown", this.submitEnterCallback.bind(this)); + contentEl.appendChild(textComponent.inputEl); + textComponent.inputEl.focus(); + new import_obsidian2.Setting(contentEl).addButton((btn) => btn.setButtonText("Cancel").onClick(() => this.close())).addButton((btn) => { + return this.okBtnRef = btn.setButtonText("Ok").setCta().onClick(() => { + this.searchBook(); + }); + }); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; + +// src/book_suggest_modal.ts +var import_obsidian3 = __toModule(require("obsidian")); +var BookSuggestModal = class extends import_obsidian3.SuggestModal { + constructor(app, suggestion, onChoose) { + super(app); + this.suggestion = suggestion; + this.onChoose = onChoose; + } + getSuggestions(query) { + return this.suggestion.filter((book) => { + const searchQuery = query.toLowerCase(); + return book.title.toLowerCase().includes(searchQuery) || book.author.toLowerCase().includes(searchQuery) || book.publisher.toLowerCase().includes(searchQuery); + }); + } + renderSuggestion(book, el) { + const title = book.title; + const publisher = book.publisher ? `, ${book.publisher}` : ""; + const publishDate = book.publishDate ? `(${book.publishDate})` : ""; + const totalPage = book.totalPage ? `, p${book.totalPage}` : ""; + const subtitle = `${book.author}${publisher}${publishDate}${totalPage}`; + el.createEl("div", { text: title }); + el.createEl("small", { text: subtitle }); + } + onChooseSuggestion(book, evt) { + this.onChoose(null, book); + } +}; + +// src/editor/cursor_jumper.ts +var import_obsidian4 = __toModule(require("obsidian")); +var CursorJumper = class { + constructor(app) { + this.app = app; + } + jumpToNextCursorLocation() { + return __async(this, null, function* () { + const activeView = this.app.workspace.getActiveViewOfType(import_obsidian4.MarkdownView); + if (!activeView) { + return; + } + const content = yield this.app.vault.cachedRead(activeView.file); + const indexOffset = content.length + 1; + const editor = activeView.editor; + editor.focus(); + editor.setCursor(indexOffset, 0); + }); + } +}; + +// src/settings/settings.ts +var import_obsidian7 = __toModule(require("obsidian")); + +// src/settings/suggesters/FolderSuggester.ts +var import_obsidian6 = __toModule(require("obsidian")); + +// src/settings/suggesters/suggest.ts +var import_obsidian5 = __toModule(require("obsidian")); + +// node_modules/@popperjs/core/lib/enums.js +var top = "top"; +var bottom = "bottom"; +var right = "right"; +var left = "left"; +var auto = "auto"; +var basePlacements = [top, bottom, right, left]; +var start = "start"; +var end = "end"; +var clippingParents = "clippingParents"; +var viewport = "viewport"; +var popper = "popper"; +var reference = "reference"; +var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) { + return acc.concat([placement + "-" + start, placement + "-" + end]); +}, []); +var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) { + return acc.concat([placement, placement + "-" + start, placement + "-" + end]); +}, []); +var beforeRead = "beforeRead"; +var read = "read"; +var afterRead = "afterRead"; +var beforeMain = "beforeMain"; +var main = "main"; +var afterMain = "afterMain"; +var beforeWrite = "beforeWrite"; +var write = "write"; +var afterWrite = "afterWrite"; +var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; + +// node_modules/@popperjs/core/lib/dom-utils/getNodeName.js +function getNodeName(element) { + return element ? (element.nodeName || "").toLowerCase() : null; +} + +// node_modules/@popperjs/core/lib/dom-utils/getWindow.js +function getWindow(node) { + if (node == null) { + return window; + } + if (node.toString() !== "[object Window]") { + var ownerDocument = node.ownerDocument; + return ownerDocument ? ownerDocument.defaultView || window : window; + } + return node; +} + +// node_modules/@popperjs/core/lib/dom-utils/instanceOf.js +function isElement(node) { + var OwnElement = getWindow(node).Element; + return node instanceof OwnElement || node instanceof Element; +} +function isHTMLElement(node) { + var OwnElement = getWindow(node).HTMLElement; + return node instanceof OwnElement || node instanceof HTMLElement; +} +function isShadowRoot(node) { + if (typeof ShadowRoot === "undefined") { + return false; + } + var OwnElement = getWindow(node).ShadowRoot; + return node instanceof OwnElement || node instanceof ShadowRoot; +} + +// node_modules/@popperjs/core/lib/modifiers/applyStyles.js +function applyStyles(_ref) { + var state = _ref.state; + Object.keys(state.elements).forEach(function(name) { + var style = state.styles[name] || {}; + var attributes = state.attributes[name] || {}; + var element = state.elements[name]; + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } + Object.assign(element.style, style); + Object.keys(attributes).forEach(function(name2) { + var value = attributes[name2]; + if (value === false) { + element.removeAttribute(name2); + } else { + element.setAttribute(name2, value === true ? "" : value); + } + }); + }); +} +function effect(_ref2) { + var state = _ref2.state; + var initialStyles = { + popper: { + position: state.options.strategy, + left: "0", + top: "0", + margin: "0" + }, + arrow: { + position: "absolute" + }, + reference: {} + }; + Object.assign(state.elements.popper.style, initialStyles.popper); + state.styles = initialStyles; + if (state.elements.arrow) { + Object.assign(state.elements.arrow.style, initialStyles.arrow); + } + return function() { + Object.keys(state.elements).forEach(function(name) { + var element = state.elements[name]; + var attributes = state.attributes[name] || {}; + var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); + var style = styleProperties.reduce(function(style2, property) { + style2[property] = ""; + return style2; + }, {}); + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } + Object.assign(element.style, style); + Object.keys(attributes).forEach(function(attribute) { + element.removeAttribute(attribute); + }); + }); + }; +} +var applyStyles_default = { + name: "applyStyles", + enabled: true, + phase: "write", + fn: applyStyles, + effect, + requires: ["computeStyles"] +}; + +// node_modules/@popperjs/core/lib/utils/getBasePlacement.js +function getBasePlacement(placement) { + return placement.split("-")[0]; +} + +// node_modules/@popperjs/core/lib/utils/math.js +var max = Math.max; +var min = Math.min; +var round = Math.round; + +// node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js +function getBoundingClientRect(element, includeScale) { + if (includeScale === void 0) { + includeScale = false; + } + var rect = element.getBoundingClientRect(); + var scaleX = 1; + var scaleY = 1; + if (isHTMLElement(element) && includeScale) { + var offsetHeight = element.offsetHeight; + var offsetWidth = element.offsetWidth; + if (offsetWidth > 0) { + scaleX = round(rect.width) / offsetWidth || 1; + } + if (offsetHeight > 0) { + scaleY = round(rect.height) / offsetHeight || 1; + } + } + return { + width: rect.width / scaleX, + height: rect.height / scaleY, + top: rect.top / scaleY, + right: rect.right / scaleX, + bottom: rect.bottom / scaleY, + left: rect.left / scaleX, + x: rect.left / scaleX, + y: rect.top / scaleY + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js +function getLayoutRect(element) { + var clientRect = getBoundingClientRect(element); + var width = element.offsetWidth; + var height = element.offsetHeight; + if (Math.abs(clientRect.width - width) <= 1) { + width = clientRect.width; + } + if (Math.abs(clientRect.height - height) <= 1) { + height = clientRect.height; + } + return { + x: element.offsetLeft, + y: element.offsetTop, + width, + height + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/contains.js +function contains(parent, child) { + var rootNode = child.getRootNode && child.getRootNode(); + if (parent.contains(child)) { + return true; + } else if (rootNode && isShadowRoot(rootNode)) { + var next = child; + do { + if (next && parent.isSameNode(next)) { + return true; + } + next = next.parentNode || next.host; + } while (next); + } + return false; +} + +// node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js +function getComputedStyle(element) { + return getWindow(element).getComputedStyle(element); +} + +// node_modules/@popperjs/core/lib/dom-utils/isTableElement.js +function isTableElement(element) { + return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0; +} + +// node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js +function getDocumentElement(element) { + return ((isElement(element) ? element.ownerDocument : element.document) || window.document).documentElement; +} + +// node_modules/@popperjs/core/lib/dom-utils/getParentNode.js +function getParentNode(element) { + if (getNodeName(element) === "html") { + return element; + } + return element.assignedSlot || element.parentNode || (isShadowRoot(element) ? element.host : null) || getDocumentElement(element); +} + +// node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js +function getTrueOffsetParent(element) { + if (!isHTMLElement(element) || getComputedStyle(element).position === "fixed") { + return null; + } + return element.offsetParent; +} +function getContainingBlock(element) { + var isFirefox = navigator.userAgent.toLowerCase().indexOf("firefox") !== -1; + var isIE = navigator.userAgent.indexOf("Trident") !== -1; + if (isIE && isHTMLElement(element)) { + var elementCss = getComputedStyle(element); + if (elementCss.position === "fixed") { + return null; + } + } + var currentNode = getParentNode(element); + if (isShadowRoot(currentNode)) { + currentNode = currentNode.host; + } + while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) { + var css = getComputedStyle(currentNode); + if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") { + return currentNode; + } else { + currentNode = currentNode.parentNode; + } + } + return null; +} +function getOffsetParent(element) { + var window2 = getWindow(element); + var offsetParent = getTrueOffsetParent(element); + while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === "static") { + offsetParent = getTrueOffsetParent(offsetParent); + } + if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle(offsetParent).position === "static")) { + return window2; + } + return offsetParent || getContainingBlock(element) || window2; +} + +// node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js +function getMainAxisFromPlacement(placement) { + return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y"; +} + +// node_modules/@popperjs/core/lib/utils/within.js +function within(min2, value, max2) { + return max(min2, min(value, max2)); +} +function withinMaxClamp(min2, value, max2) { + var v = within(min2, value, max2); + return v > max2 ? max2 : v; +} + +// node_modules/@popperjs/core/lib/utils/getFreshSideObject.js +function getFreshSideObject() { + return { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; +} + +// node_modules/@popperjs/core/lib/utils/mergePaddingObject.js +function mergePaddingObject(paddingObject) { + return Object.assign({}, getFreshSideObject(), paddingObject); +} + +// node_modules/@popperjs/core/lib/utils/expandToHashMap.js +function expandToHashMap(value, keys) { + return keys.reduce(function(hashMap, key) { + hashMap[key] = value; + return hashMap; + }, {}); +} + +// node_modules/@popperjs/core/lib/modifiers/arrow.js +var toPaddingObject = function toPaddingObject2(padding, state) { + padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, { + placement: state.placement + })) : padding; + return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); +}; +function arrow(_ref) { + var _state$modifiersData$; + var state = _ref.state, name = _ref.name, options = _ref.options; + var arrowElement = state.elements.arrow; + var popperOffsets2 = state.modifiersData.popperOffsets; + var basePlacement = getBasePlacement(state.placement); + var axis = getMainAxisFromPlacement(basePlacement); + var isVertical = [left, right].indexOf(basePlacement) >= 0; + var len = isVertical ? "height" : "width"; + if (!arrowElement || !popperOffsets2) { + return; + } + var paddingObject = toPaddingObject(options.padding, state); + var arrowRect = getLayoutRect(arrowElement); + var minProp = axis === "y" ? top : left; + var maxProp = axis === "y" ? bottom : right; + var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len]; + var startDiff = popperOffsets2[axis] - state.rects.reference[axis]; + var arrowOffsetParent = getOffsetParent(arrowElement); + var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; + var centerToReference = endDiff / 2 - startDiff / 2; + var min2 = paddingObject[minProp]; + var max2 = clientSize - arrowRect[len] - paddingObject[maxProp]; + var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; + var offset2 = within(min2, center, max2); + var axisProp = axis; + state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$); +} +function effect2(_ref2) { + var state = _ref2.state, options = _ref2.options; + var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element; + if (arrowElement == null) { + return; + } + if (typeof arrowElement === "string") { + arrowElement = state.elements.popper.querySelector(arrowElement); + if (!arrowElement) { + return; + } + } + if (true) { + if (!isHTMLElement(arrowElement)) { + console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).', "To use an SVG arrow, wrap it in an HTMLElement that will be used as", "the arrow."].join(" ")); + } + } + if (!contains(state.elements.popper, arrowElement)) { + if (true) { + console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', "element."].join(" ")); + } + return; + } + state.elements.arrow = arrowElement; +} +var arrow_default = { + name: "arrow", + enabled: true, + phase: "main", + fn: arrow, + effect: effect2, + requires: ["popperOffsets"], + requiresIfExists: ["preventOverflow"] +}; + +// node_modules/@popperjs/core/lib/utils/getVariation.js +function getVariation(placement) { + return placement.split("-")[1]; +} + +// node_modules/@popperjs/core/lib/modifiers/computeStyles.js +var unsetSides = { + top: "auto", + right: "auto", + bottom: "auto", + left: "auto" +}; +function roundOffsetsByDPR(_ref) { + var x = _ref.x, y = _ref.y; + var win = window; + var dpr = win.devicePixelRatio || 1; + return { + x: round(x * dpr) / dpr || 0, + y: round(y * dpr) / dpr || 0 + }; +} +function mapToStyles(_ref2) { + var _Object$assign2; + var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed; + var _offsets$x = offsets.x, x = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y = _offsets$y === void 0 ? 0 : _offsets$y; + var _ref3 = typeof roundOffsets === "function" ? roundOffsets({ + x, + y + }) : { + x, + y + }; + x = _ref3.x; + y = _ref3.y; + var hasX = offsets.hasOwnProperty("x"); + var hasY = offsets.hasOwnProperty("y"); + var sideX = left; + var sideY = top; + var win = window; + if (adaptive) { + var offsetParent = getOffsetParent(popper2); + var heightProp = "clientHeight"; + var widthProp = "clientWidth"; + if (offsetParent === getWindow(popper2)) { + offsetParent = getDocumentElement(popper2); + if (getComputedStyle(offsetParent).position !== "static" && position === "absolute") { + heightProp = "scrollHeight"; + widthProp = "scrollWidth"; + } + } + offsetParent = offsetParent; + if (placement === top || (placement === left || placement === right) && variation === end) { + sideY = bottom; + var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : offsetParent[heightProp]; + y -= offsetY - popperRect.height; + y *= gpuAcceleration ? 1 : -1; + } + if (placement === left || (placement === top || placement === bottom) && variation === end) { + sideX = right; + var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : offsetParent[widthProp]; + x -= offsetX - popperRect.width; + x *= gpuAcceleration ? 1 : -1; + } + } + var commonStyles = Object.assign({ + position + }, adaptive && unsetSides); + var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ + x, + y + }) : { + x, + y + }; + x = _ref4.x; + y = _ref4.y; + if (gpuAcceleration) { + var _Object$assign; + return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); + } + return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : "", _Object$assign2[sideX] = hasX ? x + "px" : "", _Object$assign2.transform = "", _Object$assign2)); +} +function computeStyles(_ref5) { + var state = _ref5.state, options = _ref5.options; + var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; + if (true) { + var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || ""; + if (adaptive && ["transform", "top", "right", "bottom", "left"].some(function(property) { + return transitionProperty.indexOf(property) >= 0; + })) { + console.warn(["Popper: Detected CSS transitions on at least one of the following", 'CSS properties: "transform", "top", "right", "bottom", "left".', "\n\n", 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', "for smooth transitions, or remove these properties from the CSS", "transition declaration on the popper element if only transitioning", "opacity or background-color for example.", "\n\n", "We recommend using the popper element as a wrapper around an inner", "element that can have any CSS property transitioned for animations."].join(" ")); + } + } + var commonStyles = { + placement: getBasePlacement(state.placement), + variation: getVariation(state.placement), + popper: state.elements.popper, + popperRect: state.rects.popper, + gpuAcceleration, + isFixed: state.options.strategy === "fixed" + }; + if (state.modifiersData.popperOffsets != null) { + state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.popperOffsets, + position: state.options.strategy, + adaptive, + roundOffsets + }))); + } + if (state.modifiersData.arrow != null) { + state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.arrow, + position: "absolute", + adaptive: false, + roundOffsets + }))); + } + state.attributes.popper = Object.assign({}, state.attributes.popper, { + "data-popper-placement": state.placement + }); +} +var computeStyles_default = { + name: "computeStyles", + enabled: true, + phase: "beforeWrite", + fn: computeStyles, + data: {} +}; + +// node_modules/@popperjs/core/lib/modifiers/eventListeners.js +var passive = { + passive: true +}; +function effect3(_ref) { + var state = _ref.state, instance = _ref.instance, options = _ref.options; + var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize; + var window2 = getWindow(state.elements.popper); + var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); + if (scroll) { + scrollParents.forEach(function(scrollParent) { + scrollParent.addEventListener("scroll", instance.update, passive); + }); + } + if (resize) { + window2.addEventListener("resize", instance.update, passive); + } + return function() { + if (scroll) { + scrollParents.forEach(function(scrollParent) { + scrollParent.removeEventListener("scroll", instance.update, passive); + }); + } + if (resize) { + window2.removeEventListener("resize", instance.update, passive); + } + }; +} +var eventListeners_default = { + name: "eventListeners", + enabled: true, + phase: "write", + fn: function fn() { + }, + effect: effect3, + data: {} +}; + +// node_modules/@popperjs/core/lib/utils/getOppositePlacement.js +var hash = { + left: "right", + right: "left", + bottom: "top", + top: "bottom" +}; +function getOppositePlacement(placement) { + return placement.replace(/left|right|bottom|top/g, function(matched) { + return hash[matched]; + }); +} + +// node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js +var hash2 = { + start: "end", + end: "start" +}; +function getOppositeVariationPlacement(placement) { + return placement.replace(/start|end/g, function(matched) { + return hash2[matched]; + }); +} + +// node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js +function getWindowScroll(node) { + var win = getWindow(node); + var scrollLeft = win.pageXOffset; + var scrollTop = win.pageYOffset; + return { + scrollLeft, + scrollTop + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js +function getWindowScrollBarX(element) { + return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; +} + +// node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js +function getViewportRect(element) { + var win = getWindow(element); + var html = getDocumentElement(element); + var visualViewport = win.visualViewport; + var width = html.clientWidth; + var height = html.clientHeight; + var x = 0; + var y = 0; + if (visualViewport) { + width = visualViewport.width; + height = visualViewport.height; + if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { + x = visualViewport.offsetLeft; + y = visualViewport.offsetTop; + } + } + return { + width, + height, + x: x + getWindowScrollBarX(element), + y + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js +function getDocumentRect(element) { + var _element$ownerDocumen; + var html = getDocumentElement(element); + var winScroll = getWindowScroll(element); + var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; + var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); + var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); + var x = -winScroll.scrollLeft + getWindowScrollBarX(element); + var y = -winScroll.scrollTop; + if (getComputedStyle(body || html).direction === "rtl") { + x += max(html.clientWidth, body ? body.clientWidth : 0) - width; + } + return { + width, + height, + x, + y + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js +function isScrollParent(element) { + var _getComputedStyle = getComputedStyle(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY; + return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); +} + +// node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js +function getScrollParent(node) { + if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) { + return node.ownerDocument.body; + } + if (isHTMLElement(node) && isScrollParent(node)) { + return node; + } + return getScrollParent(getParentNode(node)); +} + +// node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js +function listScrollParents(element, list) { + var _element$ownerDocumen; + if (list === void 0) { + list = []; + } + var scrollParent = getScrollParent(element); + var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); + var win = getWindow(scrollParent); + var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; + var updatedList = list.concat(target); + return isBody ? updatedList : updatedList.concat(listScrollParents(getParentNode(target))); +} + +// node_modules/@popperjs/core/lib/utils/rectToClientRect.js +function rectToClientRect(rect) { + return Object.assign({}, rect, { + left: rect.x, + top: rect.y, + right: rect.x + rect.width, + bottom: rect.y + rect.height + }); +} + +// node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js +function getInnerBoundingClientRect(element) { + var rect = getBoundingClientRect(element); + rect.top = rect.top + element.clientTop; + rect.left = rect.left + element.clientLeft; + rect.bottom = rect.top + element.clientHeight; + rect.right = rect.left + element.clientWidth; + rect.width = element.clientWidth; + rect.height = element.clientHeight; + rect.x = rect.left; + rect.y = rect.top; + return rect; +} +function getClientRectFromMixedType(element, clippingParent) { + return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element))); +} +function getClippingParents(element) { + var clippingParents2 = listScrollParents(getParentNode(element)); + var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle(element).position) >= 0; + var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; + if (!isElement(clipperElement)) { + return []; + } + return clippingParents2.filter(function(clippingParent) { + return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body"; + }); +} +function getClippingRect(element, boundary, rootBoundary) { + var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary); + var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]); + var firstClippingParent = clippingParents2[0]; + var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) { + var rect = getClientRectFromMixedType(element, clippingParent); + accRect.top = max(rect.top, accRect.top); + accRect.right = min(rect.right, accRect.right); + accRect.bottom = min(rect.bottom, accRect.bottom); + accRect.left = max(rect.left, accRect.left); + return accRect; + }, getClientRectFromMixedType(element, firstClippingParent)); + clippingRect.width = clippingRect.right - clippingRect.left; + clippingRect.height = clippingRect.bottom - clippingRect.top; + clippingRect.x = clippingRect.left; + clippingRect.y = clippingRect.top; + return clippingRect; +} + +// node_modules/@popperjs/core/lib/utils/computeOffsets.js +function computeOffsets(_ref) { + var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement; + var basePlacement = placement ? getBasePlacement(placement) : null; + var variation = placement ? getVariation(placement) : null; + var commonX = reference2.x + reference2.width / 2 - element.width / 2; + var commonY = reference2.y + reference2.height / 2 - element.height / 2; + var offsets; + switch (basePlacement) { + case top: + offsets = { + x: commonX, + y: reference2.y - element.height + }; + break; + case bottom: + offsets = { + x: commonX, + y: reference2.y + reference2.height + }; + break; + case right: + offsets = { + x: reference2.x + reference2.width, + y: commonY + }; + break; + case left: + offsets = { + x: reference2.x - element.width, + y: commonY + }; + break; + default: + offsets = { + x: reference2.x, + y: reference2.y + }; + } + var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; + if (mainAxis != null) { + var len = mainAxis === "y" ? "height" : "width"; + switch (variation) { + case start: + offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2); + break; + case end: + offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2); + break; + default: + } + } + return offsets; +} + +// node_modules/@popperjs/core/lib/utils/detectOverflow.js +function detectOverflow(state, options) { + if (options === void 0) { + options = {}; + } + var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding; + var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); + var altContext = elementContext === popper ? reference : popper; + var popperRect = state.rects.popper; + var element = state.elements[altBoundary ? altContext : elementContext]; + var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary); + var referenceClientRect = getBoundingClientRect(state.elements.reference); + var popperOffsets2 = computeOffsets({ + reference: referenceClientRect, + element: popperRect, + strategy: "absolute", + placement + }); + var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2)); + var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; + var overflowOffsets = { + top: clippingClientRect.top - elementClientRect.top + paddingObject.top, + bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, + left: clippingClientRect.left - elementClientRect.left + paddingObject.left, + right: elementClientRect.right - clippingClientRect.right + paddingObject.right + }; + var offsetData = state.modifiersData.offset; + if (elementContext === popper && offsetData) { + var offset2 = offsetData[placement]; + Object.keys(overflowOffsets).forEach(function(key) { + var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; + var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x"; + overflowOffsets[key] += offset2[axis] * multiply; + }); + } + return overflowOffsets; +} + +// node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js +function computeAutoPlacement(state, options) { + if (options === void 0) { + options = {}; + } + var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; + var variation = getVariation(placement); + var placements2 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) { + return getVariation(placement2) === variation; + }) : basePlacements; + var allowedPlacements = placements2.filter(function(placement2) { + return allowedAutoPlacements.indexOf(placement2) >= 0; + }); + if (allowedPlacements.length === 0) { + allowedPlacements = placements2; + if (true) { + console.error(["Popper: The `allowedAutoPlacements` option did not allow any", "placements. Ensure the `placement` option matches the variation", "of the allowed placements.", 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(" ")); + } + } + var overflows = allowedPlacements.reduce(function(acc, placement2) { + acc[placement2] = detectOverflow(state, { + placement: placement2, + boundary, + rootBoundary, + padding + })[getBasePlacement(placement2)]; + return acc; + }, {}); + return Object.keys(overflows).sort(function(a, b) { + return overflows[a] - overflows[b]; + }); +} + +// node_modules/@popperjs/core/lib/modifiers/flip.js +function getExpandedFallbackPlacements(placement) { + if (getBasePlacement(placement) === auto) { + return []; + } + var oppositePlacement = getOppositePlacement(placement); + return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; +} +function flip(_ref) { + var state = _ref.state, options = _ref.options, name = _ref.name; + if (state.modifiersData[name]._skip) { + return; + } + var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements; + var preferredPlacement = state.options.placement; + var basePlacement = getBasePlacement(preferredPlacement); + var isBasePlacement = basePlacement === preferredPlacement; + var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); + var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) { + return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, { + placement: placement2, + boundary, + rootBoundary, + padding, + flipVariations, + allowedAutoPlacements + }) : placement2); + }, []); + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var checksMap = new Map(); + var makeFallbackChecks = true; + var firstFittingPlacement = placements2[0]; + for (var i = 0; i < placements2.length; i++) { + var placement = placements2[i]; + var _basePlacement = getBasePlacement(placement); + var isStartVariation = getVariation(placement) === start; + var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; + var len = isVertical ? "width" : "height"; + var overflow = detectOverflow(state, { + placement, + boundary, + rootBoundary, + altBoundary, + padding + }); + var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; + if (referenceRect[len] > popperRect[len]) { + mainVariationSide = getOppositePlacement(mainVariationSide); + } + var altVariationSide = getOppositePlacement(mainVariationSide); + var checks = []; + if (checkMainAxis) { + checks.push(overflow[_basePlacement] <= 0); + } + if (checkAltAxis) { + checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); + } + if (checks.every(function(check) { + return check; + })) { + firstFittingPlacement = placement; + makeFallbackChecks = false; + break; + } + checksMap.set(placement, checks); + } + if (makeFallbackChecks) { + var numberOfChecks = flipVariations ? 3 : 1; + var _loop = function _loop2(_i2) { + var fittingPlacement = placements2.find(function(placement2) { + var checks2 = checksMap.get(placement2); + if (checks2) { + return checks2.slice(0, _i2).every(function(check) { + return check; + }); + } + }); + if (fittingPlacement) { + firstFittingPlacement = fittingPlacement; + return "break"; + } + }; + for (var _i = numberOfChecks; _i > 0; _i--) { + var _ret = _loop(_i); + if (_ret === "break") + break; + } + } + if (state.placement !== firstFittingPlacement) { + state.modifiersData[name]._skip = true; + state.placement = firstFittingPlacement; + state.reset = true; + } +} +var flip_default = { + name: "flip", + enabled: true, + phase: "main", + fn: flip, + requiresIfExists: ["offset"], + data: { + _skip: false + } +}; + +// node_modules/@popperjs/core/lib/modifiers/hide.js +function getSideOffsets(overflow, rect, preventedOffsets) { + if (preventedOffsets === void 0) { + preventedOffsets = { + x: 0, + y: 0 + }; + } + return { + top: overflow.top - rect.height - preventedOffsets.y, + right: overflow.right - rect.width + preventedOffsets.x, + bottom: overflow.bottom - rect.height + preventedOffsets.y, + left: overflow.left - rect.width - preventedOffsets.x + }; +} +function isAnySideFullyClipped(overflow) { + return [top, right, bottom, left].some(function(side) { + return overflow[side] >= 0; + }); +} +function hide(_ref) { + var state = _ref.state, name = _ref.name; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var preventedOffsets = state.modifiersData.preventOverflow; + var referenceOverflow = detectOverflow(state, { + elementContext: "reference" + }); + var popperAltOverflow = detectOverflow(state, { + altBoundary: true + }); + var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); + var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); + var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); + var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); + state.modifiersData[name] = { + referenceClippingOffsets, + popperEscapeOffsets, + isReferenceHidden, + hasPopperEscaped + }; + state.attributes.popper = Object.assign({}, state.attributes.popper, { + "data-popper-reference-hidden": isReferenceHidden, + "data-popper-escaped": hasPopperEscaped + }); +} +var hide_default = { + name: "hide", + enabled: true, + phase: "main", + requiresIfExists: ["preventOverflow"], + fn: hide +}; + +// node_modules/@popperjs/core/lib/modifiers/offset.js +function distanceAndSkiddingToXY(placement, rects, offset2) { + var basePlacement = getBasePlacement(placement); + var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; + var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, { + placement + })) : offset2, skidding = _ref[0], distance = _ref[1]; + skidding = skidding || 0; + distance = (distance || 0) * invertDistance; + return [left, right].indexOf(basePlacement) >= 0 ? { + x: distance, + y: skidding + } : { + x: skidding, + y: distance + }; +} +function offset(_ref2) { + var state = _ref2.state, options = _ref2.options, name = _ref2.name; + var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset; + var data = placements.reduce(function(acc, placement) { + acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2); + return acc; + }, {}); + var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y; + if (state.modifiersData.popperOffsets != null) { + state.modifiersData.popperOffsets.x += x; + state.modifiersData.popperOffsets.y += y; + } + state.modifiersData[name] = data; +} +var offset_default = { + name: "offset", + enabled: true, + phase: "main", + requires: ["popperOffsets"], + fn: offset +}; + +// node_modules/@popperjs/core/lib/modifiers/popperOffsets.js +function popperOffsets(_ref) { + var state = _ref.state, name = _ref.name; + state.modifiersData[name] = computeOffsets({ + reference: state.rects.reference, + element: state.rects.popper, + strategy: "absolute", + placement: state.placement + }); +} +var popperOffsets_default = { + name: "popperOffsets", + enabled: true, + phase: "read", + fn: popperOffsets, + data: {} +}; + +// node_modules/@popperjs/core/lib/utils/getAltAxis.js +function getAltAxis(axis) { + return axis === "x" ? "y" : "x"; +} + +// node_modules/@popperjs/core/lib/modifiers/preventOverflow.js +function preventOverflow(_ref) { + var state = _ref.state, options = _ref.options, name = _ref.name; + var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; + var overflow = detectOverflow(state, { + boundary, + rootBoundary, + padding, + altBoundary + }); + var basePlacement = getBasePlacement(state.placement); + var variation = getVariation(state.placement); + var isBasePlacement = !variation; + var mainAxis = getMainAxisFromPlacement(basePlacement); + var altAxis = getAltAxis(mainAxis); + var popperOffsets2 = state.modifiersData.popperOffsets; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, { + placement: state.placement + })) : tetherOffset; + var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? { + mainAxis: tetherOffsetValue, + altAxis: tetherOffsetValue + } : Object.assign({ + mainAxis: 0, + altAxis: 0 + }, tetherOffsetValue); + var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; + var data = { + x: 0, + y: 0 + }; + if (!popperOffsets2) { + return; + } + if (checkMainAxis) { + var _offsetModifierState$; + var mainSide = mainAxis === "y" ? top : left; + var altSide = mainAxis === "y" ? bottom : right; + var len = mainAxis === "y" ? "height" : "width"; + var offset2 = popperOffsets2[mainAxis]; + var min2 = offset2 + overflow[mainSide]; + var max2 = offset2 - overflow[altSide]; + var additive = tether ? -popperRect[len] / 2 : 0; + var minLen = variation === start ? referenceRect[len] : popperRect[len]; + var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; + var arrowElement = state.elements.arrow; + var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { + width: 0, + height: 0 + }; + var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject(); + var arrowPaddingMin = arrowPaddingObject[mainSide]; + var arrowPaddingMax = arrowPaddingObject[altSide]; + var arrowLen = within(0, referenceRect[len], arrowRect[len]); + var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; + var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; + var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); + var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; + var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; + var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset; + var tetherMax = offset2 + maxOffset - offsetModifierValue; + var preventedOffset = within(tether ? min(min2, tetherMin) : min2, offset2, tether ? max(max2, tetherMax) : max2); + popperOffsets2[mainAxis] = preventedOffset; + data[mainAxis] = preventedOffset - offset2; + } + if (checkAltAxis) { + var _offsetModifierState$2; + var _mainSide = mainAxis === "x" ? top : left; + var _altSide = mainAxis === "x" ? bottom : right; + var _offset = popperOffsets2[altAxis]; + var _len = altAxis === "y" ? "height" : "width"; + var _min = _offset + overflow[_mainSide]; + var _max = _offset - overflow[_altSide]; + var isOriginSide = [top, left].indexOf(basePlacement) !== -1; + var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; + var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; + var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; + var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); + popperOffsets2[altAxis] = _preventedOffset; + data[altAxis] = _preventedOffset - _offset; + } + state.modifiersData[name] = data; +} +var preventOverflow_default = { + name: "preventOverflow", + enabled: true, + phase: "main", + fn: preventOverflow, + requiresIfExists: ["offset"] +}; + +// node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js +function getHTMLElementScroll(element) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; +} + +// node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js +function getNodeScroll(node) { + if (node === getWindow(node) || !isHTMLElement(node)) { + return getWindowScroll(node); + } else { + return getHTMLElementScroll(node); + } +} + +// node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js +function isElementScaled(element) { + var rect = element.getBoundingClientRect(); + var scaleX = round(rect.width) / element.offsetWidth || 1; + var scaleY = round(rect.height) / element.offsetHeight || 1; + return scaleX !== 1 || scaleY !== 1; +} +function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { + if (isFixed === void 0) { + isFixed = false; + } + var isOffsetParentAnElement = isHTMLElement(offsetParent); + var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); + var documentElement = getDocumentElement(offsetParent); + var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled); + var scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + var offsets = { + x: 0, + y: 0 + }; + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (getNodeName(offsetParent) !== "body" || isScrollParent(documentElement)) { + scroll = getNodeScroll(offsetParent); + } + if (isHTMLElement(offsetParent)) { + offsets = getBoundingClientRect(offsetParent, true); + offsets.x += offsetParent.clientLeft; + offsets.y += offsetParent.clientTop; + } else if (documentElement) { + offsets.x = getWindowScrollBarX(documentElement); + } + } + return { + x: rect.left + scroll.scrollLeft - offsets.x, + y: rect.top + scroll.scrollTop - offsets.y, + width: rect.width, + height: rect.height + }; +} + +// node_modules/@popperjs/core/lib/utils/orderModifiers.js +function order(modifiers) { + var map = new Map(); + var visited = new Set(); + var result = []; + modifiers.forEach(function(modifier) { + map.set(modifier.name, modifier); + }); + function sort(modifier) { + visited.add(modifier.name); + var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); + requires.forEach(function(dep) { + if (!visited.has(dep)) { + var depModifier = map.get(dep); + if (depModifier) { + sort(depModifier); + } + } + }); + result.push(modifier); + } + modifiers.forEach(function(modifier) { + if (!visited.has(modifier.name)) { + sort(modifier); + } + }); + return result; +} +function orderModifiers(modifiers) { + var orderedModifiers = order(modifiers); + return modifierPhases.reduce(function(acc, phase) { + return acc.concat(orderedModifiers.filter(function(modifier) { + return modifier.phase === phase; + })); + }, []); +} + +// node_modules/@popperjs/core/lib/utils/debounce.js +function debounce(fn2) { + var pending; + return function() { + if (!pending) { + pending = new Promise(function(resolve) { + Promise.resolve().then(function() { + pending = void 0; + resolve(fn2()); + }); + }); + } + return pending; + }; +} + +// node_modules/@popperjs/core/lib/utils/format.js +function format(str) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return [].concat(args).reduce(function(p, c) { + return p.replace(/%s/, c); + }, str); +} + +// node_modules/@popperjs/core/lib/utils/validateModifiers.js +var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s'; +var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available'; +var VALID_PROPERTIES = ["name", "enabled", "phase", "fn", "effect", "requires", "options"]; +function validateModifiers(modifiers) { + modifiers.forEach(function(modifier) { + [].concat(Object.keys(modifier), VALID_PROPERTIES).filter(function(value, index, self) { + return self.indexOf(value) === index; + }).forEach(function(key) { + switch (key) { + case "name": + if (typeof modifier.name !== "string") { + console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', '"' + String(modifier.name) + '"')); + } + break; + case "enabled": + if (typeof modifier.enabled !== "boolean") { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', '"' + String(modifier.enabled) + '"')); + } + break; + case "phase": + if (modifierPhases.indexOf(modifier.phase) < 0) { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + modifierPhases.join(", "), '"' + String(modifier.phase) + '"')); + } + break; + case "fn": + if (typeof modifier.fn !== "function") { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', '"' + String(modifier.fn) + '"')); + } + break; + case "effect": + if (modifier.effect != null && typeof modifier.effect !== "function") { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', '"' + String(modifier.fn) + '"')); + } + break; + case "requires": + if (modifier.requires != null && !Array.isArray(modifier.requires)) { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', '"' + String(modifier.requires) + '"')); + } + break; + case "requiresIfExists": + if (!Array.isArray(modifier.requiresIfExists)) { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', '"' + String(modifier.requiresIfExists) + '"')); + } + break; + case "options": + case "data": + break; + default: + console.error('PopperJS: an invalid property has been provided to the "' + modifier.name + '" modifier, valid properties are ' + VALID_PROPERTIES.map(function(s) { + return '"' + s + '"'; + }).join(", ") + '; but "' + key + '" was provided.'); + } + modifier.requires && modifier.requires.forEach(function(requirement) { + if (modifiers.find(function(mod) { + return mod.name === requirement; + }) == null) { + console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement)); + } + }); + }); + }); +} + +// node_modules/@popperjs/core/lib/utils/uniqueBy.js +function uniqueBy(arr, fn2) { + var identifiers = new Set(); + return arr.filter(function(item) { + var identifier = fn2(item); + if (!identifiers.has(identifier)) { + identifiers.add(identifier); + return true; + } + }); +} + +// node_modules/@popperjs/core/lib/utils/mergeByName.js +function mergeByName(modifiers) { + var merged = modifiers.reduce(function(merged2, current) { + var existing = merged2[current.name]; + merged2[current.name] = existing ? Object.assign({}, existing, current, { + options: Object.assign({}, existing.options, current.options), + data: Object.assign({}, existing.data, current.data) + }) : current; + return merged2; + }, {}); + return Object.keys(merged).map(function(key) { + return merged[key]; + }); +} + +// node_modules/@popperjs/core/lib/createPopper.js +var INVALID_ELEMENT_ERROR = "Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element."; +var INFINITE_LOOP_ERROR = "Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash."; +var DEFAULT_OPTIONS = { + placement: "bottom", + modifiers: [], + strategy: "absolute" +}; +function areValidElements() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return !args.some(function(element) { + return !(element && typeof element.getBoundingClientRect === "function"); + }); +} +function popperGenerator(generatorOptions) { + if (generatorOptions === void 0) { + generatorOptions = {}; + } + var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers2 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; + return function createPopper2(reference2, popper2, options) { + if (options === void 0) { + options = defaultOptions; + } + var state = { + placement: "bottom", + orderedModifiers: [], + options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), + modifiersData: {}, + elements: { + reference: reference2, + popper: popper2 + }, + attributes: {}, + styles: {} + }; + var effectCleanupFns = []; + var isDestroyed = false; + var instance = { + state, + setOptions: function setOptions(setOptionsAction) { + var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction; + cleanupModifierEffects(); + state.options = Object.assign({}, defaultOptions, state.options, options2); + state.scrollParents = { + reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [], + popper: listScrollParents(popper2) + }; + var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers2, state.options.modifiers))); + state.orderedModifiers = orderedModifiers.filter(function(m) { + return m.enabled; + }); + if (true) { + var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function(_ref) { + var name = _ref.name; + return name; + }); + validateModifiers(modifiers); + if (getBasePlacement(state.options.placement) === auto) { + var flipModifier = state.orderedModifiers.find(function(_ref2) { + var name = _ref2.name; + return name === "flip"; + }); + if (!flipModifier) { + console.error(['Popper: "auto" placements require the "flip" modifier be', "present and enabled to work."].join(" ")); + } + } + var _getComputedStyle = getComputedStyle(popper2), marginTop = _getComputedStyle.marginTop, marginRight = _getComputedStyle.marginRight, marginBottom = _getComputedStyle.marginBottom, marginLeft = _getComputedStyle.marginLeft; + if ([marginTop, marginRight, marginBottom, marginLeft].some(function(margin) { + return parseFloat(margin); + })) { + console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', "between the popper and its reference element or boundary.", "To replicate margin, use the `offset` modifier, as well as", "the `padding` option in the `preventOverflow` and `flip`", "modifiers."].join(" ")); + } + } + runModifierEffects(); + return instance.update(); + }, + forceUpdate: function forceUpdate() { + if (isDestroyed) { + return; + } + var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper; + if (!areValidElements(reference3, popper3)) { + if (true) { + console.error(INVALID_ELEMENT_ERROR); + } + return; + } + state.rects = { + reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"), + popper: getLayoutRect(popper3) + }; + state.reset = false; + state.placement = state.options.placement; + state.orderedModifiers.forEach(function(modifier) { + return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); + }); + var __debug_loops__ = 0; + for (var index = 0; index < state.orderedModifiers.length; index++) { + if (true) { + __debug_loops__ += 1; + if (__debug_loops__ > 100) { + console.error(INFINITE_LOOP_ERROR); + break; + } + } + if (state.reset === true) { + state.reset = false; + index = -1; + continue; + } + var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name; + if (typeof fn2 === "function") { + state = fn2({ + state, + options: _options, + name, + instance + }) || state; + } + } + }, + update: debounce(function() { + return new Promise(function(resolve) { + instance.forceUpdate(); + resolve(state); + }); + }), + destroy: function destroy() { + cleanupModifierEffects(); + isDestroyed = true; + } + }; + if (!areValidElements(reference2, popper2)) { + if (true) { + console.error(INVALID_ELEMENT_ERROR); + } + return instance; + } + instance.setOptions(options).then(function(state2) { + if (!isDestroyed && options.onFirstUpdate) { + options.onFirstUpdate(state2); + } + }); + function runModifierEffects() { + state.orderedModifiers.forEach(function(_ref3) { + var name = _ref3.name, _ref3$options = _ref3.options, options2 = _ref3$options === void 0 ? {} : _ref3$options, effect4 = _ref3.effect; + if (typeof effect4 === "function") { + var cleanupFn = effect4({ + state, + name, + instance, + options: options2 + }); + var noopFn = function noopFn2() { + }; + effectCleanupFns.push(cleanupFn || noopFn); + } + }); + } + function cleanupModifierEffects() { + effectCleanupFns.forEach(function(fn2) { + return fn2(); + }); + effectCleanupFns = []; + } + return instance; + }; +} + +// node_modules/@popperjs/core/lib/popper.js +var defaultModifiers = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default, offset_default, flip_default, preventOverflow_default, arrow_default, hide_default]; +var createPopper = /* @__PURE__ */ popperGenerator({ + defaultModifiers +}); + +// src/settings/suggesters/suggest.ts +var wrapAround = (value, size) => { + return (value % size + size) % size; +}; +var Suggest = class { + constructor(owner, containerEl, scope) { + this.owner = owner; + this.containerEl = containerEl; + containerEl.on("click", ".suggestion-item", this.onSuggestionClick.bind(this)); + containerEl.on("mousemove", ".suggestion-item", this.onSuggestionMouseover.bind(this)); + scope.register([], "ArrowUp", (event) => { + if (!event.isComposing) { + this.setSelectedItem(this.selectedItem - 1, true); + return false; + } + }); + scope.register([], "ArrowDown", (event) => { + if (!event.isComposing) { + this.setSelectedItem(this.selectedItem + 1, true); + return false; + } + }); + scope.register([], "Enter", (event) => { + if (!event.isComposing) { + this.useSelectedItem(event); + return false; + } + }); + } + onSuggestionClick(event, el) { + event.preventDefault(); + const item = this.suggestions.indexOf(el); + this.setSelectedItem(item, false); + this.useSelectedItem(event); + } + onSuggestionMouseover(_event, el) { + const item = this.suggestions.indexOf(el); + this.setSelectedItem(item, false); + } + setSuggestions(values) { + this.containerEl.empty(); + const suggestionEls = []; + values.forEach((value) => { + const suggestionEl = this.containerEl.createDiv("suggestion-item"); + this.owner.renderSuggestion(value, suggestionEl); + suggestionEls.push(suggestionEl); + }); + this.values = values; + this.suggestions = suggestionEls; + this.setSelectedItem(0, false); + } + useSelectedItem(event) { + const currentValue = this.values[this.selectedItem]; + if (currentValue) { + this.owner.selectSuggestion(currentValue, event); + } + } + setSelectedItem(selectedIndex, scrollIntoView) { + const normalizedIndex = wrapAround(selectedIndex, this.suggestions.length); + const prevSelectedSuggestion = this.suggestions[this.selectedItem]; + const selectedSuggestion = this.suggestions[normalizedIndex]; + prevSelectedSuggestion == null ? void 0 : prevSelectedSuggestion.removeClass("is-selected"); + selectedSuggestion == null ? void 0 : selectedSuggestion.addClass("is-selected"); + this.selectedItem = normalizedIndex; + if (scrollIntoView) { + selectedSuggestion.scrollIntoView(false); + } + } +}; +var TextInputSuggest = class { + constructor(app, inputEl) { + this.app = app; + this.inputEl = inputEl; + this.scope = new import_obsidian5.Scope(); + this.suggestEl = createDiv("suggestion-container"); + const suggestion = this.suggestEl.createDiv("suggestion"); + this.suggest = new Suggest(this, suggestion, this.scope); + this.scope.register([], "Escape", this.close.bind(this)); + this.inputEl.addEventListener("input", this.onInputChanged.bind(this)); + this.inputEl.addEventListener("focus", this.onInputChanged.bind(this)); + this.inputEl.addEventListener("blur", this.close.bind(this)); + this.suggestEl.on("mousedown", ".suggestion-container", (event) => { + event.preventDefault(); + }); + } + onInputChanged() { + const inputStr = this.inputEl.value; + const suggestions = this.getSuggestions(inputStr); + if (!suggestions) { + this.close(); + return; + } + if (suggestions.length > 0) { + this.suggest.setSuggestions(suggestions); + this.open(this.app.dom.appContainerEl, this.inputEl); + } else { + this.close(); + } + } + open(container, inputEl) { + this.app.keymap.pushScope(this.scope); + container.appendChild(this.suggestEl); + this.popper = createPopper(inputEl, this.suggestEl, { + placement: "bottom-start", + modifiers: [ + { + name: "sameWidth", + enabled: true, + fn: ({ state, instance }) => { + const targetWidth = `${state.rects.reference.width}px`; + if (state.styles.popper.width === targetWidth) { + return; + } + state.styles.popper.width = targetWidth; + instance.update(); + }, + phase: "beforeWrite", + requires: ["computeStyles"] + } + ] + }); + } + close() { + this.app.keymap.popScope(this.scope); + this.suggest.setSuggestions([]); + if (this.popper) + this.popper.destroy(); + this.suggestEl.detach(); + } +}; + +// src/settings/suggesters/FolderSuggester.ts +var FolderSuggest = class extends TextInputSuggest { + getSuggestions(inputStr) { + const abstractFiles = this.app.vault.getAllLoadedFiles(); + const folders = []; + const lowerCaseInputStr = inputStr.toLowerCase(); + abstractFiles.forEach((folder) => { + if (folder instanceof import_obsidian6.TFolder && folder.path.toLowerCase().contains(lowerCaseInputStr)) { + folders.push(folder); + } + }); + return folders; + } + renderSuggestion(file, el) { + el.setText(file.path); + } + selectSuggestion(file) { + this.inputEl.value = file.path; + this.inputEl.trigger("input"); + this.close(); + } +}; + +// src/settings/settings.ts +var DEFAULT_SETTINGS = { + folder: "", + frontmatter: "" +}; +var BookSearchSettingTab = class extends import_obsidian7.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + display() { + const { containerEl } = this; + containerEl.empty(); + containerEl.createEl("h2", { text: "Book Search Settings" }); + new import_obsidian7.Setting(containerEl).setName("New file location").setDesc("New book notes will be placed here.").addSearch((cb) => { + new FolderSuggest(this.app, cb.inputEl); + cb.setPlaceholder("Example: folder1/folder2").setValue(this.plugin.settings.folder).onChange((new_folder) => { + this.plugin.settings.folder = new_folder; + this.plugin.saveSettings(); + }); + }); + new import_obsidian7.Setting(containerEl).setName("Insert frontmatter").setDesc("Text to insert into the YAML frontmatter").addTextArea((textArea) => { + const prevValue = this.plugin.settings.frontmatter; + textArea.setValue(prevValue).onChange((value) => __async(this, null, function* () { + const newValue = value; + this.plugin.settings.frontmatter = newValue; + yield this.plugin.saveSettings(); + })); + }); + } +}; + +// src/models/book.model.ts +var BookModel = class { + constructor(book) { + var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n; + this.title = (_a = book.title) != null ? _a : ""; + this.author = (_b = book.author) != null ? _b : ""; + this.category = (_c = book.category) != null ? _c : ""; + this.publisher = (_d = book.publisher) != null ? _d : ""; + this.publishDate = (_e = book.publishDate) != null ? _e : ""; + this.totalPage = (_f = book.totalPage) != null ? _f : ""; + this.coverUrl = (_g = book.coverUrl) != null ? _g : ""; + this.status = (_h = book.status) != null ? _h : ""; + this.startReadDate = (_i = book.startReadDate) != null ? _i : ""; + this.finishReadDate = (_j = book.finishReadDate) != null ? _j : ""; + this.myRate = (_k = book.myRate) != null ? _k : ""; + this.bookNote = (_l = book.bookNote) != null ? _l : ""; + this.isbn10 = (_m = book.isbn10) != null ? _m : ""; + this.isbn13 = (_n = book.isbn13) != null ? _n : ""; + } + toFrontMatter(addFrontMatter) { + var _a, _b; + const frontMater = __spreadValues({}, this); + for (const key in addFrontMatter) { + const val = (_b = (_a = addFrontMatter[key]) == null ? void 0 : _a.toString().trim()) != null ? _b : ""; + if (frontMater[key]) { + frontMater[key] = `${val} ${frontMater[key]}`; + } else { + frontMater[key] = val; + } + } + return Object.entries(frontMater).map(([key, val]) => { + var _a2; + return `${camelToSnakeCase(key)}: ${(_a2 = val == null ? void 0 : val.toString().trim()) != null ? _a2 : ""}`; + }).join("\n"); + } +}; + +// src/utils/utils.ts +function replaceIllegalFileNameCharactersInString(string) { + return string.replace(/[\\,#%&{}/*<>$":@.]*/g, ""); +} +function makeFileName(book) { + const titleForFileName = replaceIllegalFileNameCharactersInString(book.title); + if (!book.author) { + return titleForFileName; + } + const authorForFileName = replaceIllegalFileNameCharactersInString(book.author); + return `${titleForFileName} - ${authorForFileName}`; +} +function makeFrontMater(book, frontmatter) { + return new BookModel(book).toFrontMatter(frontmatter); +} +function camelToSnakeCase(str) { + return str.replace(/[A-Z]/g, (letter) => `_${letter == null ? void 0 : letter.toLowerCase()}`); +} +function parseFrontMatter(frontMatterString) { + if (!frontMatterString) + return {}; + return frontMatterString.split("\n").map((item) => item.split(":")).reduce((acc, [key, value]) => { + var _a; + return acc[key] = (_a = value == null ? void 0 : value.trim()) != null ? _a : "", acc; + }, {}); +} + +// src/main.ts +var BookSearchPlugin = class extends import_obsidian8.Plugin { + onload() { + return __async(this, null, function* () { + yield this.loadSettings(); + const ribbonIconEl = this.addRibbonIcon("book", "Create new book note", (evt) => this.createNewBookNote()); + ribbonIconEl.addClass("obsidian-book-search-plugin-ribbon-class"); + this.addCommand({ + id: "open-book-search-modal", + name: "Create new book note", + callback: () => this.createNewBookNote() + }); + this.addSettingTab(new BookSearchSettingTab(this.app, this)); + }); + } + createNewBookNote() { + return __async(this, null, function* () { + try { + const book = yield this.openBookSearchModal(); + const frontMatterFromInserts = parseFrontMatter(this.settings.frontmatter); + const frontMatter = makeFrontMater(book, frontMatterFromInserts); + const fileContent = `--- +${frontMatter} +--- +`; + const fileName = makeFileName(book); + const filePath = `${this.settings.folder.replace(/\/$/, "")}/${fileName}.md`; + const targetFile = yield this.app.vault.create(filePath, fileContent); + const activeLeaf = this.app.workspace.activeLeaf; + if (!activeLeaf) { + console.warn("No active leaf"); + return; + } + yield activeLeaf.openFile(targetFile, { state: { mode: "source" } }); + activeLeaf.setEphemeralState({ rename: "all" }); + yield new CursorJumper(this.app).jumpToNextCursorLocation(); + } catch (err) { + console.warn(err); + new import_obsidian8.Notice(err.toString()); + } + }); + } + openBookSearchModal() { + return __async(this, null, function* () { + return new Promise((resolve, reject) => { + new BookSearchModal(this.app, (error, results) => { + if (error) + return reject(error); + new BookSuggestModal(this.app, results, (error2, selectedBook) => { + if (error2) + return reject(error2); + resolve(selectedBook); + }).open(); + }).open(); + }); + }); + } + onunload() { + } + loadSettings() { + return __async(this, null, function* () { + this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); + }); + } + saveSettings() { + return __async(this, null, function* () { + yield this.saveData(this.settings); + }); + } +}; diff --git a/.obsidian/plugins/obsidian-book-search-plugin/manifest.json b/.obsidian/plugins/obsidian-book-search-plugin/manifest.json new file mode 100644 index 00000000..175c15da --- /dev/null +++ b/.obsidian/plugins/obsidian-book-search-plugin/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "obsidian-book-search-plugin", + "name": "Book Search", + "version": "0.0.4", + "minAppVersion": "0.12.0", + "description": "This is a sample plugin for Obsidian. This plugin demonstrates some of the capabilities of the Obsidian API.", + "author": "Obsidian", + "authorUrl": "https://obsidian.md", + "isDesktopOnly": false +} diff --git a/.obsidian/plugins/obsidian-book-search-plugin/styles.css b/.obsidian/plugins/obsidian-book-search-plugin/styles.css new file mode 100644 index 00000000..74b77f67 --- /dev/null +++ b/.obsidian/plugins/obsidian-book-search-plugin/styles.css @@ -0,0 +1 @@ +/* Sets all the text color to red! */ diff --git a/.obsidian/plugins/obsidian-commits/data.json b/.obsidian/plugins/obsidian-commits/data.json index 5cd2bd31..73026263 100644 --- a/.obsidian/plugins/obsidian-commits/data.json +++ b/.obsidian/plugins/obsidian-commits/data.json @@ -2232,7 +2232,7 @@ "00.03 News/Babies and chicks help solve one of psychology’s oldest puzzles.md": { "size": 13415, "tags": 1, - "links": 1 + "links": 2 }, "03.03 Food & Wine/Brown Butter Farro with Mushrooms & Burrata - The Original Dish.md": { "size": 3274, @@ -2452,7 +2452,7 @@ "00.03 News/TikTok Star Ava Majury Discovers the Dark Side of Fame.md": { "size": 17946, "tags": 2, - "links": 1 + "links": 2 }, "00.03 News/Will the Bush Dynasty Die With George P. Bush.md": { "size": 34634, @@ -2907,7 +2907,7 @@ "00.03 News/The Miseducation of Maria Montessori.md": { "size": 13627, "tags": 3, - "links": 1 + "links": 2 }, "00.01 Admin/Calendars/2022-03-26 Fiancailles Eloi.md": { "size": 340, @@ -3014,11 +3014,6 @@ "tags": 3, "links": 2 }, - "00.03 News/The Man Behind Ethereum Is Worried About Crypto's Future 1.md": { - "size": 33902, - "tags": 3, - "links": 1 - }, "00.04 IT/My guiding principles after 20 years of programming.md": { "size": 8496, "tags": 0, @@ -3052,7 +3047,7 @@ "00.03 News/You Don’t Know Much About Jay Penske. And He’s Fine With That..md": { "size": 21267, "tags": 3, - "links": 1 + "links": 2 }, "00.03 News/The death spiral of an American family.md": { "size": 22546, @@ -3557,7 +3552,7 @@ "00.03 News/The Unravelling of an Expert on Serial Killers.md": { "size": 49427, "tags": 3, - "links": 1 + "links": 2 }, "00.03 News/H-Town United An Unlikely Soccer Power Rises in Texas.md": { "size": 56873, @@ -3580,9 +3575,9 @@ "links": 7 }, "00.01 Admin/Calendars/2022-04-24 2nd tour élections présidentielles.md": { - "size": 171, + "size": 192, "tags": 0, - "links": 1 + "links": 2 }, "03.03 Food & Wine/Big Shells With Spicy Lamb Sausage and Pistachios.md": { "size": 4386, @@ -3708,14 +3703,34 @@ "size": 1011, "tags": 0, "links": 4 + }, + "00.01 Admin/Calendars/2022-04-23.md": { + "size": 1009, + "tags": 0, + "links": 4 + }, + "00.03 News/Jeffrey Epstein, a Rare Cello and an Enduring Mystery.md": { + "size": 21091, + "tags": 3, + "links": 1 + }, + "00.03 News/“The Eye in the Sea” camera observes elusive deep sea animals.md": { + "size": 17391, + "tags": 4, + "links": 1 + }, + "00.01 Admin/Calendars/2022-04-24.md": { + "size": 1009, + "tags": 0, + "links": 4 } }, "commitTypes": { "/": { - "Refactor": 503, - "Create": 400, - "Link": 803, - "Expand": 385 + "Refactor": 507, + "Create": 405, + "Link": 815, + "Expand": 388 } }, "dailyCommits": { @@ -3728,21 +3743,21 @@ "5": 6, "6": 17, "7": 138, - "8": 213, + "8": 217, "9": 172, - "10": 91, + "10": 93, "11": 77, - "12": 101, + "12": 103, "13": 173, - "14": 123, - "15": 78, + "14": 125, + "15": 80, "16": 62, "17": 88, - "18": 241, + "18": 251, "19": 71, "20": 92, "21": 55, - "22": 158, + "22": 160, "23": 42 } }, @@ -3754,12 +3769,15 @@ "Thu": 279, "Fri": 174, "Sat": 0, - "Sun": 940 + "Sun": 964 } }, "recentCommits": { "/": { "Expanded": [ + " 2022-04-24 ", + " 2022-04-24 2nd tour élections présidentielles ", + " 2022-04-23 ", " 2022-04-21 ", " 2022-04-20 ", " 2022-04-19 ", @@ -3807,12 +3825,14 @@ " Zint ", " 2022-04-11 ", " 2022-04-10 ", - " 2022-04-07 Diner Vivi ", - " 2022-04-10 1er tour Présidentielle ", - " 2022-04-09 Garde-meuble Granny ", - " 2022-04-10 " + " 2022-04-07 Diner Vivi " ], "Created": [ + " 2022-04-24 ", + " “The Eye in the Sea” camera observes elusive deep sea animals ", + " Jeffrey Epstein, a Rare Cello and an Enduring Mystery ", + " Jeffrey Epstein, a Rare Cello and an Enduring Mystery ", + " 2022-04-23 ", " 2022-04-22 ", " 2022-04-21 ", " Morning Buns ", @@ -3858,14 +3878,11 @@ " 2022-04-10 ", " 2022-04-09 Garde-meuble Granny ", " 2022-04-08 Dej Ag ", - " 2022-04-09 ", - " 2022-04-08 ", - " 2022-04-07 ", - " 2022-04-06 ", - " Kerouac at 100 - The American Scholar ", - " 2022-04-05 " + " 2022-04-09 " ], "Renamed": [ + " “The Eye in the Sea” camera observes elusive deep sea animals ", + " Jeffrey Epstein, a Rare Cello and an Enduring Mystery ", " The History of the Varsity Jacket, From Harvard to Hip-Hop ", " How an Ivy League School Turned Against a Student ", " Cantinetta Antinori ", @@ -3914,11 +3931,11 @@ " 2022-02-16 ", " 2022-02-15 ", " 2022-02-14 ", - " 2022-02-13 ", - " 2022-02-12 ", - " 2022-02-11 " + " 2022-02-13 " ], "Tagged": [ + " Jeffrey Epstein, a Rare Cello and an Enduring Mystery ", + " “The Eye in the Sea” camera observes elusive deep sea animals ", " The History of the Varsity Jacket, From Harvard to Hip-Hop ", " Thai Basil Sauce Noodles with Jammy Eggs ", " How an Ivy League School Turned Against a Student ", @@ -3967,9 +3984,7 @@ " Ego is the Enemy The Legend of Genghis Khan - Farnam Street ", " Configuring Telegram bots ", " Configuring Prometheus ", - " Test task ", - " Configuring Fail2ban ", - " What’s in a Black name 400 years of context. " + " Test task " ], "Refactored": [ " @Main Dashboard ", @@ -4007,6 +4022,8 @@ " Big Shells With Spicy Lamb Sausage and Pistachios " ], "Deleted": [ + " Jeffrey Epstein, a Rare Cello and an Enduring Mystery ", + " The Man Behind Ethereum Is Worried About Crypto's Future 1 ", " Morning Buns ", " Bibimbap ", " Email alias ", @@ -4055,11 +4072,19 @@ " How Telegram Became the Anti-Facebook ", " Mountain Men & Holy Wars ", " Kimchi-Lentil Stew With Poached Eggs ", - " Tous les hommes n'habitent pas le monde de la m�me fa�on - Jean-Paul Dubois ", - " null ", - " () " + " Tous les hommes n'habitent pas le monde de la m�me fa�on - Jean-Paul Dubois " ], "Linked": [ + " 2022-04-24 ", + " The Miseducation of Maria Montessori ", + " Babies and chicks help solve one of psychology’s oldest puzzles ", + " Jeffrey Epstein, a Rare Cello and an Enduring Mystery ", + " “The Eye in the Sea” camera observes elusive deep sea animals ", + " TikTok Star Ava Majury Discovers the Dark Side of Fame ", + " You Don’t Know Much About Jay Penske. And He’s Fine With That. ", + " The Unravelling of an Expert on Serial Killers ", + " 2022-04-24 2nd tour élections présidentielles ", + " 2022-04-23 ", " 2022-04-22 ", " 2022-04-21 ", " 2022-04-20 ", @@ -4100,17 +4125,7 @@ " 2022-04-14 ", " The Importance of Leading With Empathy (And How To Do It) ", " Tortilla de Harina A Moon of Mystery ", - " The twisted mind of a serial romance scammer ", - " Meet the DIY Duo Behind the Amazon Labor Union’s Guerrilla Bid to Make History ", - " Kerouac at 100 - The American Scholar ", - " 2022-04-13 ", - " 2022-04-12 ", - " WiFI - ZH ", - " Mobile - FR ", - " Mobile - UK ", - " Mobile - CH ", - " Geo - ZH ", - " Email - tuta " + " The twisted mind of a serial romance scammer " ], "Removed Tags from": [ " Le Miel de Paris ", diff --git a/.obsidian/plugins/obsidian-map-view/main.js b/.obsidian/plugins/obsidian-map-view/main.js index 2f75da1f..491e2f99 100644 --- a/.obsidian/plugins/obsidian-map-view/main.js +++ b/.obsidian/plugins/obsidian-map-view/main.js @@ -60,6 +60,7 @@ const MAP_VIEW_NAME = 'map'; const RIBBON_ICON = ''; const SEARCH_RESULT_MARKER = { prefix: 'fas', icon: 'fa-search', markerColor: 'blue' }; const MAX_CLUSTER_PREVIEW_ICONS = 4; +const HISTORY_SAVE_ZOOM_DIFF = 2; const LAT_LIMITS = [-90, 90]; const LNG_LIMITS = [-180, 180]; @@ -17406,7 +17407,8 @@ const DEFAULT_SETTINGS = { searchProvider: 'osm', mapSources: [{ name: 'CartoDB', urlLight: 'https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png', preset: true }], // mapSources: [{name: 'OpenStreetMap', urlLight: consts.TILES_URL_OPENSTREETMAP}], - chosenMapMode: 'auto' + chosenMapMode: 'auto', + saveHistory: true }; function convertLegacyMarkerIcons(settings) { if (settings.markerIcons) { @@ -18331,23 +18333,53 @@ class MapView extends obsidian.ItemView { this.plugin = plugin; // Create the default state by the configuration this.defaultState = this.settings.defaultState; - this.setState = (state, result) => __awaiter(this, void 0, void 0, function* () { - yield this.setViewState(state, true, false); - if (this.display.controls) - this.display.controls.tryToGuessPreset(); - }); - this.getState = () => { - return this.state; - }; // Listen to file changes so we can update markers accordingly this.app.vault.on('delete', file => this.updateMarkersWithRelationToFile(file.path, null, true)); - this.app.vault.on('rename', (file, oldPath) => this.updateMarkersWithRelationToFile(oldPath, file, true)); this.app.metadataCache.on('changed', file => this.updateMarkersWithRelationToFile(file.path, file, false)); + // On rename we don't need to do anything because the markers hold a TFile, and the TFile object doesn't change + // when the file name changes. Only its internal path field changes accordingly. + // this.app.vault.on('rename', (file, oldPath) => this.updateMarkersWithRelationToFile(oldPath, file, true)); this.app.workspace.on('css-change', () => { console.log('Map view: map refresh due to CSS change'); this.refreshMap(); }); } + setState(state, result) { + return __awaiter(this, void 0, void 0, function* () { + if (this.shouldSaveToHistory(state)) { + result.history = true; + this.lastSavedState = Object.assign({}, state); + } + yield this.setViewState(state, true, false); + if (this.display.controls) + this.display.controls.tryToGuessPreset(); + }); + } + getState() { + return this.state; + } + /** Decides and returns true if the given state change, compared to the last saved state, is substantial + * enough to be saved as an Obsidian history state */ + shouldSaveToHistory(newState) { + if (!this.settings.saveHistory) + return false; + if (!this.lastSavedState) + return true; + if (newState.forceHistorySave) { + newState.forceHistorySave = false; + return true; + } + // If the zoom changed by HISTORY_SAVE_ZOOM_DIFF -- save the history + if (Math.abs(newState.mapZoom - this.lastSavedState.mapZoom) >= HISTORY_SAVE_ZOOM_DIFF) + return true; + // If the previous center is no longer visible -- save the history + // (this is partially cheating because we use the actual map and not the state object) + if (this.lastSavedState.mapCenter && !this.display.map.getBounds().contains(this.lastSavedState.mapCenter)) + return true; + if (newState.tags != this.lastSavedState.tags || newState.chosenMapSource != this.lastSavedState.chosenMapSource) + return true; + return false; + } getViewType() { return 'map'; } getDisplayText() { return 'Interactive Map View'; } isDarkMode(settings) { @@ -18489,12 +18521,17 @@ class MapView extends obsidian.ItemView { this.display.map.on('zoomend', (event) => { var _a, _b; this.state.mapZoom = this.display.map.getZoom(); + this.state.mapCenter = this.display.map.getCenter(); (_b = (_a = this.display) === null || _a === void 0 ? void 0 : _a.controls) === null || _b === void 0 ? void 0 : _b.invalidateActivePreset(); + const state = this.leaf.getViewState(); + this.leaf.setViewState(state); }); this.display.map.on('moveend', (event) => { var _a, _b; this.state.mapCenter = this.display.map.getCenter(); (_b = (_a = this.display) === null || _a === void 0 ? void 0 : _a.controls) === null || _b === void 0 ? void 0 : _b.invalidateActivePreset(); + const state = this.leaf.getViewState(); + this.leaf.setViewState(state); }); if (this.settings.showClusterPreview) { this.display.clusterGroup.on('clustermouseover', cluster => { @@ -18514,6 +18551,12 @@ class MapView extends obsidian.ItemView { this.display.clusterGroup.on('clustermouseout', cluster => { cluster.propagatedFrom.closePopup(); }); + this.display.clusterGroup.on('clusterclick', cluster => { + const state = this.leaf.getViewState(); + // After a cluster click always save the history, the user expects 'back' to really go back + state.state.forceHistorySave = true; + this.leaf.setViewState(state); + }); } // Build the map marker right-click context menu this.display.map.on('contextmenu', (event) => __awaiter(this, void 0, void 0, function* () { @@ -18579,8 +18622,7 @@ class MapView extends obsidian.ItemView { // Saying it again: do not use 'await' below this line! this.state = state; this.updateMapMarkers(newMarkers); - if (this.state.mapCenter && this.state.mapZoom) - this.display.map.setView(this.state.mapCenter, this.state.mapZoom); + this.display.map.setView(this.state.mapCenter, this.state.mapZoom); if (this.settings.debug) console.timeEnd('updateMarkersToState'); }); @@ -18934,6 +18976,17 @@ class SettingsTab extends obsidian.PluginSettingTab { yield this.plugin.saveSettings(); })); }); + new obsidian.Setting(containerEl) + .setName('Save back/forward history') + .setDesc("While making changes to the map, save the history to be browsable through Obsidian back/forward buttons.") + .addToggle(component => { + component + .setValue(this.plugin.settings.saveHistory) + .onChange((value) => __awaiter(this, void 0, void 0, function* () { + this.plugin.settings.saveHistory = value; + yield this.plugin.saveSettings(); + })); + }); new obsidian.Setting(containerEl) .setHeading().setName('Map Sources') .setDesc('Change and switch between sources for map tiles. An optional dark mode URL can be defined for each source. If no such URL is defined and dark mode is used, the map colors are reverted. See the documentation for more details.'); diff --git a/.obsidian/plugins/obsidian-map-view/manifest.json b/.obsidian/plugins/obsidian-map-view/manifest.json index 0c17952d..864cd2fd 100644 --- a/.obsidian/plugins/obsidian-map-view/manifest.json +++ b/.obsidian/plugins/obsidian-map-view/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-map-view", "name": "Map View", - "version": "1.4.0", + "version": "1.5.0", "minAppVersion": "0.12.10", "description": "An interactive map view.", "isDesktopOnly": false diff --git a/.obsidian/plugins/obsidian-memos/main.js b/.obsidian/plugins/obsidian-memos/main.js index 3498c018..41cf261c 100644 --- a/.obsidian/plugins/obsidian-memos/main.js +++ b/.obsidian/plugins/obsidian-memos/main.js @@ -29,21 +29,6 @@ function _interopDefaultLegacy(e) { var require$$0__default = /* @__PURE__ */ _interopDefaultLegacy(require$$0); const MEMOS_VIEW_TYPE = "memos_view"; var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; -function getAugmentedNamespace(n2) { - if (n2.__esModule) - return n2; - var a = Object.defineProperty({}, "__esModule", { value: true }); - Object.keys(n2).forEach(function(k) { - var d = Object.getOwnPropertyDescriptor(n2, k); - Object.defineProperty(a, k, d.get ? d : { - enumerable: true, - get: function() { - return n2[k]; - } - }); - }); - return a; -} var _react_17_0_2_react = { exports: {} }; var react_production_min = {}; /* @@ -126,7 +111,7 @@ var l = _objectAssign_4_1_1_objectAssign, n$1 = 60103, p$1 = 60106; react_production_min.Fragment = 60107; react_production_min.StrictMode = 60108; react_production_min.Profiler = 60114; -var q$1 = 60109, r$1 = 60110, t$1 = 60112; +var q$1 = 60109, r$1 = 60110, t$2 = 60112; react_production_min.Suspense = 60113; var u = 60115, v = 60116; if (typeof Symbol === "function" && Symbol.for) { @@ -138,7 +123,7 @@ if (typeof Symbol === "function" && Symbol.for) { react_production_min.Profiler = w("react.profiler"); q$1 = w("react.provider"); r$1 = w("react.context"); - t$1 = w("react.forward_ref"); + t$2 = w("react.forward_ref"); react_production_min.Suspense = w("react.suspense"); u = w("react.memo"); v = w("react.lazy"); @@ -364,7 +349,7 @@ react_production_min.createRef = function() { return { current: null }; }; react_production_min.forwardRef = function(a) { - return { $$typeof: t$1, render: a }; + return { $$typeof: t$2, render: a }; }; react_production_min.isValidElement = L; react_production_min.lazy = function(a) { @@ -406,7 +391,7 @@ react_production_min.version = "17.0.2"; { _react_17_0_2_react.exports = react_production_min; } -var React$1 = _react_17_0_2_react.exports; +var React = _react_17_0_2_react.exports; var _reactDom_17_0_2_reactDom = { exports: {} }; var reactDom_production_min = {}; var _scheduler_0_20_2_scheduler = { exports: {} }; @@ -711,7 +696,7 @@ function y(a) { } if (!aa) throw Error(y(227)); -var ba = new Set(), ca = {}; +var ba = /* @__PURE__ */ new Set(), ca = {}; function da$1(a, b) { ea(a, b); ea(a + "Capture", b); @@ -1571,7 +1556,7 @@ function dc(a, b) { } return false; } -var ec, fc, gc, hc, ic = false, jc = [], kc = null, lc = null, mc = null, nc = new Map(), oc = new Map(), pc = [], qc = "mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" "); +var ec, fc, gc, hc, ic = false, jc = [], kc = null, lc = null, mc = null, nc = /* @__PURE__ */ new Map(), oc = /* @__PURE__ */ new Map(), pc = [], qc = "mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" "); function rc(a, b, c, d, e) { return { blockedOn: a, domEventName: b, eventSystemFlags: c | 16, nativeEvent: e, targetContainers: [d] }; } @@ -1728,7 +1713,7 @@ function Hc(a) { return Fc[a] = b[c]; return a; } -var Ic = Hc("animationend"), Jc = Hc("animationiteration"), Kc = Hc("animationstart"), Lc = Hc("transitionend"), Mc = new Map(), Nc = new Map(), Oc = [ +var Ic = Hc("animationend"), Jc = Hc("animationiteration"), Kc = Hc("animationstart"), Lc = Hc("transitionend"), Mc = /* @__PURE__ */ new Map(), Nc = /* @__PURE__ */ new Map(), Oc = [ "abort", "abort", Ic, @@ -1955,7 +1940,7 @@ function gd(a, b, c, d) { (Kb = f2) || Mb(); } } -function id$2(a, b, c, d) { +function id$1(a, b, c, d) { ed(dd, hd.bind(null, a, b, c, d)); } function hd(a, b, c, d) { @@ -2436,7 +2421,7 @@ function af(a, b, c, d) { e = gd; break; case 1: - e = id$2; + e = id$1; break; default: e = hd; @@ -2818,7 +2803,7 @@ function Db(a) { } function $e(a) { var b = a[yf]; - b === void 0 && (b = a[yf] = new Set()); + b === void 0 && (b = a[yf] = /* @__PURE__ */ new Set()); return b; } var zf = [], Af = -1; @@ -3271,7 +3256,7 @@ function Sg(a) { return null; } function d(a2, b2) { - for (a2 = new Map(); b2 !== null; ) + for (a2 = /* @__PURE__ */ new Map(); b2 !== null; ) b2.key !== null ? a2.set(b2.key, b2) : a2.set(b2.index, b2), b2 = b2.sibling; return a2; } @@ -4856,7 +4841,7 @@ function Si(a, b, c) { } var f2 = a.stateNode; f2 !== null && typeof f2.componentDidCatch === "function" && (c.callback = function() { - typeof d !== "function" && (Ti === null ? Ti = new Set([this]) : Ti.add(this), Ni(a, b)); + typeof d !== "function" && (Ti === null ? Ti = /* @__PURE__ */ new Set([this]) : Ti.add(this), Ni(a, b)); var c2 = b.stack; this.componentDidCatch(b.value, { componentStack: c2 !== null ? c2 : "" }); }); @@ -5334,7 +5319,7 @@ function Jg(a, b, c) { $c(a, b, c); a === U && (Hi |= b, V === 4 && Ii(a, W)); var d = eg(); - b === 1 ? (X & 8) !== 0 && (X & 48) === 0 ? Lj(a) : (Mj(a, c), X === 0 && (wj(), ig())) : ((X & 4) === 0 || d !== 98 && d !== 99 || (Cj === null ? Cj = new Set([a]) : Cj.add(a)), Mj(a, c)); + b === 1 ? (X & 8) !== 0 && (X & 48) === 0 ? Lj(a) : (Mj(a, c), X === 0 && (wj(), ig())) : ((X & 4) === 0 || d !== 98 && d !== 99 || (Cj === null ? Cj = /* @__PURE__ */ new Set([a]) : Cj.add(a)), Mj(a, c)); vj = a; } function Kj(a, b) { @@ -5632,7 +5617,7 @@ function Sj(a, b) { if (C2) { var z2 = p2.updateQueue; if (z2 === null) { - var u2 = new Set(); + var u2 = /* @__PURE__ */ new Set(); u2.add(l2); p2.updateQueue = u2; } else @@ -5655,7 +5640,7 @@ function Sj(a, b) { k = void 0; h2 = b; var q2 = f2.pingCache; - q2 === null ? (q2 = f2.pingCache = new Oi(), k = new Set(), q2.set(l2, k)) : (k = q2.get(l2), k === void 0 && (k = new Set(), q2.set(l2, k))); + q2 === null ? (q2 = f2.pingCache = new Oi(), k = /* @__PURE__ */ new Set(), q2.set(l2, k)) : (k = q2.get(l2), k === void 0 && (k = /* @__PURE__ */ new Set(), q2.set(l2, k))); if (!k.has(h2)) { k.add(h2); var v2 = Yj.bind(null, f2, l2, h2); @@ -6837,7 +6822,66 @@ function checkDCE() { checkDCE(); _reactDom_17_0_2_reactDom.exports = reactDom_production_min; } -var ReactDOM$1 = _reactDom_17_0_2_reactDom.exports; +var ReactDOM = _reactDom_17_0_2_reactDom.exports; +var app$1 = ""; +var jsxRuntime = { exports: {} }; +var reactJsxRuntime_production_min = {}; +/** @license React v17.0.2 + * react-jsx-runtime.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +var f = _react_17_0_2_react.exports, g = 60103; +reactJsxRuntime_production_min.Fragment = 60107; +if (typeof Symbol === "function" && Symbol.for) { + var h = Symbol.for; + g = h("react.element"); + reactJsxRuntime_production_min.Fragment = h("react.fragment"); +} +var m = f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, n = Object.prototype.hasOwnProperty, p = { key: true, ref: true, __self: true, __source: true }; +function q(c, a, k) { + var b, d = {}, e = null, l2 = null; + k !== void 0 && (e = "" + k); + a.key !== void 0 && (e = "" + a.key); + a.ref !== void 0 && (l2 = a.ref); + for (b in a) + n.call(a, b) && !p.hasOwnProperty(b) && (d[b] = a[b]); + if (c && c.defaultProps) + for (b in a = c.defaultProps, a) + d[b] === void 0 && (d[b] = a[b]); + return { $$typeof: g, type: c, key: e, ref: l2, props: d, _owner: m.current }; +} +reactJsxRuntime_production_min.jsx = q; +reactJsxRuntime_production_min.jsxs = q; +{ + jsxRuntime.exports = reactJsxRuntime_production_min; +} +const jsx = jsxRuntime.exports.jsx; +const jsxs = jsxRuntime.exports.jsxs; +const Fragment = jsxRuntime.exports.Fragment; +const Provider = (props) => { + const { + children, + store, + context: Context + } = props; + const [appState, setAppState] = _react_17_0_2_react.exports.useState(store.getState()); + _react_17_0_2_react.exports.useEffect(() => { + const unsubscribe = store.subscribe((ns) => { + setAppState(ns); + }); + return () => { + unsubscribe(); + }; + }, []); + return /* @__PURE__ */ jsx(Context.Provider, { + value: appState, + children + }); +}; function combineReducers(reducers) { const reducerKeys = Object.keys(reducers); const finalReducersObj = {}; @@ -6908,6 +6952,14 @@ function reducer$5(state, action) { editMemoId: action.payload.editMemoId }); } + case "SET_COMMENT_MEMO_ID": { + if (action.payload.commentMemoId === state.commentMemoId) { + return state; + } + return __spreadProps(__spreadValues({}, state), { + commentMemoId: action.payload.commentMemoId + }); + } case "SET_MOBILE_VIEW": { if (action.payload.isMobileView === state.isMobileView) { return state; @@ -6916,6 +6968,14 @@ function reducer$5(state, action) { isMobileView: action.payload.isMobileView }); } + case "SET_CHANGED_BY_MEMOS": { + if (action.payload.changedByMemos === state.changedByMemos) { + return state; + } + return __spreadProps(__spreadValues({}, state), { + changedByMemos: action.payload.changedByMemos + }); + } case "SET_SHOW_SIDEBAR_IN_MOBILE_VIEW": { if (action.payload.showSiderbarInMobileView === state.showSiderbarInMobileView) { return state; @@ -6935,12 +6995,14 @@ function reducer$5(state, action) { const defaultState$5 = { markMemoId: "", editMemoId: "", + commentMemoId: "", shouldSplitMemoWord: true, shouldHideImageUrl: true, shouldUseMarkdownParser: true, useTinyUndoHistoryCache: false, isMobileView: false, - showSiderbarInMobileView: false + showSiderbarInMobileView: false, + changedByMemos: false }; function reducer$4(state, action) { switch (action.type) { @@ -7034,703 +7096,408 @@ const defaultState$4 = { filter: "" } }; -var utils; -(function(utils2) { - function getNowTimeStamp() { - return parseInt(require$$0.moment().format("x")); - } - utils2.getNowTimeStamp = getNowTimeStamp; - function getOSVersion() { - const appVersion = navigator.userAgent; - let detectedOS = "Unknown"; - if (appVersion.indexOf("Win") != -1) { - detectedOS = "Windows"; - } else if (appVersion.indexOf("Mac") != -1) { - detectedOS = "MacOS"; - } else if (appVersion.indexOf("Linux") != -1) { - detectedOS = "Linux"; +var main$1 = {}; +Object.defineProperty(main$1, "__esModule", { value: true }); +var obsidian = require$$0__default["default"]; +const DEFAULT_DAILY_NOTE_FORMAT = "YYYY-MM-DD"; +const DEFAULT_WEEKLY_NOTE_FORMAT = "gggg-[W]ww"; +const DEFAULT_MONTHLY_NOTE_FORMAT = "YYYY-MM"; +const DEFAULT_QUARTERLY_NOTE_FORMAT = "YYYY-[Q]Q"; +const DEFAULT_YEARLY_NOTE_FORMAT = "YYYY"; +function shouldUsePeriodicNotesSettings(periodicity) { + var _a, _b; + const periodicNotes = window.app.plugins.getPlugin("periodic-notes"); + return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a[periodicity]) == null ? void 0 : _b.enabled); +} +function getDailyNoteSettings() { + var _a, _b, _c, _d; + try { + const { internalPlugins, plugins } = window.app; + if (shouldUsePeriodicNotesSettings("daily")) { + const { format: format2, folder: folder2, template: template2 } = ((_b = (_a = plugins.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.daily) || {}; + return { + format: format2 || DEFAULT_DAILY_NOTE_FORMAT, + folder: (folder2 == null ? void 0 : folder2.trim()) || "", + template: (template2 == null ? void 0 : template2.trim()) || "" + }; } - return detectedOS; + const { folder, format, template } = ((_d = (_c = internalPlugins.getPluginById("daily-notes")) == null ? void 0 : _c.instance) == null ? void 0 : _d.options) || {}; + return { + format: format || DEFAULT_DAILY_NOTE_FORMAT, + folder: (folder == null ? void 0 : folder.trim()) || "", + template: (template == null ? void 0 : template.trim()) || "" + }; + } catch (err) { + console.info("No custom daily note settings found!", err); } - utils2.getOSVersion = getOSVersion; - function getTimeStampByDate(t2) { - if (typeof t2 === "string") { - t2 = t2.replaceAll("-", "/"); +} +function getWeeklyNoteSettings() { + var _a, _b, _c, _d, _e, _f, _g; + try { + const pluginManager = window.app.plugins; + const calendarSettings = (_a = pluginManager.getPlugin("calendar")) == null ? void 0 : _a.options; + const periodicNotesSettings = (_c = (_b = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _b.settings) == null ? void 0 : _c.weekly; + if (shouldUsePeriodicNotesSettings("weekly")) { + return { + format: periodicNotesSettings.format || DEFAULT_WEEKLY_NOTE_FORMAT, + folder: ((_d = periodicNotesSettings.folder) == null ? void 0 : _d.trim()) || "", + template: ((_e = periodicNotesSettings.template) == null ? void 0 : _e.trim()) || "" + }; } - return new Date(t2).getTime(); + const settings = calendarSettings || {}; + return { + format: settings.weeklyNoteFormat || DEFAULT_WEEKLY_NOTE_FORMAT, + folder: ((_f = settings.weeklyNoteFolder) == null ? void 0 : _f.trim()) || "", + template: ((_g = settings.weeklyNoteTemplate) == null ? void 0 : _g.trim()) || "" + }; + } catch (err) { + console.info("No custom weekly note settings found!", err); } - utils2.getTimeStampByDate = getTimeStampByDate; - function getDateStampByDate(t2) { - const d = new Date(getTimeStampByDate(t2)); - return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime(); +} +function getMonthlyNoteSettings() { + var _a, _b, _c, _d; + const pluginManager = window.app.plugins; + try { + const settings = shouldUsePeriodicNotesSettings("monthly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.monthly) || {}; + return { + format: settings.format || DEFAULT_MONTHLY_NOTE_FORMAT, + folder: ((_c = settings.folder) == null ? void 0 : _c.trim()) || "", + template: ((_d = settings.template) == null ? void 0 : _d.trim()) || "" + }; + } catch (err) { + console.info("No custom monthly note settings found!", err); } - utils2.getDateStampByDate = getDateStampByDate; - function getDateString(t2) { - const d = new Date(getTimeStampByDate(t2)); - const year = d.getFullYear(); - const month = d.getMonth() + 1; - const date = d.getDate(); - return `${year}/${month}/${date}`; +} +function getQuarterlyNoteSettings() { + var _a, _b, _c, _d; + const pluginManager = window.app.plugins; + try { + const settings = shouldUsePeriodicNotesSettings("quarterly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.quarterly) || {}; + return { + format: settings.format || DEFAULT_QUARTERLY_NOTE_FORMAT, + folder: ((_c = settings.folder) == null ? void 0 : _c.trim()) || "", + template: ((_d = settings.template) == null ? void 0 : _d.trim()) || "" + }; + } catch (err) { + console.info("No custom quarterly note settings found!", err); } - utils2.getDateString = getDateString; - function getTimeString(t2) { - const d = new Date(getTimeStampByDate(t2)); - const hours = d.getHours(); - const mins = d.getMinutes(); - const hoursStr = hours < 10 ? "0" + hours : hours; - const minsStr = mins < 10 ? "0" + mins : mins; - return `${hoursStr}:${minsStr}`; +} +function getYearlyNoteSettings() { + var _a, _b, _c, _d; + const pluginManager = window.app.plugins; + try { + const settings = shouldUsePeriodicNotesSettings("yearly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.yearly) || {}; + return { + format: settings.format || DEFAULT_YEARLY_NOTE_FORMAT, + folder: ((_c = settings.folder) == null ? void 0 : _c.trim()) || "", + template: ((_d = settings.template) == null ? void 0 : _d.trim()) || "" + }; + } catch (err) { + console.info("No custom yearly note settings found!", err); } - utils2.getTimeString = getTimeString; - function getDateTimeString(t2) { - const d = new Date(getTimeStampByDate(t2)); - const year = d.getFullYear(); - const month = d.getMonth() + 1; - const date = d.getDate(); - const hours = d.getHours(); - const mins = d.getMinutes(); - const monthStr = month < 10 ? "0" + month : month; - const dateStr = date < 10 ? "0" + date : date; - const hoursStr = hours < 10 ? "0" + hours : hours; - const minsStr = mins < 10 ? "0" + mins : mins; - const secsStr = "00"; - return `${year}/${monthStr}/${dateStr} ${hoursStr}:${minsStr}:${secsStr}`; +} +function join(...partSegments) { + let parts = []; + for (let i = 0, l2 = partSegments.length; i < l2; i++) { + parts = parts.concat(partSegments[i].split("/")); } - utils2.getDateTimeString = getDateTimeString; - function dedupe(data) { - return Array.from(new Set(data)); + const newParts = []; + for (let i = 0, l2 = parts.length; i < l2; i++) { + const part = parts[i]; + if (!part || part === ".") + continue; + else + newParts.push(part); } - utils2.dedupe = dedupe; - function dedupeObjectWithId(data) { - const idSet = new Set(); - const result = []; - for (const d of data) { - if (!idSet.has(d.id)) { - idSet.add(d.id); - result.push(d); - } + if (parts[0] === "") + newParts.unshift(""); + return newParts.join("/"); +} +function basename(fullPath) { + let base = fullPath.substring(fullPath.lastIndexOf("/") + 1); + if (base.lastIndexOf(".") != -1) + base = base.substring(0, base.lastIndexOf(".")); + return base; +} +async function ensureFolderExists(path) { + const dirs = path.replace(/\\/g, "/").split("/"); + dirs.pop(); + if (dirs.length) { + const dir = join(...dirs); + if (!window.app.vault.getAbstractFileByPath(dir)) { + await window.app.vault.createFolder(dir); } - return result; } - utils2.dedupeObjectWithId = dedupeObjectWithId; - function debounce2(fn2, delay3) { - let timer = null; - return () => { - if (timer) { - clearTimeout(timer); - timer = setTimeout(fn2, delay3); - } else { - timer = setTimeout(fn2, delay3); - } - }; +} +async function getNotePath(directory, filename) { + if (!filename.endsWith(".md")) { + filename += ".md"; } - utils2.debounce = debounce2; - function throttle(fn2, delay3) { - let valid = true; - return () => { - if (!valid) { - return false; - } - valid = false; - setTimeout(() => { - fn2(); - valid = true; - }, delay3); - }; + const path = obsidian.normalizePath(join(directory, filename)); + await ensureFolderExists(path); + return path; +} +async function getTemplateInfo(template) { + const { metadataCache, vault } = window.app; + const templatePath = obsidian.normalizePath(template); + if (templatePath === "/") { + return Promise.resolve(["", null]); } - utils2.throttle = throttle; - function transformObjectToParamsString(object) { - const params = []; - const keys = Object.keys(object).sort(); - for (const key of keys) { - const val = object[key]; - if (val) { - if (typeof val === "object") { - params.push(...transformObjectToParamsString(val).split("&")); - } else { - params.push(`${key}=${val}`); - } - } - } - return params.join("&"); + try { + const templateFile = metadataCache.getFirstLinkpathDest(templatePath, ""); + const contents = await vault.cachedRead(templateFile); + const IFoldInfo = window.app.foldManager.load(templateFile); + return [contents, IFoldInfo]; + } catch (err) { + console.error(`Failed to read the daily note template '${templatePath}'`, err); + new obsidian.Notice("Failed to read the daily note template"); + return ["", null]; } - utils2.transformObjectToParamsString = transformObjectToParamsString; - function transformParamsStringToObject(paramsString) { - const object = {}; - const params = paramsString.split("&"); - for (const p2 of params) { - const [key, val] = p2.split("="); - if (key && val) { - object[key] = val; - } - } - return object; +} +function getDateUID(date, granularity = "day") { + const ts = date.clone().startOf(granularity).format(); + return `${granularity}-${ts}`; +} +function removeEscapedCharacters(format) { + return format.replace(/\[[^\]]*\]/g, ""); +} +function isFormatAmbiguous(format, granularity) { + if (granularity === "week") { + const cleanFormat = removeEscapedCharacters(format); + return /w{1,2}/i.test(cleanFormat) && (/M{1,4}/.test(cleanFormat) || /D{1,4}/.test(cleanFormat)); } - utils2.transformParamsStringToObject = transformParamsStringToObject; - function filterObjectNullKeys(object) { - if (!object) { - return {}; - } - const finalObject = {}; - const keys = Object.keys(object).sort(); - for (const key of keys) { - const val = object[key]; - if (typeof val === "object") { - const temp = filterObjectNullKeys(JSON.parse(JSON.stringify(val))); - if (temp && Object.keys(temp).length > 0) { - finalObject[key] = temp; - } - } else { - if (val) { - finalObject[key] = val; - } - } - } - return finalObject; + return false; +} +function getDateFromFile(file, granularity) { + return getDateFromFilename(file.basename, granularity); +} +function getDateFromPath(path, granularity) { + return getDateFromFilename(basename(path), granularity); +} +function getDateFromFilename(filename, granularity) { + const getSettings = { + day: getDailyNoteSettings, + week: getWeeklyNoteSettings, + month: getMonthlyNoteSettings, + quarter: getQuarterlyNoteSettings, + year: getYearlyNoteSettings + }; + const format = getSettings[granularity]().format.split("/").pop(); + const noteDate = window.moment(filename, format, true); + if (!noteDate.isValid()) { + return null; } - utils2.filterObjectNullKeys = filterObjectNullKeys; - async function copyTextToClipboard(text) { - if (navigator.clipboard && navigator.clipboard.writeText) { - try { - await navigator.clipboard.writeText(text); - } catch (error) { - console.warn("Copy to clipboard failed.", error); + if (isFormatAmbiguous(format, granularity)) { + if (granularity === "week") { + const cleanFormat = removeEscapedCharacters(format); + if (/w{1,2}/i.test(cleanFormat)) { + return window.moment(filename, format.replace(/M{1,4}/g, "").replace(/D{1,4}/g, ""), false); } - } else { - console.warn("Copy to clipboard failed, methods not supports."); } } - utils2.copyTextToClipboard = copyTextToClipboard; - function getImageSize(src) { - return new Promise((resolve) => { - const imgEl = new Image(); - imgEl.onload = () => { - const { width, height } = imgEl; - if (width > 0 && height > 0) { - resolve({ width, height }); - } else { - resolve({ width: 0, height: 0 }); - } - }; - imgEl.onerror = () => { - resolve({ width: 0, height: 0 }); - }; - imgEl.className = "hidden"; - imgEl.src = src; - document.body.appendChild(imgEl); - imgEl.remove(); - }); - } - utils2.getImageSize = getImageSize; -})(utils || (utils = {})); -var utils$1 = utils; -function reducer$3(state, action) { - switch (action.type) { - case "SET_MEMOS": { - const memos = utils$1.dedupeObjectWithId(action.payload.memos.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt))); - return __spreadProps(__spreadValues({}, state), { - memos: [...memos] - }); - } - case "SET_TAGS": { - return __spreadProps(__spreadValues({}, state), { - tags: action.payload.tags - }); - } - case "INSERT_MEMO": { - const memos = utils$1.dedupeObjectWithId([action.payload.memo, ...state.memos].sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt))); - return __spreadProps(__spreadValues({}, state), { - memos - }); - } - case "DELETE_MEMO_BY_ID": { - return __spreadProps(__spreadValues({}, state), { - memos: [...state.memos].filter((memo2) => memo2.id !== action.payload.id) - }); - } - case "EDIT_MEMO": { - const memos = state.memos.map((m2) => { - if (m2.id === action.payload.id) { - return __spreadValues(__spreadValues({}, m2), action.payload); - } else { - return m2; - } - }); - return __spreadProps(__spreadValues({}, state), { - memos + return noteDate; +} +class DailyNotesFolderMissingError$1 extends Error { +} +async function createDailyNote(date) { + const app2 = window.app; + const { vault } = app2; + const moment = window.moment; + const { template, format, folder } = getDailyNoteSettings(); + const [templateContents, IFoldInfo] = await getTemplateInfo(template); + const filename = date.format(format); + const normalizedPath = await getNotePath(folder, filename); + try { + const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename).replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => { + const now = moment(); + const currentDate = date.clone().set({ + hour: now.get("hour"), + minute: now.get("minute"), + second: now.get("second") }); - } - default: { - return state; - } + if (calc) { + currentDate.add(parseInt(timeDelta, 10), unit); + } + if (momentFormat) { + return currentDate.format(momentFormat.substring(1).trim()); + } + return currentDate.format(format); + }).replace(/{{\s*yesterday\s*}}/gi, date.clone().subtract(1, "day").format(format)).replace(/{{\s*tomorrow\s*}}/gi, date.clone().add(1, "d").format(format))); + app2.foldManager.save(createdFile, IFoldInfo); + return createdFile; + } catch (err) { + console.error(`Failed to create file: '${normalizedPath}'`, err); + new obsidian.Notice("Unable to create new file."); } } -const defaultState$3 = { - memos: [], - tags: [] -}; -function reducer$2(state, action) { - switch (action.type) { - case "SIGN_IN": { - return { - user: action.payload.user - }; - } - case "SIGN_OUT": { - return { - user: null - }; - } - default: { - return state; - } +function getDailyNote(date, dailyNotes) { + var _a; + return (_a = dailyNotes[getDateUID(date, "day")]) != null ? _a : null; +} +function getAllDailyNotes() { + const { vault } = window.app; + const { folder } = getDailyNoteSettings(); + const dailyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder)); + if (!dailyNotesFolder) { + throw new DailyNotesFolderMissingError$1("Failed to find daily notes folder"); } + const dailyNotes = {}; + obsidian.Vault.recurseChildren(dailyNotesFolder, (note) => { + if (note instanceof obsidian.TFile) { + const date = getDateFromFile(note, "day"); + if (date) { + const dateString = getDateUID(date, "day"); + dailyNotes[dateString] = note; + } + } + }); + return dailyNotes; } -const defaultState$2 = { user: null }; -function reducer$1(state, action) { - switch (action.type) { - case "SET_QUERIES": { - const queries = utils$1.dedupeObjectWithId(action.payload.queries.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)).sort((a, b) => { - var _a, _b; - return utils$1.getTimeStampByDate((_a = b.pinnedAt) != null ? _a : 0) - utils$1.getTimeStampByDate((_b = a.pinnedAt) != null ? _b : 0); - })); - return __spreadProps(__spreadValues({}, state), { - queries - }); - } - case "INSERT_QUERY": { - const queries = utils$1.dedupeObjectWithId([action.payload.query, ...state.queries].sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt))); - return __spreadProps(__spreadValues({}, state), { - queries - }); - } - case "DELETE_QUERY_BY_ID": { - return __spreadProps(__spreadValues({}, state), { - queries: [...state.queries].filter((query) => query.id !== action.payload.id) - }); - } - case "UPDATE_QUERY": { - const queries = state.queries.map((m2) => { - if (m2.id === action.payload.id) { - return __spreadValues(__spreadValues({}, m2), action.payload); - } else { - return m2; - } - }); - return __spreadProps(__spreadValues({}, state), { - queries - }); - } - default: { - return state; - } +class WeeklyNotesFolderMissingError extends Error { +} +function getDaysOfWeek() { + const { moment } = window; + let weekStart = moment.localeData()._week.dow; + const daysOfWeek = [ + "sunday", + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday" + ]; + while (weekStart) { + daysOfWeek.push(daysOfWeek.shift()); + weekStart--; } + return daysOfWeek; } -const defaultState$1 = { - queries: [] -}; -var main$1 = {}; -Object.defineProperty(main$1, "__esModule", { value: true }); -var obsidian = require$$0__default["default"]; -const DEFAULT_DAILY_NOTE_FORMAT = "YYYY-MM-DD"; -const DEFAULT_WEEKLY_NOTE_FORMAT = "gggg-[W]ww"; -const DEFAULT_MONTHLY_NOTE_FORMAT = "YYYY-MM"; -const DEFAULT_QUARTERLY_NOTE_FORMAT = "YYYY-[Q]Q"; -const DEFAULT_YEARLY_NOTE_FORMAT = "YYYY"; -function shouldUsePeriodicNotesSettings(periodicity) { - var _a, _b; - const periodicNotes = window.app.plugins.getPlugin("periodic-notes"); - return periodicNotes && ((_b = (_a = periodicNotes.settings) == null ? void 0 : _a[periodicity]) == null ? void 0 : _b.enabled); +function getDayOfWeekNumericalValue(dayOfWeekName) { + return getDaysOfWeek().indexOf(dayOfWeekName.toLowerCase()); } -function getDailyNoteSettings() { - var _a, _b, _c, _d; +async function createWeeklyNote(date) { + const { vault } = window.app; + const { template, format, folder } = getWeeklyNoteSettings(); + const [templateContents, IFoldInfo] = await getTemplateInfo(template); + const filename = date.format(format); + const normalizedPath = await getNotePath(folder, filename); try { - const { internalPlugins, plugins } = window.app; - if (shouldUsePeriodicNotesSettings("daily")) { - const { format: format3, folder: folder2, template: template2 } = ((_b = (_a = plugins.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.daily) || {}; - return { - format: format3 || DEFAULT_DAILY_NOTE_FORMAT, - folder: (folder2 == null ? void 0 : folder2.trim()) || "", - template: (template2 == null ? void 0 : template2.trim()) || "" - }; - } - const { folder, format: format2, template } = ((_d = (_c = internalPlugins.getPluginById("daily-notes")) == null ? void 0 : _c.instance) == null ? void 0 : _d.options) || {}; - return { - format: format2 || DEFAULT_DAILY_NOTE_FORMAT, - folder: (folder == null ? void 0 : folder.trim()) || "", - template: (template == null ? void 0 : template.trim()) || "" - }; + const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => { + const now = window.moment(); + const currentDate = date.clone().set({ + hour: now.get("hour"), + minute: now.get("minute"), + second: now.get("second") + }); + if (calc) { + currentDate.add(parseInt(timeDelta, 10), unit); + } + if (momentFormat) { + return currentDate.format(momentFormat.substring(1).trim()); + } + return currentDate.format(format); + }).replace(/{{\s*title\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi, (_, dayOfWeek, momentFormat) => { + const day = getDayOfWeekNumericalValue(dayOfWeek); + return date.weekday(day).format(momentFormat.trim()); + })); + window.app.foldManager.save(createdFile, IFoldInfo); + return createdFile; } catch (err) { - console.info("No custom daily note settings found!", err); + console.error(`Failed to create file: '${normalizedPath}'`, err); + new obsidian.Notice("Unable to create new file."); } } -function getWeeklyNoteSettings() { - var _a, _b, _c, _d, _e, _f, _g; - try { - const pluginManager = window.app.plugins; - const calendarSettings = (_a = pluginManager.getPlugin("calendar")) == null ? void 0 : _a.options; - const periodicNotesSettings = (_c = (_b = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _b.settings) == null ? void 0 : _c.weekly; - if (shouldUsePeriodicNotesSettings("weekly")) { - return { - format: periodicNotesSettings.format || DEFAULT_WEEKLY_NOTE_FORMAT, - folder: ((_d = periodicNotesSettings.folder) == null ? void 0 : _d.trim()) || "", - template: ((_e = periodicNotesSettings.template) == null ? void 0 : _e.trim()) || "" - }; - } - const settings = calendarSettings || {}; - return { - format: settings.weeklyNoteFormat || DEFAULT_WEEKLY_NOTE_FORMAT, - folder: ((_f = settings.weeklyNoteFolder) == null ? void 0 : _f.trim()) || "", - template: ((_g = settings.weeklyNoteTemplate) == null ? void 0 : _g.trim()) || "" - }; - } catch (err) { - console.info("No custom weekly note settings found!", err); - } +function getWeeklyNote(date, weeklyNotes) { + var _a; + return (_a = weeklyNotes[getDateUID(date, "week")]) != null ? _a : null; } -function getMonthlyNoteSettings() { - var _a, _b, _c, _d; - const pluginManager = window.app.plugins; - try { - const settings = shouldUsePeriodicNotesSettings("monthly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.monthly) || {}; - return { - format: settings.format || DEFAULT_MONTHLY_NOTE_FORMAT, - folder: ((_c = settings.folder) == null ? void 0 : _c.trim()) || "", - template: ((_d = settings.template) == null ? void 0 : _d.trim()) || "" - }; - } catch (err) { - console.info("No custom monthly note settings found!", err); +function getAllWeeklyNotes() { + const weeklyNotes = {}; + if (!appHasWeeklyNotesPluginLoaded()) { + return weeklyNotes; } -} -function getQuarterlyNoteSettings() { - var _a, _b, _c, _d; - const pluginManager = window.app.plugins; - try { - const settings = shouldUsePeriodicNotesSettings("quarterly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.quarterly) || {}; - return { - format: settings.format || DEFAULT_QUARTERLY_NOTE_FORMAT, - folder: ((_c = settings.folder) == null ? void 0 : _c.trim()) || "", - template: ((_d = settings.template) == null ? void 0 : _d.trim()) || "" - }; - } catch (err) { - console.info("No custom quarterly note settings found!", err); + const { vault } = window.app; + const { folder } = getWeeklyNoteSettings(); + const weeklyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder)); + if (!weeklyNotesFolder) { + throw new WeeklyNotesFolderMissingError("Failed to find weekly notes folder"); } + obsidian.Vault.recurseChildren(weeklyNotesFolder, (note) => { + if (note instanceof obsidian.TFile) { + const date = getDateFromFile(note, "week"); + if (date) { + const dateString = getDateUID(date, "week"); + weeklyNotes[dateString] = note; + } + } + }); + return weeklyNotes; } -function getYearlyNoteSettings() { - var _a, _b, _c, _d; - const pluginManager = window.app.plugins; +class MonthlyNotesFolderMissingError extends Error { +} +async function createMonthlyNote(date) { + const { vault } = window.app; + const { template, format, folder } = getMonthlyNoteSettings(); + const [templateContents, IFoldInfo] = await getTemplateInfo(template); + const filename = date.format(format); + const normalizedPath = await getNotePath(folder, filename); try { - const settings = shouldUsePeriodicNotesSettings("yearly") && ((_b = (_a = pluginManager.getPlugin("periodic-notes")) == null ? void 0 : _a.settings) == null ? void 0 : _b.yearly) || {}; - return { - format: settings.format || DEFAULT_YEARLY_NOTE_FORMAT, - folder: ((_c = settings.folder) == null ? void 0 : _c.trim()) || "", - template: ((_d = settings.template) == null ? void 0 : _d.trim()) || "" - }; + const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => { + const now = window.moment(); + const currentDate = date.clone().set({ + hour: now.get("hour"), + minute: now.get("minute"), + second: now.get("second") + }); + if (calc) { + currentDate.add(parseInt(timeDelta, 10), unit); + } + if (momentFormat) { + return currentDate.format(momentFormat.substring(1).trim()); + } + return currentDate.format(format); + }).replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename)); + window.app.foldManager.save(createdFile, IFoldInfo); + return createdFile; } catch (err) { - console.info("No custom yearly note settings found!", err); + console.error(`Failed to create file: '${normalizedPath}'`, err); + new obsidian.Notice("Unable to create new file."); } } -function join(...partSegments) { - let parts = []; - for (let i = 0, l2 = partSegments.length; i < l2; i++) { - parts = parts.concat(partSegments[i].split("/")); +function getMonthlyNote(date, monthlyNotes) { + var _a; + return (_a = monthlyNotes[getDateUID(date, "month")]) != null ? _a : null; +} +function getAllMonthlyNotes() { + const monthlyNotes = {}; + if (!appHasMonthlyNotesPluginLoaded()) { + return monthlyNotes; } - const newParts = []; - for (let i = 0, l2 = parts.length; i < l2; i++) { - const part = parts[i]; - if (!part || part === ".") - continue; - else - newParts.push(part); + const { vault } = window.app; + const { folder } = getMonthlyNoteSettings(); + const monthlyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder)); + if (!monthlyNotesFolder) { + throw new MonthlyNotesFolderMissingError("Failed to find monthly notes folder"); } - if (parts[0] === "") - newParts.unshift(""); - return newParts.join("/"); + obsidian.Vault.recurseChildren(monthlyNotesFolder, (note) => { + if (note instanceof obsidian.TFile) { + const date = getDateFromFile(note, "month"); + if (date) { + const dateString = getDateUID(date, "month"); + monthlyNotes[dateString] = note; + } + } + }); + return monthlyNotes; } -function basename(fullPath) { - let base = fullPath.substring(fullPath.lastIndexOf("/") + 1); - if (base.lastIndexOf(".") != -1) - base = base.substring(0, base.lastIndexOf(".")); - return base; -} -async function ensureFolderExists(path) { - const dirs = path.replace(/\\/g, "/").split("/"); - dirs.pop(); - if (dirs.length) { - const dir = join(...dirs); - if (!window.app.vault.getAbstractFileByPath(dir)) { - await window.app.vault.createFolder(dir); - } - } -} -async function getNotePath(directory, filename) { - if (!filename.endsWith(".md")) { - filename += ".md"; - } - const path = obsidian.normalizePath(join(directory, filename)); - await ensureFolderExists(path); - return path; -} -async function getTemplateInfo(template) { - const { metadataCache, vault } = window.app; - const templatePath = obsidian.normalizePath(template); - if (templatePath === "/") { - return Promise.resolve(["", null]); - } - try { - const templateFile = metadataCache.getFirstLinkpathDest(templatePath, ""); - const contents = await vault.cachedRead(templateFile); - const IFoldInfo = window.app.foldManager.load(templateFile); - return [contents, IFoldInfo]; - } catch (err) { - console.error(`Failed to read the daily note template '${templatePath}'`, err); - new obsidian.Notice("Failed to read the daily note template"); - return ["", null]; - } -} -function getDateUID(date, granularity = "day") { - const ts = date.clone().startOf(granularity).format(); - return `${granularity}-${ts}`; -} -function removeEscapedCharacters(format2) { - return format2.replace(/\[[^\]]*\]/g, ""); -} -function isFormatAmbiguous(format2, granularity) { - if (granularity === "week") { - const cleanFormat = removeEscapedCharacters(format2); - return /w{1,2}/i.test(cleanFormat) && (/M{1,4}/.test(cleanFormat) || /D{1,4}/.test(cleanFormat)); - } - return false; -} -function getDateFromFile(file, granularity) { - return getDateFromFilename(file.basename, granularity); -} -function getDateFromPath(path, granularity) { - return getDateFromFilename(basename(path), granularity); -} -function getDateFromFilename(filename, granularity) { - const getSettings = { - day: getDailyNoteSettings, - week: getWeeklyNoteSettings, - month: getMonthlyNoteSettings, - quarter: getQuarterlyNoteSettings, - year: getYearlyNoteSettings - }; - const format2 = getSettings[granularity]().format.split("/").pop(); - const noteDate = window.moment(filename, format2, true); - if (!noteDate.isValid()) { - return null; - } - if (isFormatAmbiguous(format2, granularity)) { - if (granularity === "week") { - const cleanFormat = removeEscapedCharacters(format2); - if (/w{1,2}/i.test(cleanFormat)) { - return window.moment(filename, format2.replace(/M{1,4}/g, "").replace(/D{1,4}/g, ""), false); - } - } - } - return noteDate; -} -class DailyNotesFolderMissingError$1 extends Error { -} -async function createDailyNote(date) { - const app2 = window.app; - const { vault } = app2; - const moment = window.moment; - const { template, format: format2, folder } = getDailyNoteSettings(); - const [templateContents, IFoldInfo] = await getTemplateInfo(template); - const filename = date.format(format2); - const normalizedPath = await getNotePath(folder, filename); - try { - const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename).replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => { - const now = moment(); - const currentDate = date.clone().set({ - hour: now.get("hour"), - minute: now.get("minute"), - second: now.get("second") - }); - if (calc) { - currentDate.add(parseInt(timeDelta, 10), unit); - } - if (momentFormat) { - return currentDate.format(momentFormat.substring(1).trim()); - } - return currentDate.format(format2); - }).replace(/{{\s*yesterday\s*}}/gi, date.clone().subtract(1, "day").format(format2)).replace(/{{\s*tomorrow\s*}}/gi, date.clone().add(1, "d").format(format2))); - app2.foldManager.save(createdFile, IFoldInfo); - return createdFile; - } catch (err) { - console.error(`Failed to create file: '${normalizedPath}'`, err); - new obsidian.Notice("Unable to create new file."); - } -} -function getDailyNote(date, dailyNotes) { - var _a; - return (_a = dailyNotes[getDateUID(date, "day")]) != null ? _a : null; -} -function getAllDailyNotes() { - const { vault } = window.app; - const { folder } = getDailyNoteSettings(); - const dailyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder)); - if (!dailyNotesFolder) { - throw new DailyNotesFolderMissingError$1("Failed to find daily notes folder"); - } - const dailyNotes = {}; - obsidian.Vault.recurseChildren(dailyNotesFolder, (note) => { - if (note instanceof obsidian.TFile) { - const date = getDateFromFile(note, "day"); - if (date) { - const dateString = getDateUID(date, "day"); - dailyNotes[dateString] = note; - } - } - }); - return dailyNotes; -} -class WeeklyNotesFolderMissingError extends Error { -} -function getDaysOfWeek() { - const { moment } = window; - let weekStart = moment.localeData()._week.dow; - const daysOfWeek = [ - "sunday", - "monday", - "tuesday", - "wednesday", - "thursday", - "friday", - "saturday" - ]; - while (weekStart) { - daysOfWeek.push(daysOfWeek.shift()); - weekStart--; - } - return daysOfWeek; -} -function getDayOfWeekNumericalValue(dayOfWeekName) { - return getDaysOfWeek().indexOf(dayOfWeekName.toLowerCase()); -} -async function createWeeklyNote(date) { - const { vault } = window.app; - const { template, format: format2, folder } = getWeeklyNoteSettings(); - const [templateContents, IFoldInfo] = await getTemplateInfo(template); - const filename = date.format(format2); - const normalizedPath = await getNotePath(folder, filename); - try { - const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => { - const now = window.moment(); - const currentDate = date.clone().set({ - hour: now.get("hour"), - minute: now.get("minute"), - second: now.get("second") - }); - if (calc) { - currentDate.add(parseInt(timeDelta, 10), unit); - } - if (momentFormat) { - return currentDate.format(momentFormat.substring(1).trim()); - } - return currentDate.format(format2); - }).replace(/{{\s*title\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi, (_, dayOfWeek, momentFormat) => { - const day = getDayOfWeekNumericalValue(dayOfWeek); - return date.weekday(day).format(momentFormat.trim()); - })); - window.app.foldManager.save(createdFile, IFoldInfo); - return createdFile; - } catch (err) { - console.error(`Failed to create file: '${normalizedPath}'`, err); - new obsidian.Notice("Unable to create new file."); - } -} -function getWeeklyNote(date, weeklyNotes) { - var _a; - return (_a = weeklyNotes[getDateUID(date, "week")]) != null ? _a : null; -} -function getAllWeeklyNotes() { - const weeklyNotes = {}; - if (!appHasWeeklyNotesPluginLoaded()) { - return weeklyNotes; - } - const { vault } = window.app; - const { folder } = getWeeklyNoteSettings(); - const weeklyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder)); - if (!weeklyNotesFolder) { - throw new WeeklyNotesFolderMissingError("Failed to find weekly notes folder"); - } - obsidian.Vault.recurseChildren(weeklyNotesFolder, (note) => { - if (note instanceof obsidian.TFile) { - const date = getDateFromFile(note, "week"); - if (date) { - const dateString = getDateUID(date, "week"); - weeklyNotes[dateString] = note; - } - } - }); - return weeklyNotes; -} -class MonthlyNotesFolderMissingError extends Error { -} -async function createMonthlyNote(date) { - const { vault } = window.app; - const { template, format: format2, folder } = getMonthlyNoteSettings(); - const [templateContents, IFoldInfo] = await getTemplateInfo(template); - const filename = date.format(format2); - const normalizedPath = await getNotePath(folder, filename); - try { - const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => { - const now = window.moment(); - const currentDate = date.clone().set({ - hour: now.get("hour"), - minute: now.get("minute"), - second: now.get("second") - }); - if (calc) { - currentDate.add(parseInt(timeDelta, 10), unit); - } - if (momentFormat) { - return currentDate.format(momentFormat.substring(1).trim()); - } - return currentDate.format(format2); - }).replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename)); - window.app.foldManager.save(createdFile, IFoldInfo); - return createdFile; - } catch (err) { - console.error(`Failed to create file: '${normalizedPath}'`, err); - new obsidian.Notice("Unable to create new file."); - } -} -function getMonthlyNote(date, monthlyNotes) { - var _a; - return (_a = monthlyNotes[getDateUID(date, "month")]) != null ? _a : null; -} -function getAllMonthlyNotes() { - const monthlyNotes = {}; - if (!appHasMonthlyNotesPluginLoaded()) { - return monthlyNotes; - } - const { vault } = window.app; - const { folder } = getMonthlyNoteSettings(); - const monthlyNotesFolder = vault.getAbstractFileByPath(obsidian.normalizePath(folder)); - if (!monthlyNotesFolder) { - throw new MonthlyNotesFolderMissingError("Failed to find monthly notes folder"); - } - obsidian.Vault.recurseChildren(monthlyNotesFolder, (note) => { - if (note instanceof obsidian.TFile) { - const date = getDateFromFile(note, "month"); - if (date) { - const dateString = getDateUID(date, "month"); - monthlyNotes[dateString] = note; - } - } - }); - return monthlyNotes; -} -class QuarterlyNotesFolderMissingError extends Error { +class QuarterlyNotesFolderMissingError extends Error { } async function createQuarterlyNote(date) { const { vault } = window.app; - const { template, format: format2, folder } = getQuarterlyNoteSettings(); + const { template, format, folder } = getQuarterlyNoteSettings(); const [templateContents, IFoldInfo] = await getTemplateInfo(template); - const filename = date.format(format2); + const filename = date.format(format); const normalizedPath = await getNotePath(folder, filename); try { const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => { @@ -7746,7 +7513,7 @@ async function createQuarterlyNote(date) { if (momentFormat) { return currentDate.format(momentFormat.substring(1).trim()); } - return currentDate.format(format2); + return currentDate.format(format); }).replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename)); window.app.foldManager.save(createdFile, IFoldInfo); return createdFile; @@ -7785,9 +7552,9 @@ class YearlyNotesFolderMissingError extends Error { } async function createYearlyNote(date) { const { vault } = window.app; - const { template, format: format2, folder } = getYearlyNoteSettings(); + const { template, format, folder } = getYearlyNoteSettings(); const [templateContents, IFoldInfo] = await getTemplateInfo(template); - const filename = date.format(format2); + const filename = date.format(format); const normalizedPath = await getNotePath(folder, filename); try { const createdFile = await vault.create(normalizedPath, templateContents.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi, (_, _timeOrDate, calc, timeDelta, unit, momentFormat) => { @@ -7803,7 +7570,7 @@ async function createYearlyNote(date) { if (momentFormat) { return currentDate.format(momentFormat.substring(1).trim()); } - return currentDate.format(format2); + return currentDate.format(format); }).replace(/{{\s*date\s*}}/gi, filename).replace(/{{\s*time\s*}}/gi, window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi, filename)); window.app.foldManager.save(createdFile, IFoldInfo); return createdFile; @@ -7929,2935 +7696,6 @@ main$1.getWeeklyNote = getWeeklyNote; main$1.getWeeklyNoteSettings = getWeeklyNoteSettings; main$1.getYearlyNote = getYearlyNote; main$1.getYearlyNoteSettings = getYearlyNoteSettings; -function reducer(state, action) { - switch (action.type) { - case "SET_DAILYNOTES": { - const dailyNotes = getAllDailyNotes_1(); - return __spreadProps(__spreadValues({}, state), { - dailyNotes - }); - } - case "SET_APP": { - return __spreadProps(__spreadValues({}, state), { - app: action.payload.app - }); - } - default: { - return state; - } - } -} -const defaultState = { - dailyNotes: null, - app: null -}; -const appStore = createStore({ - globalState: defaultState$5, - locationState: defaultState$4, - memoState: defaultState$3, - userState: defaultState$2, - queryState: defaultState$1, - dailyNotesState: defaultState -}, combineReducers({ - globalState: reducer$5, - locationState: reducer$4, - memoState: reducer$3, - userState: reducer$2, - queryState: reducer$1, - dailyNotesState: reducer -})); -const appContext = _react_17_0_2_react.exports.createContext(appStore.getState()); -class DailyNotesService { - getState() { - return appStore.getState().dailyNotesState; - } - getApp(app2) { - appStore.dispatch({ - type: "SET_APP", - payload: { - app: app2 - } - }); - return app2; - } - async getMyAllDailyNotes() { - const dailyNotes = getAllDailyNotes_1(); - appStore.dispatch({ - type: "SET_DAILYNOTES", - payload: { - dailyNotes - } - }); - return dailyNotes; - } - async getDailyNoteByMemo(date) { - const { dailyNotes } = this.getState(); - const dailyNote = getDailyNote_1(date, dailyNotes); - return dailyNote; - } -} -const dailyNotesService = new DailyNotesService(); -var storage; -(function(storage2) { - function get(keys) { - const data = {}; - for (const key of keys) { - try { - const stringifyValue = localStorage.getItem(key); - if (stringifyValue !== null) { - const val = JSON.parse(stringifyValue); - data[key] = val; - } - } catch (error) { - console.error("Get storage failed in ", key, error); - } - } - return data; - } - storage2.get = get; - function set(data) { - for (const key in data) { - try { - const stringifyValue = JSON.stringify(data[key]); - localStorage.setItem(key, stringifyValue); - } catch (error) { - console.error("Save storage failed in ", key, error); - } - } - } - storage2.set = set; - function remove(keys) { - for (const key of keys) { - try { - localStorage.removeItem(key); - } catch (error) { - console.error("Remove storage failed in ", key, error); - } - } - } - storage2.remove = remove; - function emitStorageChangedEvent() { - var _a; - const iframeEl = document.createElement("iframe"); - iframeEl.style.display = "none"; - document.body.appendChild(iframeEl); - (_a = iframeEl.contentWindow) == null ? void 0 : _a.localStorage.setItem("t", Date.now().toString()); - iframeEl.remove(); - } - storage2.emitStorageChangedEvent = emitStorageChangedEvent; -})(storage || (storage = {})); -class GlobalStateService { - constructor() { - __publicField(this, "getState", () => { - return appStore.getState().globalState; - }); - __publicField(this, "setEditMemoId", (editMemoId) => { - appStore.dispatch({ - type: "SET_EDIT_MEMO_ID", - payload: { - editMemoId - } - }); - }); - __publicField(this, "setMarkMemoId", (markMemoId) => { - appStore.dispatch({ - type: "SET_MARK_MEMO_ID", - payload: { - markMemoId - } - }); - }); - __publicField(this, "setIsMobileView", (isMobileView) => { - appStore.dispatch({ - type: "SET_MOBILE_VIEW", - payload: { - isMobileView - } - }); - }); - __publicField(this, "setShowSiderbarInMobileView", (showSiderbarInMobileView) => { - appStore.dispatch({ - type: "SET_SHOW_SIDEBAR_IN_MOBILE_VIEW", - payload: { - showSiderbarInMobileView - } - }); - }); - __publicField(this, "setAppSetting", (appSetting) => { - appStore.dispatch({ - type: "SET_APP_SETTING", - payload: appSetting - }); - storage.set(appSetting); - }); - var _a, _b, _c, _d; - const cachedSetting = storage.get([ - "shouldSplitMemoWord", - "shouldHideImageUrl", - "shouldUseMarkdownParser", - "useTinyUndoHistoryCache" - ]); - const defaultAppSetting = { - shouldSplitMemoWord: (_a = cachedSetting.shouldSplitMemoWord) != null ? _a : true, - shouldHideImageUrl: (_b = cachedSetting.shouldHideImageUrl) != null ? _b : true, - shouldUseMarkdownParser: (_c = cachedSetting.shouldUseMarkdownParser) != null ? _c : true, - useTinyUndoHistoryCache: (_d = cachedSetting.useTinyUndoHistoryCache) != null ? _d : false - }; - this.setAppSetting(defaultAppSetting); - } -} -const globalStateService = new GlobalStateService(); -class LocationService { - constructor() { - __publicField(this, "updateStateWithLocation", () => { - var _a, _b, _c, _d, _e, _f; - const { pathname, search: search2, hash: hash2 } = window.location; - const urlParams = new URLSearchParams(search2); - const state = { - pathname: "/", - hash: "", - query: { - tag: "", - duration: null, - text: "", - type: "", - filter: "" - } - }; - state.query.tag = (_a = urlParams.get("tag")) != null ? _a : ""; - state.query.type = (_b = urlParams.get("type")) != null ? _b : ""; - state.query.text = (_c = urlParams.get("text")) != null ? _c : ""; - state.query.filter = (_d = urlParams.get("filter")) != null ? _d : ""; - const from = parseInt((_e = urlParams.get("from")) != null ? _e : "0"); - const to = parseInt((_f = urlParams.get("to")) != null ? _f : "0"); - if (to > from && to !== 0) { - state.query.duration = { - from, - to - }; - } - state.hash = hash2; - state.pathname = this.getValidPathname(pathname); - appStore.dispatch({ - type: "SET_LOCATION", - payload: state - }); - }); - __publicField(this, "getState", () => { - return appStore.getState().locationState; - }); - __publicField(this, "clearQuery", () => { - appStore.dispatch({ - type: "SET_QUERY", - payload: { - tag: "", - duration: null, - text: "", - type: "", - filter: "" - } - }); - }); - __publicField(this, "setQuery", (query) => { - appStore.dispatch({ - type: "SET_QUERY", - payload: query - }); - }); - __publicField(this, "setHash", (hash2) => { - appStore.dispatch({ - type: "SET_HASH", - payload: { - hash: hash2 - } - }); - }); - __publicField(this, "setPathname", (pathname) => { - appStore.dispatch({ - type: "SET_PATHNAME", - payload: { - pathname - } - }); - }); - __publicField(this, "pushHistory", (pathname) => { - appStore.dispatch({ - type: "SET_PATHNAME", - payload: { - pathname - } - }); - }); - __publicField(this, "replaceHistory", (pathname) => { - appStore.dispatch({ - type: "SET_PATHNAME", - payload: { - pathname - } - }); - }); - __publicField(this, "setMemoTypeQuery", (type = "") => { - appStore.dispatch({ - type: "SET_TYPE", - payload: { - type - } - }); - }); - __publicField(this, "setMemoFilter", (filterId) => { - appStore.dispatch({ - type: "SET_QUERY_FILTER", - payload: filterId - }); - }); - __publicField(this, "setTextQuery", (text) => { - appStore.dispatch({ - type: "SET_TEXT", - payload: { - text - } - }); - }); - __publicField(this, "setTagQuery", (tag2) => { - appStore.dispatch({ - type: "SET_TAG_QUERY", - payload: { - tag: tag2 - } - }); - }); - __publicField(this, "setFromAndToQuery", (from, to) => { - appStore.dispatch({ - type: "SET_DURATION_QUERY", - payload: { - duration: { from, to } - } - }); - }); - __publicField(this, "getValidPathname", (pathname) => { - if (["/", "/recycle", "/setting"].includes(pathname)) { - return pathname; - } else { - return "/"; - } - }); - this.updateStateWithLocation(); - window.onpopstate = () => { - this.updateStateWithLocation(); - }; - } -} -const locationService = new LocationService(); -async function changeMemo(memoid, originalContent, content, memoType) { - const { dailyNotes } = dailyNotesService.getState(); - const { vault } = appStore.getState().dailyNotesState.app; - const timeString = memoid.slice(0, 11) + "00"; - const idString = parseInt(memoid.slice(14)); - const changeDate = require$$0.moment(timeString, "YYYYMMDDHHmmSS"); - const dailyNote = getDailyNote_1(changeDate, dailyNotes); - const fileContent = await vault.read(dailyNote); - const fileLines = getAllLinesFromFile$9(fileContent); - const removeEnter = content.replace(/\n/g, "
"); - const originalLine = fileLines[idString]; - const newLine = fileLines[idString].replace(originalContent, removeEnter); - const newFileContent = fileContent.replace(originalLine, newLine); - await vault.modify(dailyNote, newFileContent); - return { - id: memoid, - content: removeEnter, - deletedAt: "", - createdAt: changeDate.format("YYYY/MM/DD HH:mm:SS"), - updatedAt: changeDate.format("YYYY/MM/DD HH:mm:SS"), - memoType - }; -} -function getDailyNotePath() { - const dailyNotesSetting = getDailyNoteSettings_1(); - const dailyNotePath = dailyNotesSetting.folder; - return dailyNotePath; -} -const getAllLinesFromFile$9 = (cache) => cache.split(/\r?\n/); -const findQuery = async () => { - const { metadataCache, vault } = appStore.getState().dailyNotesState.app; - const queryList2 = []; - const filePath = getDailyNotePath(); - const absolutePath = filePath + "/query.md"; - const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath); - if (queryFile instanceof require$$0.TFile) { - const fileContents = await vault.read(queryFile); - const fileLines = getAllLinesFromFile$8(fileContents); - if (fileLines && fileLines.length != 0) { - for (let i = 0; i < fileLines.length; i++) { - if (fileLines[i] === "") - continue; - const createdDateString = getCreatedDateFromLine(fileLines[i]); - const createdDate = require$$0.moment(createdDateString, "YYYYMMDDHHmmss").format("YYYY/MM/DD HH:mm:ss"); - const updatedDate = createdDate; - const id2 = createdDateString + getIDFromLine$1(fileLines[i]); - const querystring = getStringFromLine(fileLines[i]); - const title = getTitleFromLine(fileLines[i]); - let pinnedDate; - if (/^(.+)pinnedAt(.+)$/.test(fileLines[i])) { - pinnedDate = require$$0.moment(getPinnedDateFromLine$1(fileLines[i]), "YYYYMMDDHHmmss"); - queryList2.push({ - createdAt: createdDate, - id: id2, - pinnedAt: pinnedDate.format("YYYY/MM/DD HH:mm:ss"), - querystring, - title, - updatedAt: updatedDate, - userId: "" - }); - } else if (/^(.+)\[\](.+)?$/.test(fileLines[i])) { - queryList2.push({ - createdAt: createdDate, - id: id2, - pinnedAt: "", - querystring: "", - title, - updatedAt: updatedDate, - userId: "" - }); - } else { - queryList2.push({ - createdAt: createdDate, - id: id2, - pinnedAt: "", - querystring, - title, - updatedAt: updatedDate, - userId: "" - }); - } - } - } - } - return queryList2; -}; -const getAllLinesFromFile$8 = (cache) => cache.split(/\r?\n/); -const getCreatedDateFromLine = (line) => { - var _a; - return (_a = /^(\d{14})/.exec(line)) == null ? void 0 : _a[1]; -}; -const getIDFromLine$1 = (line) => { - var _a; - return (_a = /^(\d{14})(\d{1,})\s/.exec(line)) == null ? void 0 : _a[2]; -}; -const getStringFromLine = (line) => { - var _a; - return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)?\])/.exec(line)) == null ? void 0 : _a[4]; -}; -const getTitleFromLine = (line) => { - var _a; - return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])/.exec(line)) == null ? void 0 : _a[3]; -}; -const getPinnedDateFromLine$1 = (line) => { - var _a; - return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])\s(pinnedAt\: (\d{14}))/.exec(line)) == null ? void 0 : _a[7]; -}; -const createObsidianQuery = async (title, querystring) => { - const { metadataCache, vault } = appStore.getState().dailyNotesState.app; - const filePath = getDailyNotePath(); - const absolutePath = filePath + "/query.md"; - const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath); - if (queryFile instanceof require$$0.TFile) { - const fileContents = await vault.read(queryFile); - const fileLines = getAllLinesFromFile$7(fileContents); - const date = require$$0.moment(); - const createdDate = date.format("YYYY/MM/DD HH:mm:ss"); - const updatedDate = createdDate; - let lineNum; - if (fileLines.length === 1 && fileLines[0] === "") { - lineNum = 1; - } else { - lineNum = fileLines.length + 1; - } - const id2 = date.format("YYYYMMDDHHmmss") + lineNum; - await createQueryInFile(queryFile, fileContents, id2, title, querystring); - return [ - { - createdAt: createdDate, - id: id2, - pinnedAt: "", - querystring, - title, - updatedAt: updatedDate, - userId: "" - } - ]; - } else { - const queryFilePath = require$$0.normalizePath(absolutePath); - const file = await createQueryFile(queryFilePath); - const fileContents = await vault.read(file); - const date = require$$0.moment(); - const createdDate = date.format("YYYY/MM/DD HH:mm:ss"); - const updatedDate = createdDate; - const id2 = date.format("YYYYMMDDHHmmss") + 1; - await createQueryInFile(file, fileContents, id2, title, querystring); - return [ - { - createdAt: createdDate, - id: id2, - pinnedAt: "", - querystring, - title, - updatedAt: updatedDate, - userId: "" - } - ]; - } -}; -const createQueryInFile = async (file, fileContent, id2, title, queryString) => { - const { vault } = appStore.getState().dailyNotesState.app; - let newContent; - if (fileContent === "") { - newContent = id2 + " " + title + " " + queryString; - } else { - newContent = fileContent + "\n" + id2 + " " + title + " " + queryString; - } - await vault.modify(file, newContent); - return true; -}; -const createQueryFile = async (path) => { - const { vault } = appStore.getState().dailyNotesState.app; - try { - const createdFile = await vault.create(path, ""); - return createdFile; - } catch (err) { - console.error(`Failed to create file: '${path}'`, err); - new require$$0.Notice("Unable to create new file."); - } -}; -const getAllLinesFromFile$7 = (cache) => cache.split(/\r?\n/); -class DailyNotesFolderMissingError extends Error { -} -async function getRemainingMemos(note) { - if (!note) { - return 0; - } - const { vault } = appStore.getState().dailyNotesState.app; - let fileContents = await vault.read(note); - let regexMatch; - if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) { - regexMatch = "(-|\\*) (\\[(.{1})\\]\\s)?" + DefaultMemoComposition.replace(/{TIME}/g, "((\\)?\\d{1,2}:\\d{2})?").replace(/ {CONTENT}/g, ""); - } else { - regexMatch = "(-|\\*) (\\[(.{1})\\]\\s)?((\\)?\\d{1,2}\\:\\d{2})?"; - } - const regexMatchRe = new RegExp(regexMatch, "g"); - const matchLength = (fileContents.match(regexMatchRe) || []).length; - const re2 = new RegExp(ProcessEntriesBelow.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"), "g"); - const processEntriesHeader = (fileContents.match(re2) || []).length; - fileContents = null; - if (processEntriesHeader) { - return matchLength; - } - return 0; -} -async function getMemosFromDailyNote(dailyNote, dailyEvents) { - if (!dailyNote) { - return []; - } - const { vault } = appStore.getState().dailyNotesState.app; - const Memos2 = await getRemainingMemos(dailyNote); - if (Memos2) { - let fileContents = await vault.read(dailyNote); - let fileLines = getAllLinesFromFile$6(fileContents); - const startDate = getDateFromFile_1(dailyNote, "day"); - const endDate = getDateFromFile_1(dailyNote, "day"); - let processHeaderFound = false; - let memoType; - for (let i = 0; i < fileLines.length; i++) { - const line = fileLines[i]; - if (line.length === 0) - continue; - if (processHeaderFound == false && lineContainsParseBelowToken(line)) { - processHeaderFound = true; - } - if (processHeaderFound == true && !lineContainsParseBelowToken(line) && /^#{1,} /g.test(line)) { - processHeaderFound = false; - } - if (lineContainsTime(line) && processHeaderFound) { - const hourText = extractHourFromBulletLine(line); - const minText = extractMinFromBulletLine(line); - startDate.hours(parseInt(hourText)); - startDate.minutes(parseInt(minText)); - endDate.hours(parseInt(hourText)); - if (parseInt(hourText) > 22) { - endDate.minutes(parseInt(minText)); - } else { - endDate.minutes(parseInt(minText)); - } - if (/^\s*[-*]\s(\[(.{1})\])\s/g.test(line)) { - const memoTaskType = extractMemoTaskTypeFromLine(line); - if (memoTaskType === " ") { - memoType = "TASK-TODO"; - } else if (memoTaskType === "x" || memoTaskType === "X") { - memoType = "TASK-DONE"; - } else { - memoType = "TASK-" + memoTaskType; - } - } else { - memoType = "JOURNAL"; - } - const rawText = extractTextFromTodoLine(line); - if (rawText !== "") { - dailyEvents.push({ - id: startDate.format("YYYYMMDDHHmmSS") + i, - content: rawText, - user_id: 1, - createdAt: startDate.format("YYYY/MM/DD HH:mm:SS"), - updatedAt: endDate.format("YYYY/MM/DD HH:mm:SS"), - memoType - }); - } - } - } - fileLines = null; - fileContents = null; - } -} -async function getMemos() { - const events = []; - const { vault } = appStore.getState().dailyNotesState.app; - const { folder } = getDailyNoteSettings_1(); - const dailyNotesFolder = vault.getAbstractFileByPath(require$$0.normalizePath(folder)); - if (!dailyNotesFolder) { - throw new DailyNotesFolderMissingError("Failed to find daily notes folder"); - } - const dailyNotes = getAllDailyNotes_1(); - for (const string in dailyNotes) { - if (dailyNotes[string] instanceof require$$0.TFile) { - await getMemosFromDailyNote(dailyNotes[string], events); - } - } - return events; -} -const getAllLinesFromFile$6 = (cache) => cache.split(/\r?\n/); -const lineContainsTime = (line) => { - let regexMatch; - if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) { - regexMatch = "^\\s*(-|\\*)\\s(\\[(.{1})\\]\\s)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\)?\\d{1,2}:\\d{2}(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$"); - } else { - regexMatch = "^\\s*(-|\\*)\\s(\\[(.{1})\\]\\s)?(\\)?\\d{1,2}\\:\\d{2}(.*)$"; - } - const regexMatchRe = new RegExp(regexMatch, ""); - return regexMatchRe.test(line); -}; -const lineContainsParseBelowToken = (line) => { - if (ProcessEntriesBelow === "") { - return true; - } - const re2 = new RegExp(ProcessEntriesBelow.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"), ""); - return re2.test(line); -}; -const extractTextFromTodoLine = (line) => { - var _a; - let regexMatch; - if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) { - regexMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\)?((\\d{1,2})\\:(\\d{2}))?(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$"); - } else { - regexMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?(\\)?((\\d{1,2})\\:(\\d{2}))?(\\<\\/time\\>)?\\s?(.*)$"; - } - const regexMatchRe = new RegExp(regexMatch, ""); - return (_a = regexMatchRe.exec(line)) == null ? void 0 : _a[8]; -}; -const extractHourFromBulletLine = (line) => { - var _a; - let regexHourMatch; - if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) { - regexHourMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\)?(\\d{1,2})\\:(\\d{2})(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$"); - } else { - regexHourMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?(\\)?(\\d{1,2})\\:(\\d{2})(.*)$"; - } - const regexMatchRe = new RegExp(regexHourMatch, ""); - return (_a = regexMatchRe.exec(line)) == null ? void 0 : _a[4]; -}; -const extractMinFromBulletLine = (line) => { - var _a; - let regexHourMatch; - if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) { - regexHourMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\)?(\\d{1,2})\\:(\\d{2})(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$"); - } else { - regexHourMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?(\\)?(\\d{1,2})\\:(\\d{2})(.*)$"; - } - const regexMatchRe = new RegExp(regexHourMatch, ""); - return (_a = regexMatchRe.exec(line)) == null ? void 0 : _a[5]; -}; -const extractMemoTaskTypeFromLine = (line) => { - var _a; - return (_a = /^\s*[\-\*]\s(\[(.{1})\])\s(.*)$/.exec(line)) == null ? void 0 : _a[2]; -}; -const updateObsidianQuery = async (queryId, title, queryString) => { - const { metadataCache, vault } = appStore.getState().dailyNotesState.app; - const filePath = getDailyNotePath(); - const absolutePath = filePath + "/query.md"; - const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath); - if (queryFile instanceof require$$0.TFile) { - const fileContents = await vault.read(queryFile); - const fileLines = getAllLinesFromFile$5(fileContents); - let lineID; - if (/^\d{1,3}$/.test(queryId)) { - lineID = queryId; - } else { - lineID = getIDFromLine(queryId); - } - const lineNum = parseInt(lineID) - 1; - if (fileLines && fileLines.length != 0) { - const oldContent = fileLines[lineNum]; - const date = require$$0.moment(); - const updatedDateString = date.format("YYYYMMDDHHmmss"); - const updatedDate = date.format("YYYY/MM/DD HH:mm:ss"); - const newLineNum = lineNum + 1; - const id2 = updatedDateString + newLineNum; - if (/^(.+)pinnedAt(.+)$/.test(oldContent)) { - const pinnedString = getPinnedStringFromLine(oldContent); - const pinnedDateString = getPinnedDateFromLine(oldContent); - const newContent = id2 + " " + title + " " + queryString + " " + pinnedString; - const pinnedAtDate = require$$0.moment(pinnedDateString, "YYYYMMDDHHmmss").format("YYYY/MM/DD HH:mm:ss"); - const newFileContents = fileContents.replace(oldContent, newContent); - await vault.modify(queryFile, newFileContents); - return [ - { - createdAt: updatedDate, - id: id2, - pinnedAt: pinnedAtDate, - querystring: queryString, - title, - updatedAt: updatedDate, - userId: "" - } - ]; - } else { - const newContent = id2 + " " + title + " " + queryString; - const newFileContents = fileContents.replace(oldContent, newContent); - await vault.modify(queryFile, newFileContents); - return [ - { - createdAt: updatedDate, - id: id2, - pinnedAt: "", - querystring: queryString, - title, - updatedAt: updatedDate, - userId: "" - } - ]; - } - } - } -}; -const getAllLinesFromFile$5 = (cache) => cache.split(/\r?\n/); -const getIDFromLine = (line) => { - var _a; - return (_a = /^(\d{14})(\d{1,})/.exec(line)) == null ? void 0 : _a[2]; -}; -const getPinnedStringFromLine = (line) => { - var _a; - return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])\s(pinnedAt\: (\d{14})\d+)/.exec(line)) == null ? void 0 : _a[6]; -}; -const getPinnedDateFromLine = (line) => { - var _a; - return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])\s(pinnedAt\: (\d{14})\d+)/.exec(line)) == null ? void 0 : _a[7]; -}; -async function escapeRegExp(text) { - return await text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); -} -function getLinesInString(input) { - const lines = []; - let tempString = input; - while (tempString.contains("\n")) { - const lineEndIndex = tempString.indexOf("\n"); - lines.push(tempString.slice(0, lineEndIndex)); - tempString = tempString.slice(lineEndIndex + 1); - } - lines.push(tempString); - return lines; -} -async function waitForInsert(MemoContent, isList2) { - const { vault } = appStore.getState().dailyNotesState.app; - const removeEnter = MemoContent.replace(/\n/g, "
"); - const date = require$$0.moment(); - const timeHour = date.format("HH"); - const timeMinute = date.format("mm"); - let newEvent; - let lineNum; - const timeText = String(timeHour) + `:` + String(timeMinute); - if (isList2 && DefaultMemoComposition === "") { - newEvent = `- [ ] ` + String(timeHour) + `:` + String(timeMinute) + ` ` + removeEnter; - } else if (!isList2 && DefaultMemoComposition === "") { - newEvent = `- ` + String(timeHour) + `:` + String(timeMinute) + ` ` + removeEnter; - } - if (isList2 && DefaultMemoComposition != "") { - newEvent = `- [ ] ` + DefaultMemoComposition.replace(/{TIME}/g, timeText).replace(/{CONTENT}/g, removeEnter); - } else if (!isList2 && DefaultMemoComposition != "") { - newEvent = `- ` + DefaultMemoComposition.replace(/{TIME}/g, timeText).replace(/{CONTENT}/g, removeEnter); - } - const dailyNotes = await getAllDailyNotes_1(); - const existingFile = getDailyNote_1(date, dailyNotes); - if (!existingFile) { - const file = await createDailyNote_1(date); - await dailyNotesService.getMyAllDailyNotes(); - const fileContents = await vault.read(file); - const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents); - await vault.modify(file, newFileContent.content); - if (newFileContent.posNum === -1) { - const allLines = getAllLinesFromFile$4(newFileContent.content); - lineNum = allLines.length + 1; - } else { - lineNum = newFileContent.posNum + 1; - } - if (isList2) { - return { - id: date.format("YYYYMMDDHHmm") + "00" + lineNum, - content: MemoContent, - deletedAt: "", - createdAt: date.format("YYYY/MM/DD HH:mm:ss"), - updatedAt: date.format("YYYY/MM/DD HH:mm:ss"), - memoType: "TASK-TODO" - }; - } else { - return { - id: date.format("YYYYMMDDHHmm") + "00" + lineNum, - content: MemoContent, - deletedAt: "", - createdAt: date.format("YYYY/MM/DD HH:mm:ss"), - updatedAt: date.format("YYYY/MM/DD HH:mm:ss"), - memoType: "JOURNAL" - }; - } - } else { - const fileContents = await vault.read(existingFile); - const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents); - await vault.modify(existingFile, newFileContent.content); - if (newFileContent.posNum === -1) { - const allLines = getAllLinesFromFile$4(newFileContent.content); - lineNum = allLines.length + 1; - } else { - lineNum = newFileContent.posNum + 1; - } - if (isList2) { - return { - id: date.format("YYYYMMDDHHmm") + "00" + lineNum, - content: MemoContent, - deletedAt: "", - createdAt: date.format("YYYY/MM/DD HH:mm:ss"), - updatedAt: date.format("YYYY/MM/DD HH:mm:ss"), - memoType: "TODO-Blank" - }; - } else { - return { - id: date.format("YYYYMMDDHHmm") + "00" + lineNum, - content: MemoContent, - deletedAt: "", - createdAt: date.format("YYYY/MM/DD HH:mm:ss"), - updatedAt: date.format("YYYY/MM/DD HH:mm:ss"), - memoType: "JOURNAL" - }; - } - } -} -async function insertAfterHandler(targetString, formatted, fileContent) { - const targetRegex = new RegExp(`s*${await escapeRegExp(targetString)}s*`); - const fileContentLines = getLinesInString(fileContent); - const targetPosition = fileContentLines.findIndex((line) => targetRegex.test(line)); - const targetNotFound = targetPosition === -1; - if (targetNotFound) { - console.log("unable to find insert after line in file."); - } - const nextHeaderPositionAfterTargetPosition = fileContentLines.slice(targetPosition + 1).findIndex((line) => /^#+ |---/.test(line)); - const foundNextHeader = nextHeaderPositionAfterTargetPosition !== -1; - if (foundNextHeader) { - let endOfSectionIndex; - for (let i = nextHeaderPositionAfterTargetPosition + targetPosition; i > targetPosition; i--) { - const lineIsNewline = /^[\s\n ]*$/.test(fileContentLines[i]); - if (!lineIsNewline) { - endOfSectionIndex = i; - break; - } - } - if (!endOfSectionIndex) - endOfSectionIndex = targetPosition; - return await insertTextAfterPositionInBody(formatted, fileContent, endOfSectionIndex, foundNextHeader); - } else { - return await insertTextAfterPositionInBody(formatted, fileContent, fileContentLines.length - 1, foundNextHeader); - } -} -async function insertTextAfterPositionInBody(text, body, pos, found) { - if (pos === -1) { - return { - content: `${body} -${text}`, - posNum: -1 - }; - } - const splitContent = body.split("\n"); - if (found) { - const pre = splitContent.slice(0, pos + 1).join("\n"); - const post = splitContent.slice(pos + 1).join("\n"); - return { - content: `${pre} -${text} -${post}`, - posNum: pos - }; - } else { - const pre = splitContent.slice(0, pos + 1).join("\n"); - const post = splitContent.slice(pos + 1).join("\n"); - if (/[\s\S]*?/g.test(post)) { - return { - content: `${pre} -${text}`, - posNum: pos - }; - } else { - return { - content: `${pre}${text} -${post}`, - posNum: pos - }; - } - } -} -const getAllLinesFromFile$4 = (cache) => cache.split(/\r?\n/); -async function restoreDeletedMemo(deletedMemoid) { - const { vault, metadataCache } = appStore.getState().dailyNotesState.app; - if (/\d{14,}/.test(deletedMemoid)) { - const filePath = getDailyNotePath(); - const absolutePath = filePath + "/delete.md"; - const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath); - if (deleteFile instanceof require$$0.TFile) { - let fileContents = await vault.read(deleteFile); - let fileLines = getAllLinesFromFile$3(fileContents); - if (fileLines.length === 0) { - return; - } else { - const lineNum = parseInt(deletedMemoid.slice(14)); - const line = fileLines[lineNum - 1]; - const newDeletefileContents = fileContents.replace(line, ""); - await vault.modify(deleteFile, newDeletefileContents); - if (/^- (.+)$/.test(line)) { - const id2 = extractIDfromText(line); - const date = require$$0.moment(id2, "YYYYMMDDHHmmss"); - const timeHour = date.format("HH"); - const timeMinute = date.format("mm"); - const newEvent = `- ` + String(timeHour) + `:` + String(timeMinute) + ` ` + extractContentfromText$1(line); - const dailyNotes = await getAllDailyNotes_1(); - const existingFile = getDailyNote_1(date, dailyNotes); - if (!existingFile) { - const file = await createDailyNote_1(date); - const fileContents2 = await vault.read(file); - const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents2); - await vault.modify(file, newFileContent.content); - return [ - { - deletedAt: "" - } - ]; - } else { - const fileContents2 = await vault.read(existingFile); - const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents2); - await vault.modify(existingFile, newFileContent.content); - return [ - { - deletedAt: "" - } - ]; - } - } - fileLines = null; - fileContents = null; - } - } - } -} -async function deleteForever(deletedMemoid) { - const { vault, metadataCache } = appStore.getState().dailyNotesState.app; - if (/\d{14,}/.test(deletedMemoid)) { - const filePath = getDailyNotePath(); - const absolutePath = filePath + "/delete.md"; - const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath); - if (deleteFile instanceof require$$0.TFile) { - let fileContents = await vault.read(deleteFile); - let fileLines = getAllLinesFromFile$3(fileContents); - if (fileLines.length === 0) { - return; - } else { - const lineNum = parseInt(deletedMemoid.slice(14)); - const line = fileLines[lineNum - 1]; - if (/^- (.+)$/.test(line)) { - const newFileContent = fileContents.replace(line, ""); - await vault.modify(deleteFile, newFileContent); - } - } - fileLines = null; - fileContents = null; - } - } -} -async function getDeletedMemos() { - const { vault, metadataCache } = appStore.getState().dailyNotesState.app; - const filePath = getDailyNotePath(); - const absolutePath = filePath + "/delete.md"; - const deletedMemos = []; - const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath); - if (deleteFile instanceof require$$0.TFile) { - let fileContents = await vault.read(deleteFile); - let fileLines = getAllLinesFromFile$3(fileContents); - if (fileLines.length === 0) { - return deletedMemos; - } else { - for (let i = 0; i < fileLines.length; i++) { - const line = fileLines[i]; - if (!/- /.test(line)) { - continue; - } else { - const id2 = extractIDfromText(line); - const timeString = id2.slice(0, 13); - const createdDate = require$$0.moment(timeString, "YYYYMMDDHHmmss"); - const deletedDateID = extractDeleteDatefromText(fileLines[i]); - const deletedDate = require$$0.moment(deletedDateID.slice(0, 13), "YYYYMMDDHHmmss"); - const content = extractContentfromText$1(fileLines[i]); - deletedMemos.push({ - id: deletedDateID, - content, - user_id: 1, - createdAt: createdDate.format("YYYY/MM/DD HH:mm:SS"), - updatedAt: createdDate.format("YYYY/MM/DD HH:mm:SS"), - deletedAt: deletedDate - }); - } - } - } - fileLines = null; - fileContents = null; - } - return deletedMemos; -} -const sendMemoToDelete = async (memoContent) => { - const { metadataCache, vault } = appStore.getState().dailyNotesState.app; - const filePath = getDailyNotePath(); - const absolutePath = filePath + "/delete.md"; - const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath); - if (deleteFile instanceof require$$0.TFile) { - const fileContents = await vault.read(deleteFile); - const fileLines = getAllLinesFromFile$3(fileContents); - const date = require$$0.moment(); - const deleteDate = date.format("YYYY/MM/DD HH:mm:ss"); - let lineNum; - if (fileLines.length === 1 && fileLines[0] === "") { - lineNum = 1; - } else { - lineNum = fileLines.length + 1; - } - const deleteDateID = date.format("YYYYMMDDHHmmss") + lineNum; - await createDeleteMemoInFile(deleteFile, fileContents, memoContent, deleteDateID); - return deleteDate; - } else { - const deleteFilePath = require$$0.normalizePath(absolutePath); - const file = await createdeleteFile(deleteFilePath); - const date = require$$0.moment(); - const deleteDate = date.format("YYYY/MM/DD HH:mm:ss"); - const lineNum = 1; - const deleteDateID = date.format("YYYYMMDDHHmmss") + lineNum; - await createDeleteMemoInFile(file, "", memoContent, deleteDateID); - return deleteDate; - } -}; -const createDeleteMemoInFile = async (file, fileContent, memoContent, deleteDate) => { - const { vault } = appStore.getState().dailyNotesState.app; - let newContent; - if (fileContent === "") { - newContent = memoContent + " deletedAt: " + deleteDate; - } else { - newContent = fileContent + "\n" + memoContent + " deletedAt: " + deleteDate; - } - await vault.modify(file, newContent); - return true; -}; -const createdeleteFile = async (path) => { - const { vault } = appStore.getState().dailyNotesState.app; - try { - const createdFile = await vault.create(path, ""); - return createdFile; - } catch (err) { - console.error(`Failed to create file: '${path}'`, err); - new require$$0.Notice("Unable to create new file."); - } -}; -const getAllLinesFromFile$3 = (cache) => cache.split(/\r?\n/); -const extractIDfromText = (line) => { - var _a; - return (_a = /^- (\d{14})(\d+)\s(.+)\s(deletedAt: )(.+)$/.exec(line)) == null ? void 0 : _a[1]; -}; -const extractContentfromText$1 = (line) => { - var _a; - return (_a = /^- (\d+)\s(.+)\s(deletedAt: )(.+)$/.exec(line)) == null ? void 0 : _a[2]; -}; -const extractDeleteDatefromText = (line) => { - var _a; - return (_a = /^- (\d+)\s(.+)\s(deletedAt: )(.+)$/.exec(line)) == null ? void 0 : _a[4]; -}; -async function obHideMemo(memoid) { - const { dailyNotes } = dailyNotesService.getState(); - if (/\d{14,}/.test(memoid)) { - const { vault } = appStore.getState().dailyNotesState.app; - const timeString = memoid.slice(0, 13); - const idString = parseInt(memoid.slice(14)); - const changeDate = require$$0.moment(timeString, "YYYYMMDDHHmmSS"); - const dailyNote = getDailyNote_1(changeDate, dailyNotes); - const fileContent = await vault.read(dailyNote); - const fileLines = getAllLinesFromFile$2(fileContent); - const content = extractContentfromText(fileLines[idString]); - const originalLine = "- " + memoid + " " + content; - const newLine = fileLines[idString]; - const newFileContent = fileContent.replace(newLine, ""); - await vault.modify(dailyNote, newFileContent); - const deleteDate = await sendMemoToDelete(originalLine); - return deleteDate; - } -} -const getAllLinesFromFile$2 = (cache) => cache.split(/\r?\n/); -const extractContentfromText = (line) => { - var _a; - let regexMatch; - if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) { - regexMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\)?((\\d{1,2})\\:(\\d{2}))?(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$"); - } else { - regexMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?(\\)?((\\d{1,2})\\:(\\d{2}))?(\\<\\/time\\>)?\\s?(.*)$"; - } - const regexMatchRe = new RegExp(regexMatch, ""); - return (_a = regexMatchRe.exec(line)) == null ? void 0 : _a[8]; -}; -async function deleteQueryForever(queryID) { - const { vault, metadataCache } = appStore.getState().dailyNotesState.app; - if (/\d{14,}/.test(queryID)) { - const filePath = getDailyNotePath(); - const absolutePath = filePath + "/query.md"; - const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath); - if (queryFile instanceof require$$0.TFile) { - let fileContents = await vault.read(queryFile); - let fileLines = getAllLinesFromFile$1(fileContents); - if (fileLines.length === 0) { - return; - } else { - const lineNum = parseInt(queryID.slice(14)); - const line = fileLines[lineNum - 1]; - if (/^\d{14,}(.+)$/.test(line)) { - const newFileContent = fileContents.replace(line, ""); - await vault.modify(queryFile, newFileContent); - } - } - fileLines = null; - fileContents = null; - } - } -} -const getAllLinesFromFile$1 = (cache) => cache.split(/\r?\n/); -const pinQueryInFile = async (queryID) => { - const { metadataCache, vault } = appStore.getState().dailyNotesState.app; - if (/\d{14,}/.test(queryID)) { - const filePath = getDailyNotePath(); - const absolutePath = filePath + "/query.md"; - const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath); - if (queryFile instanceof require$$0.TFile) { - const fileContents = await vault.read(queryFile); - const fileLines = getAllLinesFromFile(fileContents); - const date = require$$0.moment(); - const originalLineNum = parseInt(queryID.slice(14)); - const originalContent = fileLines[originalLineNum - 1]; - const pinnedAtDate = date.format("YYYY/MM/DD HH:mm:ss"); - let lineNum; - if (fileLines.length === 1 && fileLines[0] === "") { - lineNum = 1; - } else { - lineNum = fileLines.length + 1; - } - const pinnedAtDateID = date.format("YYYYMMDDHHmmss") + lineNum; - const newQuery = originalContent + " pinnedAt: " + pinnedAtDateID; - const newContent = fileContents.replace(originalContent, newQuery); - await vault.modify(queryFile, newContent); - return pinnedAtDate; - } - } -}; -const unpinQueryInFile = async (queryID) => { - const { metadataCache, vault } = appStore.getState().dailyNotesState.app; - const filePath = getDailyNotePath(); - const absolutePath = filePath + "/query.md"; - const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath); - if (queryFile instanceof require$$0.TFile) { - const fileContents = await vault.read(queryFile); - const fileLines = getAllLinesFromFile(fileContents); - const originalLineNum = parseInt(queryID.slice(14)); - const originalContent = fileLines[originalLineNum - 1]; - const pinnedAtString = extractPinnedAtfromText(originalContent); - const newFileContents = fileContents.replace(pinnedAtString, ""); - await vault.modify(queryFile, newFileContents); - } - return; -}; -const getAllLinesFromFile = (cache) => cache.split(/\r?\n/); -const extractPinnedAtfromText = (line) => { - var _a; - return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])(\spinnedAt\: (\d{14,}))$/.exec(line)) == null ? void 0 : _a[6]; -}; -var api; -(function(api2) { - function getUserInfo() { - } - api2.getUserInfo = getUserInfo; - function checkUsernameUsable(username) { - } - api2.checkUsernameUsable = checkUsernameUsable; - function checkPasswordValid(password) { - } - api2.checkPasswordValid = checkPasswordValid; - function updateUserinfo(userinfo) { - } - api2.updateUserinfo = updateUserinfo; - async function getMyMemos() { - return await getMemos(); - } - api2.getMyMemos = getMyMemos; - function getMyDeletedMemos() { - return getDeletedMemos(); - } - api2.getMyDeletedMemos = getMyDeletedMemos; - function hideMemo(memoId) { - return obHideMemo(memoId); - } - api2.hideMemo = hideMemo; - function restoreMemo(memoId) { - return restoreDeletedMemo(memoId); - } - api2.restoreMemo = restoreMemo; - function deleteMemo(memoId) { - return deleteForever(memoId); - } - api2.deleteMemo = deleteMemo; - function getMyQueries() { - return findQuery(); - } - api2.getMyQueries = getMyQueries; - function createQuery(title, querystring) { - return createObsidianQuery(title, querystring); - } - api2.createQuery = createQuery; - function updateQuery(queryId, title, querystring) { - return updateObsidianQuery(queryId, title, querystring); - } - api2.updateQuery = updateQuery; - function deleteQueryById(queryId) { - return deleteQueryForever(queryId); - } - api2.deleteQueryById = deleteQueryById; - function pinQuery(queryId) { - return pinQueryInFile(queryId); - } - api2.pinQuery = pinQuery; - function unpinQuery(queryId) { - return unpinQueryInFile(queryId); - } - api2.unpinQuery = unpinQuery; -})(api || (api = {})); -var api$1 = api; -const SHOW_SIDERBAR_MOBILE_CLASSNAME = "mobile-show-sidebar"; -const ANIMATION_DURATION = 200; -const DAILY_TIMESTAMP = 3600 * 24 * 1e3; -const TAG_REG = /\s#([\p{Letter}\p{Emoji_Presentation}\p{Number}\/_-]+)/gu; -const FIRST_TAG_REG = /(

|
)#([\p{Letter}\p{Emoji_Presentation}\p{Number}\/_-]+)/gu; -const NOP_FIRST_TAG_REG = /^#([\p{Letter}\p{Emoji_Presentation}\p{Number}\/_-]+)/gu; -const LINK_REG = /(\s|:|>|^)((http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-]))/g; -const MD_LINK_REG = /\[([\s\S]*?)\]\(([\s\S]*?)\)/gu; -const IMAGE_URL_REG = /([^\s<\\*>']+\.(jpeg|jpg|gif|png|svg))(\]\])?(\))?/g; -const MARKDOWN_URL_REG = /(!\[([^\]]*)(\|)?(.*?)\]\((.*?)("(?:.*[^"])")?\s*\))/g; -const MARKDOWN_WEB_URL_REG = /(\s|:|^)(http[s]?:\/\/)([^\/\s]+\/)(\S*?)(jpeg|jpg|gif|png|svg|bmp|wepg)(?!\))/g; -const WIKI_IMAGE_URL_REG = /!\[\[((.*?)\.(jpeg|jpg|gif|png|svg|bmp|wepg))?(\|)?(.*?)\]\]/g; -const MEMO_LINK_REG = /\[@(.+?)\]\((.+?)\)/g; -class MemoService { - constructor() { - __publicField(this, "initialized", false); - } - getState() { - return appStore.getState().memoState; - } - async fetchAllMemos() { - const data = await api$1.getMyMemos(); - const memos = []; - for (const m2 of data) { - memos.push(m2); - } - appStore.dispatch({ - type: "SET_MEMOS", - payload: { - memos - } - }); - if (!this.initialized) { - this.initialized = true; - } - return memos; - } - async fetchDeletedMemos() { - const data = await api$1.getMyDeletedMemos(); - data.sort((a, b) => utils$1.getTimeStampByDate(b.deletedAt) - utils$1.getTimeStampByDate(a.deletedAt)); - return data; - } - pushMemo(memo2) { - appStore.dispatch({ - type: "INSERT_MEMO", - payload: { - memo: __spreadValues({}, memo2) - } - }); - } - getMemoById(id2) { - for (const m2 of this.getState().memos) { - if (m2.id === id2) { - return m2; - } - } - return null; - } - async hideMemoById(id2) { - await api$1.hideMemo(id2); - appStore.dispatch({ - type: "DELETE_MEMO_BY_ID", - payload: { - id: id2 - } - }); - } - async restoreMemoById(id2) { - await api$1.restoreMemo(id2); - } - async deleteMemoById(id2) { - await api$1.deleteMemo(id2); - } - editMemo(memo2) { - appStore.dispatch({ - type: "EDIT_MEMO", - payload: memo2 - }); - } - updateTagsState() { - var _a, _b, _c; - const { memos } = this.getState(); - const tagsSet = new Set(); - for (const m2 of memos) { - for (const t2 of Array.from((_a = m2.content.match(TAG_REG)) != null ? _a : [])) { - tagsSet.add(t2.replace(TAG_REG, "$1").trim()); - } - for (const t2 of Array.from((_b = m2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) { - tagsSet.add(t2.replace(NOP_FIRST_TAG_REG, "$1").trim()); - } - for (const t2 of Array.from((_c = m2.content.match(FIRST_TAG_REG)) != null ? _c : [])) { - tagsSet.add(t2.replace(FIRST_TAG_REG, "$2").trim()); - } - } - appStore.dispatch({ - type: "SET_TAGS", - payload: { - tags: Array.from(tagsSet) - } - }); - } - clearMemos() { - appStore.dispatch({ - type: "SET_MEMOS", - payload: { - memos: [] - } - }); - } - async getLinkedMemos(memoId) { - const { memos } = this.getState(); - return memos.filter((m2) => m2.content.includes(memoId)); - } - async createMemo(text, isList2) { - const memo2 = await waitForInsert(text, isList2); - return memo2; - } - async updateMemo(memoId, originalText, text, type) { - const memo2 = await changeMemo(memoId, originalText, text, type); - return memo2; - } -} -const memoService = new MemoService(); -class QueryService { - getState() { - return appStore.getState().queryState; - } - async getMyAllQueries() { - const data = await api$1.getMyQueries(); - appStore.dispatch({ - type: "SET_QUERIES", - payload: { - queries: data - } - }); - return data; - } - getQueryById(id2) { - for (const q2 of this.getState().queries) { - if (q2.id === id2) { - return q2; - } - } - } - pushQuery(query) { - appStore.dispatch({ - type: "INSERT_QUERY", - payload: { - query: __spreadValues({}, query) - } - }); - } - editQuery(query) { - appStore.dispatch({ - type: "UPDATE_QUERY", - payload: query - }); - } - async deleteQuery(queryId) { - await api$1.deleteQueryById(queryId); - appStore.dispatch({ - type: "DELETE_QUERY_BY_ID", - payload: { - id: queryId - } - }); - } - async createQuery(title, querystring) { - const data = await api$1.createQuery(title, querystring); - return data; - } - async updateQuery(queryId, title, querystring) { - const data = await api$1.updateQuery(queryId, title, querystring); - return data; - } - async pinQuery(queryId) { - await api$1.pinQuery(queryId); - } - async unpinQuery(queryId) { - await api$1.unpinQuery(queryId); - } -} -const queryService = new QueryService(); -class ResourceService { - async upload(file) { - const { vault, fileManager } = appStore.getState().dailyNotesState.app; - const fileArray = await file.arrayBuffer(); - const ext = getExt(file.type); - const dailyNotes = getAllDailyNotes_1(); - const date = require$$0.moment(); - const existingFile = getDailyNote_1(date, dailyNotes); - let newFile; - if (!existingFile) { - const dailyFile = await createDailyNote_1(date); - newFile = await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, dailyFile), fileArray); - } else if (existingFile instanceof require$$0.TFile) { - newFile = await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, existingFile), fileArray); - } - const newFilePath = fileManager.generateMarkdownLink(newFile, newFile.path, "", ""); - return newFilePath; - } -} -const getExt = (line) => { - var _a; - return (_a = /^image\/(.+)$/.exec(line)) == null ? void 0 : _a[1]; -}; -const resourceService = new ResourceService(); -const getInitialAction = () => { - return { - type: "initialText", - value: "", - timestamp: Date.now(), - selectionStart: 0, - selectionEnd: 0 - }; -}; -const defaultConfig = { - initialValue: "", - interval: 300 -}; -class TinyUndo { - constructor(element, config = defaultConfig) { - this.listeners = []; - this.runUndo = () => { - const cursorPosition = this.actions[this.currentIndex].selectionStart; - if (this.currentIndex > 0) { - this.currentIndex--; - } - this.element.value = this.actions[this.currentIndex].value; - this.element.setSelectionRange(cursorPosition, cursorPosition); - this.dispatchChange(); - }; - this.runRedo = () => { - if (this.currentIndex < this.actions.length - 1) { - this.currentIndex++; - } - const cursorPosition = this.actions[this.currentIndex].selectionEnd; - this.element.value = this.actions[this.currentIndex].value; - this.element.setSelectionRange(cursorPosition, cursorPosition); - this.dispatchChange(); - }; - this.getActions = () => { - return this.actions; - }; - this.setState = (actions, index) => { - this.actions = [...actions]; - this.currentIndex = index < this.actions.length ? index : this.actions.length - 1; - this.dispatchChange(); - }; - this.resetState = () => { - this.actions = [getInitialAction()]; - this.currentIndex = 0; - this.dispatchChange(); - }; - this.destroy = () => { - this.rmEventListeners(); - }; - this.subscribe = (callback) => { - this.listeners.push(callback); - }; - this.handleElementKeydown = (event) => { - const keyboardEvent = event; - if (keyboardEvent.key === "z" && !keyboardEvent.shiftKey && (keyboardEvent.metaKey || keyboardEvent.ctrlKey)) { - event.preventDefault(); - this.runUndo(); - } else if (keyboardEvent.key === "z" && keyboardEvent.shiftKey && (keyboardEvent.metaKey || keyboardEvent.ctrlKey) || keyboardEvent.key === "y" && (keyboardEvent.metaKey || keyboardEvent.ctrlKey)) { - event.preventDefault(); - this.runRedo(); - } - }; - this.handleElementInput = (event) => { - const inputEvent = event; - const lastAction = this.actions[this.currentIndex]; - this.pushNewAction({ - type: inputEvent.inputType, - value: this.element.value, - timestamp: Date.now(), - selectionStart: this.element.selectionEnd - (this.element.value.length - lastAction.value.length), - selectionEnd: this.element.selectionEnd - }); - }; - this.addEventListeners = () => { - this.element.addEventListener("keydown", this.handleElementKeydown); - this.element.addEventListener("input", this.handleElementInput); - }; - this.rmEventListeners = () => { - this.element.removeEventListener("keydown", this.handleElementKeydown); - this.element.removeEventListener("input", this.handleElementInput); - }; - this.pushNewAction = (action) => { - const lastAction = this.actions[this.currentIndex]; - if (lastAction && lastAction.type === action.type && action.timestamp - lastAction.timestamp < this.config.interval) { - this.actions[this.currentIndex] = Object.assign(Object.assign({}, lastAction), { value: action.value, selectionEnd: action.selectionEnd, timestamp: action.timestamp }); - } else { - if (this.config.maxSize && this.currentIndex >= this.config.maxSize) { - this.actions.shift(); - this.actions[0] = getInitialAction(); - } else { - this.currentIndex++; - } - this.actions[this.currentIndex] = action; - this.actions = this.actions.slice(0, this.currentIndex + 1); - } - this.dispatchChange(); - }; - this.dispatchChange = () => { - for (const cb2 of this.listeners) { - cb2([...this.actions], this.currentIndex); - } - }; - this.element = element; - this.config = Object.assign(Object.assign({}, defaultConfig), config); - if (this.config.initialActions && this.config.initialActions.length > 0) { - this.actions = this.config.initialActions; - if (this.config.initialIndex !== void 0 && this.config.initialIndex < this.actions.length) { - this.currentIndex = this.config.initialIndex; - } else { - this.currentIndex = this.actions.length - 1; - } - } else { - this.actions = [getInitialAction()]; - this.currentIndex = 0; - if (this.config.initialValue !== "") { - this.actions.push({ - type: "insertText", - value: this.config.initialValue, - timestamp: Date.now(), - selectionStart: 0, - selectionEnd: this.config.initialValue.length - }); - this.currentIndex++; - } - } - this.element.value = this.actions[this.currentIndex].value; - this.addEventListeners(); - } -} -function useRefresh() { - const [, setBoolean] = _react_17_0_2_react.exports.useState(false); - const refresh = _react_17_0_2_react.exports.useCallback(() => { - setBoolean((ps) => { - return !ps; - }); - }, []); - return refresh; -} -var jsxRuntime = { exports: {} }; -var reactJsxRuntime_production_min = {}; -/** @license React v17.0.2 - * react-jsx-runtime.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ -var f = _react_17_0_2_react.exports, g = 60103; -reactJsxRuntime_production_min.Fragment = 60107; -if (typeof Symbol === "function" && Symbol.for) { - var h = Symbol.for; - g = h("react.element"); - reactJsxRuntime_production_min.Fragment = h("react.fragment"); -} -var m = f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, n = Object.prototype.hasOwnProperty, p = { key: true, ref: true, __self: true, __source: true }; -function q(c, a, k) { - var b, d = {}, e = null, l2 = null; - k !== void 0 && (e = "" + k); - a.key !== void 0 && (e = "" + a.key); - a.ref !== void 0 && (l2 = a.ref); - for (b in a) - n.call(a, b) && !p.hasOwnProperty(b) && (d[b] = a[b]); - if (c && c.defaultProps) - for (b in a = c.defaultProps, a) - d[b] === void 0 && (d[b] = a[b]); - return { $$typeof: g, type: c, key: e, ref: l2, props: d, _owner: m.current }; -} -reactJsxRuntime_production_min.jsx = q; -reactJsxRuntime_production_min.jsxs = q; -{ - jsxRuntime.exports = reactJsxRuntime_production_min; -} -const jsx = jsxRuntime.exports.jsx; -const jsxs = jsxRuntime.exports.jsxs; -const Fragment = jsxRuntime.exports.Fragment; -const OnlyWhen = (props) => { - const { - children, - when - } = props; - return when ? /* @__PURE__ */ jsx(Fragment, { - children - }) : null; -}; -const Only = OnlyWhen; -var editor = ""; -var _textareaCaret_3_0_2_textareaCaret = { exports: {} }; -(function(module2) { - (function() { - var properties = [ - "direction", - "boxSizing", - "width", - "height", - "overflowX", - "overflowY", - "borderTopWidth", - "borderRightWidth", - "borderBottomWidth", - "borderLeftWidth", - "borderStyle", - "paddingTop", - "paddingRight", - "paddingBottom", - "paddingLeft", - "fontStyle", - "fontVariant", - "fontWeight", - "fontStretch", - "fontSize", - "fontSizeAdjust", - "lineHeight", - "fontFamily", - "textAlign", - "textTransform", - "textIndent", - "textDecoration", - "letterSpacing", - "wordSpacing", - "tabSize", - "MozTabSize" - ]; - var isBrowser = typeof window !== "undefined"; - var isFirefox = isBrowser && window.mozInnerScreenX != null; - function getCaretCoordinates2(element, position, options) { - if (!isBrowser) { - throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser"); - } - var debug = options && options.debug || false; - if (debug) { - var el = document.querySelector("#input-textarea-caret-position-mirror-div"); - if (el) { - el.parentNode.removeChild(el); - } - } - var div = document.createElement("div"); - div.id = "input-textarea-caret-position-mirror-div"; - document.body.appendChild(div); - var style = div.style; - var computed = window.getComputedStyle ? getComputedStyle(element) : element.currentStyle; - style.whiteSpace = "pre-wrap"; - if (element.nodeName !== "INPUT") - style.wordWrap = "break-word"; - style.position = "absolute"; - if (!debug) - style.visibility = "hidden"; - properties.forEach(function(prop) { - style[prop] = computed[prop]; - }); - if (isFirefox) { - if (element.scrollHeight > parseInt(computed.height)) - style.overflowY = "scroll"; - } else { - style.overflow = "hidden"; - } - div.textContent = element.value.substring(0, position); - if (element.nodeName === "INPUT") - div.textContent = div.textContent.replace(/\s/g, "\xA0"); - var span = document.createElement("span"); - span.textContent = element.value.substring(position) || "."; - div.appendChild(span); - var coordinates = { - top: span.offsetTop + parseInt(computed["borderTopWidth"]), - left: span.offsetLeft + parseInt(computed["borderLeftWidth"]) - }; - if (debug) { - span.style.backgroundColor = "#aaa"; - } else { - document.body.removeChild(div); - } - return coordinates; - } - { - module2.exports = getCaretCoordinates2; - } - })(); -})(_textareaCaret_3_0_2_textareaCaret); -var getCaretCoordinates = _textareaCaret_3_0_2_textareaCaret.exports; -var NativeCustomEvent = commonjsGlobal.CustomEvent; -function useNative() { - try { - var p2 = new NativeCustomEvent("cat", { detail: { foo: "bar" } }); - return p2.type === "cat" && p2.detail.foo === "bar"; - } catch (e) { - } - return false; -} -var _customEvent_1_0_1_customEvent = useNative() ? NativeCustomEvent : typeof document !== "undefined" && typeof document.createEvent === "function" ? function CustomEvent(type, params) { - var e = document.createEvent("CustomEvent"); - if (params) { - e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail); - } else { - e.initCustomEvent(type, false, false, void 0); - } - return e; -} : function CustomEvent2(type, params) { - var e = document.createEventObject(); - e.type = type; - if (params) { - e.bubbles = Boolean(params.bubbles); - e.cancelable = Boolean(params.cancelable); - e.detail = params.detail; - } else { - e.bubbles = false; - e.cancelable = false; - e.detail = void 0; - } - return e; -}; -function _defineProperty$1(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - return obj; -} -function _objectSpread(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i] != null ? arguments[i] : {}; - var ownKeys2 = Object.keys(source); - if (typeof Object.getOwnPropertySymbols === "function") { - ownKeys2 = ownKeys2.concat(Object.getOwnPropertySymbols(source).filter(function(sym) { - return Object.getOwnPropertyDescriptor(source, sym).enumerable; - })); - } - ownKeys2.forEach(function(key) { - _defineProperty$1(target, key, source[key]); - }); - } - return target; -} -function _classCallCheck$1(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -} -function _defineProperties$1(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) - descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } -} -function _createClass$1(Constructor, protoProps, staticProps) { - if (protoProps) - _defineProperties$1(Constructor.prototype, protoProps); - if (staticProps) - _defineProperties$1(Constructor, staticProps); - return Constructor; -} -function _typeof2(obj) { - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof2 = function _typeof22(obj2) { - return typeof obj2; - }; - } else { - _typeof2 = function _typeof22(obj2) { - return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2; - }; - } - return _typeof2(obj); -} -function _typeof$1(obj) { - if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") { - _typeof$1 = function _typeof3(obj2) { - return _typeof2(obj2); - }; - } else { - _typeof$1 = function _typeof3(obj2) { - return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : _typeof2(obj2); - }; - } - return _typeof$1(obj); -} -function _assertThisInitialized$1(self2) { - if (self2 === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - return self2; -} -function _possibleConstructorReturn$1(self2, call) { - if (call && (_typeof$1(call) === "object" || typeof call === "function")) { - return call; - } - return _assertThisInitialized$1(self2); -} -function _getPrototypeOf$1(o) { - _getPrototypeOf$1 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) { - return o2.__proto__ || Object.getPrototypeOf(o2); - }; - return _getPrototypeOf$1(o); -} -function _setPrototypeOf$1(o, p2) { - _setPrototypeOf$1 = Object.setPrototypeOf || function _setPrototypeOf2(o2, p3) { - o2.__proto__ = p3; - return o2; - }; - return _setPrototypeOf$1(o, p2); -} -function _inherits$1(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }); - if (superClass) - _setPrototypeOf$1(subClass, superClass); -} -function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { - arr2[i] = arr[i]; - } - return arr2; - } -} -function _iterableToArray(iter) { - if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") - return Array.from(iter); -} -function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance"); -} -function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); -} -var KEY_CODES = { - ESC: 27, - UP: 38, - DOWN: 40, - LEFT: 37, - RIGHT: 39, - ENTER: 13, - TAB: 9 -}; -var Listener = function Listener2() { - var _this = this; - _classCallCheck$1(this, Listener2); - this.startListen = function(ref) { - if (!ref) - return; - ref.addEventListener("keydown", _this.f); - }; - this.stopListen = function(ref) { - if (!ref) - return; - ref.removeEventListener("keydown", _this.f); - }; - this.add = function(keyCodes, fn2) { - var keyCode = keyCodes; - if (typeof keyCode !== "object") - keyCode = [keyCode]; - _this.listeners[_this.index] = { - keyCode, - fn: fn2 - }; - return _this.index++; - }; - this.remove = function(id2) { - delete _this.listeners[id2]; - }; - this.removeAll = function() { - _this.listeners = {}; - _this.index = 1; - }; - this.index = 1; - this.listeners = {}; - this.f = function(e) { - if (!e) - return; - var code = e.keyCode || e.which; - Object.values(_this.listeners).forEach(function(_ref) { - var keyCode = _ref.keyCode, fn2 = _ref.fn; - if (keyCode.includes(code)) { - e.stopPropagation(); - e.preventDefault(); - fn2(e); - } - }); - }; -}; -var Listeners = new Listener(); -var Item = /* @__PURE__ */ function(_React$Component) { - _inherits$1(Item2, _React$Component); - function Item2() { - var _getPrototypeOf2; - var _this; - _classCallCheck$1(this, Item2); - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - _this = _possibleConstructorReturn$1(this, (_getPrototypeOf2 = _getPrototypeOf$1(Item2)).call.apply(_getPrototypeOf2, [this].concat(args))); - _this.selectItem = function() { - var _this$props = _this.props, item = _this$props.item, onSelectHandler = _this$props.onSelectHandler; - onSelectHandler(item); - }; - return _this; - } - _createClass$1(Item2, [{ - key: "shouldComponentUpdate", - value: function shouldComponentUpdate(nextProps) { - if (this.props.item !== nextProps.item || this.props.selected !== nextProps.selected || this.props.style !== nextProps.style || this.props.className !== nextProps.className) { - return true; - } - return false; - } - }, { - key: "render", - value: function render() { - var _this2 = this; - var _this$props2 = this.props, Component = _this$props2.component, style = _this$props2.style, onClickHandler = _this$props2.onClickHandler, item = _this$props2.item, selected = _this$props2.selected, className = _this$props2.className, innerRef = _this$props2.innerRef; - return React$1.createElement("li", { - className: "rta__item ".concat(selected === true ? "rta__item--selected" : "", " ").concat(className || ""), - style - }, React$1.createElement("div", { - className: "rta__entity ".concat(selected === true ? "rta__entity--selected" : ""), - role: "button", - tabIndex: 0, - onClick: onClickHandler, - onFocus: this.selectItem, - onMouseEnter: this.selectItem, - onTouchStart: function onTouchStart() { - _this2.clicked = true; - _this2.selectItem(); - }, - onTouchEnd: function onTouchEnd(e) { - e.preventDefault(); - if (_this2.clicked) { - onClickHandler(e); - } - }, - onTouchMove: function onTouchMove() { - _this2.clicked = false; - }, - onTouchCancel: function onTouchCancel() { - _this2.clicked = false; - }, - ref: innerRef - }, React$1.createElement(Component, { - selected, - entity: item - }))); - } - }]); - return Item2; -}(React$1.Component); -var List = /* @__PURE__ */ function(_React$Component) { - _inherits$1(List2, _React$Component); - function List2() { - var _getPrototypeOf2; - var _this; - _classCallCheck$1(this, List2); - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - _this = _possibleConstructorReturn$1(this, (_getPrototypeOf2 = _getPrototypeOf$1(List2)).call.apply(_getPrototypeOf2, [this].concat(args))); - _this.state = { - selectedItem: null - }; - _this.cachedIdOfItems = new Map(); - _this.onPressEnter = function(e) { - if (typeof e !== "undefined") { - e.preventDefault(); - } - var values = _this.props.values; - _this.modifyText(values[_this.getPositionInList()]); - }; - _this.getPositionInList = function() { - var values = _this.props.values; - var selectedItem = _this.state.selectedItem; - if (!selectedItem) - return 0; - return values.findIndex(function(a) { - return _this.getId(a) === _this.getId(selectedItem); - }); - }; - _this.getId = function(item) { - if (_this.cachedIdOfItems.has(item)) { - return _this.cachedIdOfItems.get(item); - } - var textToReplace = _this.props.getTextToReplace(item); - var computeId = function computeId2() { - if (textToReplace) { - if (textToReplace.key) { - return textToReplace.key; - } - if (typeof item === "string" || !item.key) { - return textToReplace.text; - } - } - if (!item.key) { - throw new Error("Item ".concat(JSON.stringify(item), ' has to have defined "key" property')); - } - return item.key; - }; - var id2 = computeId(); - _this.cachedIdOfItems.set(item, id2); - return id2; - }; - _this.listeners = []; - _this.itemsRef = {}; - _this.modifyText = function(value) { - if (!value) - return; - var onSelect = _this.props.onSelect; - onSelect(value); - }; - _this.selectItem = function(item) { - var keyboard = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false; - var onItemHighlighted = _this.props.onItemHighlighted; - if (_this.state.selectedItem === item) - return; - _this.setState({ - selectedItem: item - }, function() { - onItemHighlighted(item); - if (keyboard) { - _this.props.dropdownScroll(_this.itemsRef[_this.getId(item)]); - } - }); - }; - _this.scroll = function(e) { - e.preventDefault(); - var values = _this.props.values; - var code = e.keyCode || e.which; - var oldPosition = _this.getPositionInList(); - var newPosition; - switch (code) { - case KEY_CODES.DOWN: - newPosition = oldPosition + 1; - break; - case KEY_CODES.UP: - newPosition = oldPosition - 1; - break; - default: - newPosition = oldPosition; - break; - } - newPosition = (newPosition % values.length + values.length) % values.length; - _this.selectItem(values[newPosition], [KEY_CODES.DOWN, KEY_CODES.UP].includes(code)); - }; - _this.isSelected = function(item) { - var selectedItem = _this.state.selectedItem; - if (!selectedItem) - return false; - return _this.getId(selectedItem) === _this.getId(item); - }; - return _this; - } - _createClass$1(List2, [{ - key: "componentDidMount", - value: function componentDidMount() { - this.listeners.push(Listeners.add([KEY_CODES.DOWN, KEY_CODES.UP], this.scroll), Listeners.add([KEY_CODES.ENTER, KEY_CODES.TAB], this.onPressEnter)); - var values = this.props.values; - if (values && values[0]) - this.selectItem(values[0]); - } - }, { - key: "componentDidUpdate", - value: function componentDidUpdate(_ref) { - var _this2 = this; - var oldValues = _ref.values; - var values = this.props.values; - var oldValuesSerialized = oldValues.map(function(val) { - return _this2.getId(val); - }).join(""); - var newValuesSerialized = values.map(function(val) { - return _this2.getId(val); - }).join(""); - if (oldValuesSerialized !== newValuesSerialized && values && values[0]) { - this.selectItem(values[0]); - } - } - }, { - key: "componentWillUnmount", - value: function componentWillUnmount() { - var listener; - while (this.listeners.length) { - listener = this.listeners.pop(); - Listeners.remove(listener); - } - } - }, { - key: "render", - value: function render() { - var _this3 = this; - var _this$props = this.props, values = _this$props.values, component = _this$props.component, style = _this$props.style, itemClassName = _this$props.itemClassName, className = _this$props.className, itemStyle = _this$props.itemStyle; - return React$1.createElement("ul", { - className: "rta__list ".concat(className || ""), - style - }, values.map(function(item) { - return React$1.createElement(Item, { - key: _this3.getId(item), - innerRef: function innerRef(ref) { - _this3.itemsRef[_this3.getId(item)] = ref; - }, - selected: _this3.isSelected(item), - item, - className: itemClassName, - style: itemStyle, - onClickHandler: _this3.onPressEnter, - onSelectHandler: _this3.selectItem, - component - }); - })); - } - }]); - return List2; -}(React$1.Component); -function defaultScrollToItem(container, item) { - var itemHeight = parseInt(getComputedStyle(item).getPropertyValue("height"), 10); - var containerHight = parseInt(getComputedStyle(container).getPropertyValue("height"), 10) - itemHeight; - var itemOffsetTop = item.offsetTop; - var actualScrollTop = container.scrollTop; - if (itemOffsetTop < actualScrollTop + containerHight && actualScrollTop < itemOffsetTop) { - return; - } - container.scrollTop = itemOffsetTop; -} -var DEFAULT_CARET_POSITION = "next"; -var POSITION_CONFIGURATION = { - X: { - LEFT: "rta__autocomplete--left", - RIGHT: "rta__autocomplete--right" - }, - Y: { - TOP: "rta__autocomplete--top", - BOTTOM: "rta__autocomplete--bottom" - } -}; -var errorMessage = function errorMessage2(message) { - return console.error("RTA: dataProvider fails: ".concat(message, "\n \nCheck the documentation or create issue if you think it's bug. https://github.com/webscopeio/react-textarea-autocomplete/issues")); -}; -var reservedRegexChars = [".", "^", "$", "*", "+", "-", "?", "(", ")", "[", "]", "{", "}", "\\", "|"]; -var escapeRegex = function escapeRegex2(text) { - return _toConsumableArray(text).map(function(character) { - return reservedRegexChars.includes(character) ? "\\".concat(character) : character; - }).join(""); -}; -var Autocomplete = /* @__PURE__ */ function(_React$Component) { - _inherits$1(Autocomplete2, _React$Component); - function Autocomplete2() { - _classCallCheck$1(this, Autocomplete2); - return _possibleConstructorReturn$1(this, _getPrototypeOf$1(Autocomplete2).apply(this, arguments)); - } - _createClass$1(Autocomplete2, [{ - key: "componentDidMount", - value: function componentDidMount() { - var boundariesElement = this.props.boundariesElement; - if (typeof boundariesElement === "string") { - var elem = document.querySelector(boundariesElement); - if (!elem) { - throw new Error("RTA: Invalid prop boundariesElement: it has to be string or HTMLElement."); - } - this.containerElem = elem; - } else if (boundariesElement instanceof HTMLElement) { - this.containerElem = boundariesElement; - } else { - throw new Error("RTA: Invalid prop boundariesElement: it has to be string or HTMLElement."); - } - if (!this.containerElem || !this.containerElem.contains(this.ref)) { - { - throw new Error("RTA: Invalid prop boundariesElement: it has to be one of the parents of the RTA."); - } - } - } - }, { - key: "componentDidUpdate", - value: function componentDidUpdate() { - var _this$ref$classList, _this$ref$classList2; - var top2 = this.props.top || 0; - var left2 = this.props.left || 0; - var usedClasses = []; - var unusedClasses = []; - var topPosition = 0; - var leftPosition = 0; - var containerBounds = this.containerElem.getBoundingClientRect(); - var dropdownBounds = this.ref.getBoundingClientRect(); - var textareaBounds = this.props.textareaRef.getBoundingClientRect(); - var computedStyle = window.getComputedStyle(this.ref); - var marginTop = parseInt(computedStyle.getPropertyValue("margin-top"), 10); - var marginBottom = parseInt(computedStyle.getPropertyValue("margin-bottom"), 10); - var marginLeft = parseInt(computedStyle.getPropertyValue("margin-left"), 10); - var marginRight = parseInt(computedStyle.getPropertyValue("margin-right"), 10); - var dropdownBottom = marginTop + marginBottom + textareaBounds.top + top2 + dropdownBounds.height; - var dropdownRight = marginLeft + marginRight + textareaBounds.left + left2 + dropdownBounds.width; - if (dropdownRight > containerBounds.right && textareaBounds.left + left2 > dropdownBounds.width) { - leftPosition = left2 - dropdownBounds.width; - usedClasses.push(POSITION_CONFIGURATION.X.LEFT); - unusedClasses.push(POSITION_CONFIGURATION.X.RIGHT); - } else { - leftPosition = left2; - usedClasses.push(POSITION_CONFIGURATION.X.RIGHT); - unusedClasses.push(POSITION_CONFIGURATION.X.LEFT); - } - if (dropdownBottom > containerBounds.bottom && textareaBounds.top + top2 > dropdownBounds.height) { - topPosition = top2 - dropdownBounds.height; - usedClasses.push(POSITION_CONFIGURATION.Y.TOP); - unusedClasses.push(POSITION_CONFIGURATION.Y.BOTTOM); - } else { - topPosition = top2; - usedClasses.push(POSITION_CONFIGURATION.Y.BOTTOM); - unusedClasses.push(POSITION_CONFIGURATION.Y.TOP); - } - if (this.props.renderToBody) { - topPosition += textareaBounds.top; - leftPosition += textareaBounds.left; - } - this.ref.style.top = "".concat(topPosition, "px"); - this.ref.style.left = "".concat(leftPosition, "px"); - (_this$ref$classList = this.ref.classList).remove.apply(_this$ref$classList, unusedClasses); - (_this$ref$classList2 = this.ref.classList).add.apply(_this$ref$classList2, usedClasses); - } - }, { - key: "render", - value: function render() { - var _this = this; - var _this$props = this.props, style = _this$props.style, className = _this$props.className, innerRef = _this$props.innerRef, children = _this$props.children, renderToBody = _this$props.renderToBody; - var body = document.body; - var autocompleteContainer = React$1.createElement("div", { - ref: function ref(_ref) { - _this.ref = _ref; - innerRef(_ref); - }, - className: "rta__autocomplete ".concat(className || ""), - style - }, children); - return renderToBody && body !== null ? ReactDOM$1.createPortal(autocompleteContainer, body) : autocompleteContainer; - } - }]); - return Autocomplete2; -}(React$1.Component); -var ReactTextareaAutocomplete = /* @__PURE__ */ function(_React$Component2) { - _inherits$1(ReactTextareaAutocomplete2, _React$Component2); - function ReactTextareaAutocomplete2(_props) { - var _this2; - _classCallCheck$1(this, ReactTextareaAutocomplete2); - _this2 = _possibleConstructorReturn$1(this, _getPrototypeOf$1(ReactTextareaAutocomplete2).call(this, _props)); - _this2.state = { - top: null, - left: null, - currentTrigger: null, - actualToken: "", - data: null, - value: "", - dataLoading: false, - selectionEnd: 0, - component: null, - textToReplace: null - }; - _this2.escListenerInit = function() { - if (!_this2.escListener) { - _this2.escListener = Listeners.add(KEY_CODES.ESC, _this2._closeAutocomplete); - } - }; - _this2.escListenerDestroy = function() { - if (_this2.escListener) { - Listeners.remove(_this2.escListener); - _this2.escListener = null; - } - }; - _this2.getSelectionPosition = function() { - if (!_this2.textareaRef) - return null; - return { - selectionStart: _this2.textareaRef.selectionStart, - selectionEnd: _this2.textareaRef.selectionEnd - }; - }; - _this2.getSelectedText = function() { - if (!_this2.textareaRef) - return null; - var _this2$textareaRef = _this2.textareaRef, selectionStart = _this2$textareaRef.selectionStart, selectionEnd = _this2$textareaRef.selectionEnd; - if (selectionStart === selectionEnd) - return null; - return _this2.state.value.substr(selectionStart, selectionEnd - selectionStart); - }; - _this2.setCaretPosition = function() { - var position = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0; - if (!_this2.textareaRef) - return; - _this2.textareaRef.focus(); - _this2.textareaRef.setSelectionRange(position, position); - }; - _this2.getCaretPosition = function() { - if (!_this2.textareaRef) { - return 0; - } - var position = _this2.textareaRef.selectionEnd; - return position; - }; - _this2._handleCaretChange = function(e) { - var cleanLastTrigger = function cleanLastTrigger2() { - var beforeHandle = _this2.getCaretPosition() - 1; - _this2.lastTrigger = _this2.lastTrigger ? beforeHandle : 0; - }; - if (e.type === "keydown") { - var code = e.keyCode || e.which; - switch (code) { - case KEY_CODES.UP: - case KEY_CODES.DOWN: - if (!_this2._isAutocompleteOpen()) { - cleanLastTrigger(); - } - break; - case KEY_CODES.LEFT: - case KEY_CODES.RIGHT: - cleanLastTrigger(); - break; - } - return; - } - cleanLastTrigger(); - }; - _this2._onSelect = function(item) { - var _this2$state = _this2.state, selectionEnd = _this2$state.selectionEnd, currentTrigger = _this2$state.currentTrigger, textareaValue = _this2$state.value; - var onItemSelected = _this2.props.onItemSelected; - if (!currentTrigger) - return; - var getTextToReplaceForCurrentTrigger = _this2._getTextToReplace(currentTrigger); - if (!getTextToReplaceForCurrentTrigger) { - _this2._closeAutocomplete(); - return; - } - var newToken = getTextToReplaceForCurrentTrigger(item); - if (!newToken) { - _this2._closeAutocomplete(); - return; - } - if (onItemSelected) { - onItemSelected({ - currentTrigger, - item - }); - } - var computeCaretPosition = function computeCaretPosition2(position, token, startToken) { - switch (position) { - case "start": - return startToken; - case "next": - case "end": - return startToken + token.length; - default: - if (!Number.isInteger(position)) { - throw new Error('RTA: caretPosition should be "start", "next", "end" or number.'); - } - return position; - } - }; - var textToModify = textareaValue.slice(0, selectionEnd); - var escapedCurrentTrigger = escapeRegex(currentTrigger); - var triggerOffset = textToModify.length - textToModify.lastIndexOf(currentTrigger); - var startOfTokenPosition = textToModify.search(new RegExp("(?!".concat(escapedCurrentTrigger, ")$"))) - triggerOffset; - var newTokenString = newToken.caretPosition === "next" ? "".concat(newToken.text, " ") : newToken.text; - var newCaretPosition = computeCaretPosition(newToken.caretPosition, newTokenString, startOfTokenPosition); - var modifiedText = textToModify.substring(0, startOfTokenPosition) + newTokenString; - var newValue = textareaValue.replace(textToModify, modifiedText); - _this2.setState({ - value: newValue, - dataLoading: false - }, function() { - var insertedTrigger = _this2.tokenRegExpEnding.exec(newTokenString); - var insertedTriggerModifier = insertedTrigger ? insertedTrigger[0].length : 1; - _this2.lastTrigger = newCaretPosition ? newCaretPosition - insertedTriggerModifier : newCaretPosition; - _this2.textareaRef.value = newValue; - _this2.textareaRef.selectionEnd = newCaretPosition; - _this2._changeHandler(); - var scrollTop = _this2.textareaRef.scrollTop; - _this2.setCaretPosition(newCaretPosition); - if (window.chrome) { - _this2.textareaRef.scrollTop = scrollTop; - } - }); - }; - _this2._getTextToReplace = function(currentTrigger) { - var triggerSettings = _this2.props.trigger[currentTrigger]; - if (!currentTrigger || !triggerSettings) - return null; - var output = triggerSettings.output; - return function(item) { - if (typeof item === "object" && (!output || typeof output !== "function")) { - throw new Error('Output functor is not defined! If you are using items as object you have to define "output" function. https://github.com/webscopeio/react-textarea-autocomplete#trigger-type'); - } - if (output) { - var textToReplace = output(item, currentTrigger); - if (textToReplace === void 0 || typeof textToReplace === "number") { - throw new Error('Output functor should return string or object in shape {text: string, caretPosition: string | number}.\nGot "'.concat(String(textToReplace), '". Check the implementation for trigger "').concat(currentTrigger, '"\n\nSee https://github.com/webscopeio/react-textarea-autocomplete#trigger-type for more information.\n')); - } - if (textToReplace === null) - return null; - if (typeof textToReplace === "string") { - return { - text: textToReplace, - caretPosition: DEFAULT_CARET_POSITION - }; - } - if (!textToReplace.text && typeof textToReplace.text !== "string") { - throw new Error('Output "text" is not defined! Object should has shape {text: string, caretPosition: string | number}. Check the implementation for trigger "'.concat(currentTrigger, '"\n')); - } - if (!textToReplace.caretPosition) { - throw new Error('Output "caretPosition" is not defined! Object should has shape {text: string, caretPosition: string | number}. Check the implementation for trigger "'.concat(currentTrigger, '"\n')); - } - return textToReplace; - } - if (typeof item !== "string") { - throw new Error("Output item should be string\n"); - } - return { - text: "".concat(currentTrigger).concat(item).concat(currentTrigger), - caretPosition: DEFAULT_CARET_POSITION - }; - }; - }; - _this2._getCurrentTriggerSettings = function() { - var currentTrigger = _this2.state.currentTrigger; - if (!currentTrigger) - return null; - return _this2.props.trigger[currentTrigger]; - }; - _this2._getValuesFromProvider = function() { - var _this2$state2 = _this2.state, currentTrigger = _this2$state2.currentTrigger, actualToken2 = _this2$state2.actualToken; - var triggerSettings = _this2._getCurrentTriggerSettings(); - if (!currentTrigger || !triggerSettings) { - return; - } - var dataProvider = triggerSettings.dataProvider, component = triggerSettings.component; - if (typeof dataProvider !== "function") { - throw new Error("Trigger provider has to be a function!"); - } - _this2.setState({ - dataLoading: true - }); - var providedData = dataProvider(actualToken2); - if (!(providedData instanceof Promise)) { - providedData = Promise.resolve(providedData); - } - providedData.then(function(data) { - if (!Array.isArray(data)) { - throw new Error("Trigger provider has to provide an array!"); - } - if (typeof component !== "function") { - throw new Error("Component should be defined!"); - } - if (currentTrigger !== _this2.state.currentTrigger) - return; - if (!data.length) { - _this2._closeAutocomplete(); - return; - } - _this2.setState({ - dataLoading: false, - data, - component - }); - }).catch(function(e) { - return errorMessage(e.message); - }); - }; - _this2._getSuggestions = function() { - var _this2$state3 = _this2.state, currentTrigger = _this2$state3.currentTrigger, data = _this2$state3.data; - if (!currentTrigger || !data || data && !data.length) - return null; - return data; - }; - _this2._createRegExp = function() { - var trigger = _this2.props.trigger; - _this2.tokenRegExp = new RegExp("(".concat(Object.keys(trigger).sort(function(a, b) { - if (a < b) { - return 1; - } - if (a > b) { - return -1; - } - return 0; - }).map(function(a) { - return escapeRegex(a); - }).join("|"), ")((?:(?!\\1)[^\\s])*$)")); - _this2.tokenRegExpEnding = new RegExp("(".concat(Object.keys(trigger).sort(function(a, b) { - if (a < b) { - return 1; - } - if (a > b) { - return -1; - } - return 0; - }).map(function(a) { - return escapeRegex(a); - }).join("|"), ")$")); - }; - _this2._closeAutocomplete = function() { - var currentTrigger = _this2.state.currentTrigger; - _this2.escListenerDestroy(); - _this2.setState({ - data: null, - dataLoading: false, - currentTrigger: null - }, function() { - if (currentTrigger) - _this2._onItemHighlightedHandler(null); - }); - }; - _this2._cleanUpProps = function() { - var props = _objectSpread({}, _this2.props); - var notSafe = ["loadingComponent", "boundariesElement", "containerStyle", "minChar", "scrollToItem", "ref", "innerRef", "onChange", "onCaretPositionChange", "className", "value", "trigger", "listStyle", "itemStyle", "containerStyle", "loaderStyle", "className", "containerClassName", "listClassName", "itemClassName", "loaderClassName", "dropdownStyle", "dropdownClassName", "movePopupAsYouType", "textAreaComponent", "renderToBody", "onItemSelected", "onItemHighlighted"]; - for (var prop in props) { - if (notSafe.includes(prop)) - delete props[prop]; - } - return props; - }; - _this2._changeHandler = function(e) { - var _this2$props = _this2.props, trigger = _this2$props.trigger, onChange = _this2$props.onChange, minChar = _this2$props.minChar, onCaretPositionChange = _this2$props.onCaretPositionChange, movePopupAsYouType = _this2$props.movePopupAsYouType; - var _this2$state4 = _this2.state, top2 = _this2$state4.top, left2 = _this2$state4.left; - var event = e; - if (!event) { - event = new _customEvent_1_0_1_customEvent("change", { - bubbles: true - }); - _this2.textareaRef.dispatchEvent(event); - } - var textarea = event.target || _this2.textareaRef; - var selectionEnd = textarea.selectionEnd; - var value = textarea.value; - _this2.lastValueBubbledEvent = value; - if (onChange && event) { - event.persist && event.persist(); - onChange(new Proxy(event, { - get: function get(original, prop, receiver) { - if (prop === "target") { - return textarea; - } - return Reflect.get(original, prop, receiver); - } - })); - } - if (onCaretPositionChange) { - var caretPosition = _this2.getCaretPosition(); - onCaretPositionChange(caretPosition); - } - _this2.setState({ - value - }); - var setTopLeft = function setTopLeft2() { - var _getCaretCoordinates = getCaretCoordinates(textarea, selectionEnd), newTop = _getCaretCoordinates.top, newLeft = _getCaretCoordinates.left; - _this2.setState({ - top: newTop - _this2.textareaRef.scrollTop || 0, - left: newLeft - }); - }; - var cleanLastTrigger = function cleanLastTrigger2(triggerLength) { - _this2.lastTrigger = selectionEnd - triggerLength; - _this2._closeAutocomplete(); - setTopLeft(); - }; - if (selectionEnd <= _this2.lastTrigger) { - var _affectedTextareaValue = value.slice(0, selectionEnd); - var _newTrigger = _this2.tokenRegExp.exec(_affectedTextareaValue); - cleanLastTrigger(_newTrigger ? _newTrigger[0].length : 0); - } - var affectedTextareaValue = value.slice(_this2.lastTrigger, selectionEnd); - var tokenMatch = _this2.tokenRegExp.exec(affectedTextareaValue); - var lastToken = tokenMatch && tokenMatch[0]; - var currentTrigger = tokenMatch && tokenMatch[1] || null; - var currentTriggerLength = currentTrigger ? currentTrigger.length - 1 : 0; - var newTrigger = _this2.tokenRegExpEnding.exec(affectedTextareaValue); - if (newTrigger) { - cleanLastTrigger(newTrigger[0].length); - } else if (!_this2._isAutocompleteOpen()) { - _this2._closeAutocomplete(); - } - if ((!lastToken || lastToken.length <= minChar + currentTriggerLength) && (_this2.state.currentTrigger && !trigger[_this2.state.currentTrigger].allowWhitespace || !_this2.state.currentTrigger)) { - _this2._closeAutocomplete(); - return; - } - if (currentTrigger && trigger[currentTrigger].afterWhitespace && !/\s/.test(value[selectionEnd - lastToken.length - 1]) && value[selectionEnd - lastToken.length - 1] !== void 0) { - _this2._closeAutocomplete(); - return; - } - if (_this2.state.currentTrigger && trigger[_this2.state.currentTrigger].allowWhitespace) { - tokenMatch = new RegExp("".concat(escapeRegex(_this2.state.currentTrigger), ".*$")).exec(value.slice(0, selectionEnd)); - lastToken = tokenMatch && tokenMatch[0]; - if (!lastToken) { - _this2._closeAutocomplete(); - return; - } - currentTrigger = Object.keys(trigger).find(function(a) { - return a.slice(0, currentTriggerLength + 1) === lastToken.slice(0, currentTriggerLength + 1); - }) || null; - } - var actualToken2 = lastToken.slice(1); - if (!currentTrigger) { - return; - } - if (movePopupAsYouType || top2 === null && left2 === null || _this2.state.currentTrigger !== currentTrigger) { - setTopLeft(); - } - _this2.escListenerInit(); - var textToReplace = _this2._getTextToReplace(currentTrigger); - _this2.setState({ - selectionEnd, - currentTrigger, - textToReplace, - actualToken: actualToken2 - }, function() { - try { - _this2._getValuesFromProvider(); - } catch (err) { - errorMessage(err.message); - } - }); - }; - _this2._selectHandler = function(e) { - var _this2$props2 = _this2.props, onCaretPositionChange = _this2$props2.onCaretPositionChange, onSelect = _this2$props2.onSelect; - if (onCaretPositionChange) { - var caretPosition = _this2.getCaretPosition(); - onCaretPositionChange(caretPosition); - } - if (onSelect) { - e.persist(); - onSelect(e); - } - }; - _this2._shouldStayOpen = function(e) { - var el = e.relatedTarget; - if (el === null) { - el = document.activeElement; - } - if (_this2.dropdownRef && el instanceof Node && _this2.dropdownRef.contains(el)) { - return true; - } - return false; - }; - _this2._onClick = function(e) { - var onClick = _this2.props.onClick; - if (onClick) { - e.persist(); - onClick(e); - } - if (_this2._shouldStayOpen(e)) { - return; - } - _this2._closeAutocomplete(); - }; - _this2._onBlur = function(e) { - var onBlur = _this2.props.onBlur; - if (onBlur) { - e.persist(); - onBlur(e); - } - if (_this2._shouldStayOpen(e)) { - return; - } - _this2._closeAutocomplete(); - }; - _this2._onScrollHandler = function() { - _this2._closeAutocomplete(); - }; - _this2._onItemHighlightedHandler = function(item) { - var onItemHighlighted = _this2.props.onItemHighlighted; - var currentTrigger = _this2.state.currentTrigger; - if (onItemHighlighted) { - if (typeof onItemHighlighted === "function") { - onItemHighlighted({ - currentTrigger, - item - }); - } else { - throw new Error("`onItemHighlighted` has to be a function"); - } - } - }; - _this2._dropdownScroll = function(item) { - var scrollToItem = _this2.props.scrollToItem; - if (!scrollToItem) - return; - if (scrollToItem === true) { - defaultScrollToItem(_this2.dropdownRef, item); - return; - } - if (typeof scrollToItem !== "function" || scrollToItem.length !== 2) { - throw new Error("`scrollToItem` has to be boolean (true for default implementation) or function with two parameters: container, item."); - } - scrollToItem(_this2.dropdownRef, item); - }; - _this2._isAutocompleteOpen = function() { - var _this2$state5 = _this2.state, dataLoading = _this2$state5.dataLoading, currentTrigger = _this2$state5.currentTrigger; - var suggestionData = _this2._getSuggestions(); - return !!((dataLoading || suggestionData) && currentTrigger); - }; - _this2._textareaRef = function(ref) { - _this2.props.innerRef && _this2.props.innerRef(ref); - _this2.textareaRef = ref; - }; - _this2.lastTrigger = 0; - _this2.escListener = null; - var _this2$props3 = _this2.props, loadingComponent = _this2$props3.loadingComponent, _trigger = _this2$props3.trigger, _value = _this2$props3.value; - if (_value) - _this2.state.value = _value; - _this2._createRegExp(); - if (!loadingComponent) { - throw new Error("RTA: loadingComponent is not defined"); - } - if (!_trigger) { - throw new Error("RTA: trigger is not defined"); - } - return _this2; - } - _createClass$1(ReactTextareaAutocomplete2, [{ - key: "componentDidMount", - value: function componentDidMount() { - Listeners.startListen(this.textareaRef); - this.textareaRef && this.textareaRef.addEventListener("focus", this._handleCaretChange); - this.textareaRef && this.textareaRef.addEventListener("click", this._handleCaretChange); - this.textareaRef && this.textareaRef.addEventListener("keydown", this._handleCaretChange); - } - }, { - key: "componentDidUpdate", - value: function componentDidUpdate(_ref2) { - var oldTrigger = _ref2.trigger, oldValue = _ref2.value; - var _this$props2 = this.props, trigger = _this$props2.trigger, value = _this$props2.value; - if (Object.keys(trigger).join("") !== Object.keys(oldTrigger).join("")) { - this._createRegExp(); - } - if (oldValue !== value && this.lastValueBubbledEvent !== value) { - this.lastTrigger = 0; - this._changeHandler(); - } - } - }, { - key: "componentWillUnmount", - value: function componentWillUnmount() { - this.escListenerDestroy(); - Listeners.stopListen(this.textareaRef); - this.textareaRef && this.textareaRef.removeEventListener("focus", this._handleCaretChange); - this.textareaRef && this.textareaRef.removeEventListener("click", this._handleCaretChange); - this.textareaRef && this.textareaRef.removeEventListener("keydown", this._handleCaretChange); - } - }, { - key: "render", - value: function render() { - var _this3 = this; - var _this$props3 = this.props, Loader = _this$props3.loadingComponent, style = _this$props3.style, className = _this$props3.className, listStyle = _this$props3.listStyle, itemStyle = _this$props3.itemStyle, boundariesElement = _this$props3.boundariesElement, movePopupAsYouType = _this$props3.movePopupAsYouType, listClassName = _this$props3.listClassName, itemClassName = _this$props3.itemClassName, dropdownClassName = _this$props3.dropdownClassName, dropdownStyle = _this$props3.dropdownStyle, containerStyle = _this$props3.containerStyle, containerClassName = _this$props3.containerClassName, loaderStyle = _this$props3.loaderStyle, loaderClassName = _this$props3.loaderClassName, textAreaComponent = _this$props3.textAreaComponent, renderToBody = _this$props3.renderToBody; - var _this$state = this.state, left2 = _this$state.left, top2 = _this$state.top, dataLoading = _this$state.dataLoading, component = _this$state.component, value = _this$state.value, textToReplace = _this$state.textToReplace; - var isAutocompleteOpen = this._isAutocompleteOpen(); - var suggestionData = this._getSuggestions(); - var extraAttrs = {}; - var TextAreaComponent; - if (textAreaComponent.component) { - TextAreaComponent = textAreaComponent.component; - extraAttrs[textAreaComponent.ref] = this._textareaRef; - } else { - TextAreaComponent = textAreaComponent; - extraAttrs.ref = this._textareaRef; - } - return React$1.createElement("div", { - className: "rta ".concat(dataLoading === true ? "rta--loading" : "", " ").concat(containerClassName || ""), - style: containerStyle - }, React$1.createElement(TextAreaComponent, Object.assign({}, this._cleanUpProps(), { - className: "rta__textarea ".concat(className || ""), - onChange: this._changeHandler, - onSelect: this._selectHandler, - onScroll: this._onScrollHandler, - onClick: this._onClick, - onBlur: this._onBlur, - value, - style - }, extraAttrs)), isAutocompleteOpen && React$1.createElement(Autocomplete, { - innerRef: function innerRef(ref) { - _this3.dropdownRef = ref; - }, - top: top2, - left: left2, - style: dropdownStyle, - className: dropdownClassName, - movePopupAsYouType, - boundariesElement, - textareaRef: this.textareaRef, - renderToBody - }, suggestionData && component && textToReplace && React$1.createElement(List, { - values: suggestionData, - component, - style: listStyle, - className: listClassName, - itemClassName, - itemStyle, - getTextToReplace: textToReplace, - onItemHighlighted: this._onItemHighlightedHandler, - onSelect: this._onSelect, - dropdownScroll: this._dropdownScroll - }), dataLoading && React$1.createElement("div", { - className: "rta__loader ".concat(suggestionData !== null ? "rta__loader--suggestion-data" : "rta__loader--empty-suggestion-data", " ").concat(loaderClassName || ""), - style: loaderStyle - }, React$1.createElement(Loader, { - data: suggestionData - })))); - } - }], [{ - key: "getDerivedStateFromProps", - value: function getDerivedStateFromProps(_ref3) { - var value = _ref3.value; - if (value === null || value === void 0) - return null; - return { - value - }; - } - }]); - return ReactTextareaAutocomplete2; -}(React$1.Component); -ReactTextareaAutocomplete.defaultProps = { - movePopupAsYouType: false, - value: null, - minChar: 1, - boundariesElement: "body", - scrollToItem: true, - textAreaComponent: "textarea", - renderToBody: false -}; -const etTags = () => { - const { app: app2 } = dailyNotesService.getState(); - const tags = app2.metadataCache.getTags(); - return [...Object.keys(tags)].map((p2) => p2.split("#").pop()); -}; -const usedTags = (seletecText) => { - let allTags; - if (UseVaultTags) { - allTags = etTags(); - } else { - const { tags } = memoService.getState(); - allTags = tags; - } - const lowerCaseInputStr = seletecText.toLowerCase(); - const usedTags2 = []; - allTags.forEach((tag2) => { - if (tag2 && tag2.toLowerCase().contains(lowerCaseInputStr)) { - usedTags2.push({ - name: tag2, - char: tag2 - }); - } - }); - return usedTags2; -}; -var suggest = ""; -const getSuggestions = (inputStr) => { - const { app: app2 } = dailyNotesService.getState(); - const abstractFiles = app2.vault.getAllLoadedFiles(); - const files = []; - let actualInput; - abstractFiles.forEach((file) => { - if (inputStr === "[") { - actualInput = ""; - const lowerCaseInputStr = actualInput.toLowerCase(); - if (file instanceof require$$0.TFile && (file.extension === "md" || file.extension === "png" || file.extension === "jpg" || file.extension === "jpeg" || file.extension === "gif") && file.path.toLowerCase().contains(lowerCaseInputStr)) { - files.push({ - name: file.basename, - char: file.name, - file - }); - } - } else if (inputStr.contains("[")) { - actualInput = inputStr.slice(1); - const lowerCaseInputStr = actualInput.toLowerCase(); - if (file instanceof require$$0.TFile && (file.extension === "md" || file.extension === "png" || file.extension === "jpg" || file.extension === "jpeg" || file.extension === "gif") && file.path.toLowerCase().contains(lowerCaseInputStr)) { - files.push({ - name: file.basename, - char: file.name, - file - }); - } - } - }); - return files; -}; var ar = {}; var cz = {}; var da = {}; @@ -10950,6 +7788,7 @@ var en = { DELETE: "DELETE", "CONFIRM\uFF01": "CONFIRM\uFF01", "CREATE FILTER": "CREATE FILTER", + "Comment it...": "Comment it...", Settings: "Settings", "Recycle bin": "Recycle bin", "About Me": "About Me", @@ -11003,7 +7842,45 @@ var en = { 'Set default memo composition, you should use {TIME} as "HH:mm" and {CONTENT} as content. "{TIME} {CONTENT}" by default': 'Set default memo composition, you should use {TIME} as "HH:mm" and {CONTENT} as content. "{TIME} {CONTENT}" by default', "Default Memo Composition": "Default Memo Composition", "Show Tasks Label": "Show Tasks Label", - "Show tasks label near the time text. False by default": "Show tasks label near the time text. False by default" + "Show tasks label near the time text. False by default": "Show tasks label near the time text. False by default", + "Please Open Memos First": "Please Open Memos First", + DATE: "DATE", + OBSIDIAN_NLDATES_PLUGIN_NOT_ENABLED: "OBSIDIAN_NLDATES_PLUGIN_NOT_ENABLED", + BEFORE: "BEFORE", + AFTER: "AFTER", + "Allow Comments On Memos": "Allow Comments On Memos", + "You can comment on memos. False by default": "You can comment on memos. False by default", + Import: "Import", + "TITLE CANNOT BE NULL!": "TITLE CANNOT BE NULL!", + "FILTER CANNOT BE NULL!": "FILTER CANNOT BE NULL!", + "Comments In Original DailyNotes/Notes": "Comments In Original DailyNotes/Notes", + "You should install Dataview Plugin ver 0.5.9 or later to use this feature.": "You should install Dataview Plugin ver 0.5.9 or later to use this feature.", + "Open Memos Successfully": "Open Memos Successfully", + "Fetch Error": "\u{1F62D} Fetch Error", + "Copied to clipboard Successfully": "Copied to clipboard Successfully", + "Check if you opened Daily Notes Plugin Or Periodic Notes Plugin": "Check if you opened Daily Notes Plugin Or Periodic Notes Plugin", + "Please finish the last filter setting first": "Please finish the last filter setting first", + "Close Memos Successfully": "Close Memos Successfully", + "Insert as Memo": "Insert as Memo", + "Insert file as memo content": "Insert file as memo content", + "Image load failed": "Image load failed", + "Content cannot be empty": "Content cannot be empty", + "Unable to create new file.": "Unable to create new file.", + "Failed to fetch deleted memos: ": "Failed to fetch deleted memos: ", + "RESTORE SUCCEED": "RESTORE SUCCEED", + "Save Memo button icon": "Save Memo button icon", + "The icon shown on the save Memo button in the UI.": "The icon shown on the save Memo button in the UI.", + "Fetch Memos From Particular Notes": "Fetch Memos From Particular Notes", + 'You can set any Dataview Query for memos to fetch it. All memos in those notes will show on list. "#memo" by default': 'You can set any Dataview Query for memos to fetch it. All memos in those notes will show on list. "#memo" by default', + "Allow Memos to Fetch Memo from Notes": "Allow Memos to Fetch Memo from Notes", + "Use Memos to manage all memos in your notes, not only in daily notes. False by default": "Use Memos to manage all memos in your notes, not only in daily notes. False by default", + "Always Show Memo Comments": "Always Show Memo Comments", + "Always show memo comments on memos. False by default": "Always show memo comments on memos. False by default", + "You didn't set folder for daily notes in both periodic-notes and daily-notes plugins.": "You didn't set folder for daily notes in both periodic-notes and daily-notes plugins.", + "Please check your daily note plugin OR periodic notes plugin settings": "Please check your daily note plugin OR periodic notes plugin settings", + "Use Which Plugin's Default Configuration": "Use Which Plugin's Default Configuration", + "Memos use the plugin's default configuration to fetch memos from daily, 'Daily' by default.": "Memos use the plugin's default configuration to fetch memos from daily, 'Daily' by default.", + Daily: "Daily" }; var enGB = {}; var es = {}; @@ -11146,10 +8023,11 @@ var fr = { 'Set default memo composition, you should use {TIME} as "HH:mm" and {CONTENT} as content. "{TIME} {CONTENT}" by default': 'D\xE9finir la composition par d\xE9faut du m\xE9mo, vous devez utiliser {TIME} comme "HH:mm" et {CONTENT} comme contenu. "{TIME} {CONTENT}" par d\xE9faut', "Default Memo Composition": "Composition par d\xE9faut du m\xE9mo", "Show Tasks Label": "Afficher les \xE9tiquettes des t\xE2ches", - "Show tasks label near the time text. False by default": "Afficher les \xE9tiquettes des t\xE2ches \xE0 c\xF4t\xE9 du texte horaire. D\xE9sactiv\xE9 par d\xE9faut." + "Show tasks label near the time text. False by default": "Afficher les \xE9tiquettes des t\xE2ches \xE0 c\xF4t\xE9 du texte horaire. D\xE9sactiv\xE9 par d\xE9faut.", + "Please Open Memos First": "Merci d'ouvrir les m\xE9mos en premier" }; var hi = {}; -var id$1 = {}; +var id = {}; var it = {}; var ja = {}; var ko = {}; @@ -11297,7 +8175,8 @@ var pt = { 'Set default memo composition, you should use {TIME} as "HH:mm" and {CONTENT} as content. "{TIME} {CONTENT}" by default': 'Defina a composi\xE7\xE3o padr\xE3o do Memo, deve usar {TIME} como "HH:mm" e {CONTENT} como conte\xFAdo. Padr\xE3o: "{TIME} {CONTENT}"', "Default Memo Composition": "Composi\xE7\xE3o Padr\xE3o do Memo", "Show Tasks Label": "Mostrar Etiquetas de Tarefas", - "Show tasks label near the time text. False by default": "Mostrar etiquetas de tarefas pr\xF3ximo ao texto de tempo. Desactivado por padr\xE3o" + "Show tasks label near the time text. False by default": "Mostrar etiquetas de tarefas pr\xF3ximo ao texto de tempo. Desactivado por padr\xE3o", + "Please Open Memos First": "Por favor, abra os Memos primeiro" }; var ptBR = {}; var ro = {}; @@ -11430,7 +8309,46 @@ var zhCN = { 'Set default memo composition, you should use {TIME} as "HH:mm" and {CONTENT} as content. "{TIME} {CONTENT}" by default': '\u8BBE\u7F6E\u9ED8\u8BA4 Memo \u7EC4\u6210\uFF0C\u4F60\u5FC5\u987B\u8981\u4F7F\u7528 {TIME} \u4F5C\u4E3A "HH:mm" \u800C\u4E14\u8981\u8BBE\u7F6E {CONTENT} \u4F5C\u4E3A\u5185\u5BB9\u8BC6\u522B\u3002\u9ED8\u8BA4\u60C5\u51B5\u4E0B\uFF0C Memo \u57FA\u4E8E "{TIME} {CONTENT}" \u8BC6\u522B', "Default Memo Composition": "\u9ED8\u8BA4 Memo \u7EC4\u6210", "Show Tasks Label": "\u5C55\u793A\u4EFB\u52A1\u6807\u7B7E", - "Show tasks label near the time text. False by default": "\u5728 Memo \u7684\u65F6\u95F4\u65C1\u5C55\u793A\u4EFB\u52A1\u6807\u7B7E\u3002\u9ED8\u8BA4\u60C5\u51B5\u4E0B\u4E0D\u5C55\u793A" + "Show tasks label near the time text. False by default": "\u5728 Memo \u7684\u65F6\u95F4\u65C1\u5C55\u793A\u4EFB\u52A1\u6807\u7B7E\u3002\u9ED8\u8BA4\u60C5\u51B5\u4E0B\u4E0D\u5C55\u793A", + "Please Open Memos First": "\u8BF7\u5148\u6253\u5F00 Memos", + "Comment it...": "\u8BC4\u8BBA...", + DATE: "\u65E5\u671F", + OBSIDIAN_NLDATES_PLUGIN_NOT_ENABLED: "Obsidian Natrual DATES language \u63D2\u4EF6\u6CA1\u542F\u52A8", + BEFORE: "\u5728\u4E4B\u524D", + AFTER: "\u5728\u4E4B\u540E", + "Allow Comments On Memos": "\u5141\u8BB8\u5728 Memos \u4E0A\u8BC4\u8BBA", + "You can comment on memos. False by default": "\u4F60\u53EF\u4EE5\u5728 Memos \u70B9\u51FB\u56FE\u6807\u8FDB\u884C\u8BC4\u8BBA\u4E86\u3002\u9ED8\u8BA4\u4E0D\u5F00\u542F", + Import: "\u5BFC\u5165", + "TITLE CANNOT BE NULL!": "\u6807\u9898\u4E0D\u53EF\u4EE5\u4E3A\u7A7A\uFF01", + "FILTER CANNOT BE NULL!": "\u7B5B\u9009\u5668\u4E0D\u53EF\u4EE5\u4E3A\u7A7A\uFF01", + "Comments In Original DailyNotes/Notes": "\u5728\u539F\u6587\u4EF6\u4E2D\u8FDB\u884C\u8BC4\u8BBA", + "You should install Dataview Plugin ver 0.5.9 or later to use this feature.": "\u4F60\u9700\u8981\u5B89\u88C5 0.5.9 \u7248\u672C\u4EE5\u4E0A\u7684 Dataview \u63D2\u4EF6\u6765\u4F7F\u7528\u8BE5\u529F\u80FD", + "Open Memos Successfully": "\u6210\u529F\u6253\u5F00 Memos ", + "Fetch Error": "\u{1F62D} Memos \u83B7\u53D6\u5931\u8D25", + "Copied to clipboard Successfully": "\u590D\u5236\u6210\u529F", + "Check if you opened Daily Notes Plugin Or Periodic Notes Plugin": "\u8BF7\u68C0\u67E5\u4F60\u6709\u6CA1\u6709\u5F00\u542F\u65E5\u8BB0\u63D2\u4EF6\u6216\u8005 Periodic Notes \u63D2\u4EF6\u4E14\u542F\u7528\u4E86\u65E5\u8BB0\u6A21\u5F0F", + "Please finish the last filter setting first": "\u5148\u5B8C\u5584\u4E0A\u4E00\u4E2A\u8FC7\u6EE4\u5668\u5427", + "Close Memos Successfully": "\u6210\u529F\u5173\u95ED Memos ", + "Insert as Memo": "\u63D2\u5165\u5185\u5BB9\u4E3A Memo", + "Insert file as memo content": "\u63D2\u5165\u6587\u4EF6\u4E3A Memo", + "Image load failed": "\u6709\u4E2A\u56FE\u7247\u52A0\u8F7D\u5931\u8D25\u4E86\u{1F61F}", + "Content cannot be empty": "\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A\u5440", + "Unable to create new file.": "\u65E0\u6CD5\u65B0\u5EFA\u6587\u4EF6", + "Failed to fetch deleted memos: ": "\u65E0\u6CD5\u83B7\u53D6\u5DF2\u5220\u9664\u7684 Memos \uFF1A", + "RESTORE SUCCEED": "\u6210\u529F\u6062\u590D Memo", + "Save Memo button icon": "\u4FDD\u5B58\u6309\u94AE\u4E0A\u7684\u56FE\u6807", + "The icon shown on the save Memo button in the UI.": "\u4F60\u53EF\u4EE5\u8BBE\u7F6E\u4FDD\u5B58\u6309\u94AE\u4E0A\u7684\u56FE\u6807", + "Fetch Memos From Particular Notes": "\u4ECE\u6307\u5B9A\u7684\u6587\u4EF6\u4E2D\u83B7\u53D6 Memos", + 'You can set any Dataview Query for memos to fetch it. All memos in those notes will show on list. "#memo" by default': '\u4F60\u53EF\u4EE5\u7ED9\u7B14\u8BB0\u8BBE\u7F6E\u6307\u5B9A\u68C0\u7D22\u5F0F\u6765\u8BA9 Memos \u53EF\u4EE5\u7D22\u5F15\u5230\u5B83\u3002\u9ED8\u8BA4\u4E3A "#memo" ', + "Allow Memos to Fetch Memo from Notes": "\u5141\u8BB8 Memos \u4ECE\u7B14\u8BB0\u4E2D\u83B7\u53D6 Memo", + "Use Memos to manage all memos in your notes, not only in daily notes. False by default": "\u4F7F\u7528 Memos \u6765\u7BA1\u7406\u4F60\u7B14\u8BB0\u4E2D\u7684 Memos\uFF0C\u4E0D\u5355\u53EA DailyNotes \u4E2D\u7684\u5185\u5BB9\u3002\u9ED8\u8BA4\u4E3A\u5173\u95ED", + "Always Show Memo Comments": "\u8BC4\u8BBA\u5C06\u603B\u662F\u53EF\u89C1", + "Always show memo comments on memos. False by default": "\u5F53\u5F00\u542F\u540E\u8BC4\u8BBA\u603B\u662F\u4F1A\u5728 Memo \u7684\u4E0B\u65B9\u5C55\u793A\u3002\u9ED8\u8BA4\u4E3A\u5173\u95ED", + "You didn't set folder for daily notes in both periodic-notes and daily-notes plugins.": "\u4F60\u5728 Periodic Notes \u63D2\u4EF6\u548C\u65E5\u8BB0\u63D2\u4EF6\u90FD\u6CA1\u8BBE\u7F6E\u65E5\u8BB0\u7684\u6240\u5728\u6587\u4EF6\u5939", + "Please check your daily note plugin OR periodic notes plugin settings": "\u8BF7\u68C0\u67E5\u4F60\u7684\u65E5\u8BB0\u63D2\u4EF6\u548C/\u6216 Periodic Notes \u63D2\u4EF6\u7684\u8BBE\u7F6E", + "Use Which Plugin's Default Configuration": "\u4F7F\u7528\u54EA\u4E2A\u63D2\u4EF6\u7684\u9ED8\u8BA4\u65E5\u8BB0\u914D\u7F6E", + "Memos use the plugin's default configuration to fetch memos from daily, 'Daily' by default.": "Memos \u91C7\u7528\u6307\u5B9A\u63D2\u4EF6\u7684\u9ED8\u8BA4\u914D\u7F6E\u6765\u83B7\u53D6 Memos\u3002\u9ED8\u8BA4\u4E3A\u65E5\u8BB0\u63D2\u4EF6\u3002", + Daily: "\u65E5\u8BB0\u63D2\u4EF6" }; var zhTW = {}; const localeMap = { @@ -11443,7 +8361,7 @@ const localeMap = { es, fr, hi, - id: id$1, + id, it, ja, ko, @@ -11458,5611 +8376,4052 @@ const localeMap = { "zh-cn": zhCN, "zh-tw": zhTW }; -const locale$1 = localeMap[require$$0.moment.locale()]; -function t(str) { - return locale$1 && locale$1[str] || en[str]; +const locale = localeMap[require$$0.moment.locale()]; +function t$1(str) { + return locale && locale[str] || en[str]; +} +var utils; +((utils2) => { + function getNowTimeStamp() { + return parseInt(require$$0.moment().format("x")); + } + utils2.getNowTimeStamp = getNowTimeStamp; + function getOSVersion() { + const appVersion = navigator.userAgent; + let detectedOS = "Unknown"; + if (appVersion.indexOf("Win") != -1) { + detectedOS = "Windows"; + } else if (appVersion.indexOf("Mac") != -1) { + detectedOS = "MacOS"; + } else if (appVersion.indexOf("Linux") != -1) { + detectedOS = "Linux"; + } + return detectedOS; + } + utils2.getOSVersion = getOSVersion; + function getTimeStampByDate(t2) { + if (typeof t2 === "string") { + t2 = t2.replaceAll("-", "/"); + } + return new Date(t2).getTime(); + } + utils2.getTimeStampByDate = getTimeStampByDate; + function getDateStampByDate(t2) { + const d = new Date(getTimeStampByDate(t2)); + return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime(); + } + utils2.getDateStampByDate = getDateStampByDate; + function getDateString(t2) { + const d = new Date(getTimeStampByDate(t2)); + const year = d.getFullYear(); + const month = d.getMonth() + 1; + const date = d.getDate(); + return `${year}/${month}/${date}`; + } + utils2.getDateString = getDateString; + function getTimeString(t2) { + const d = new Date(getTimeStampByDate(t2)); + const hours = d.getHours(); + const mins = d.getMinutes(); + const hoursStr = hours < 10 ? "0" + hours : hours; + const minsStr = mins < 10 ? "0" + mins : mins; + return `${hoursStr}:${minsStr}`; + } + utils2.getTimeString = getTimeString; + function getDateTimeString(t2) { + const d = new Date(getTimeStampByDate(t2)); + const year = d.getFullYear(); + const month = d.getMonth() + 1; + const date = d.getDate(); + const hours = d.getHours(); + const mins = d.getMinutes(); + const secs = d.getSeconds(); + const monthStr = month < 10 ? "0" + month : month; + const dateStr = date < 10 ? "0" + date : date; + const hoursStr = hours < 10 ? "0" + hours : hours; + const minsStr = mins < 10 ? "0" + mins : mins; + const secsStr = secs < 10 ? "0" + secs : secs; + return `${year}/${monthStr}/${dateStr} ${hoursStr}:${minsStr}:${secsStr}`; + } + utils2.getDateTimeString = getDateTimeString; + function dedupe(data) { + return Array.from(new Set(data)); + } + utils2.dedupe = dedupe; + function dedupeObjectWithId(data) { + const idSet = /* @__PURE__ */ new Set(); + const result = []; + for (const d of data) { + if (!idSet.has(d.id)) { + idSet.add(d.id); + result.push(d); + } + } + return result; + } + utils2.dedupeObjectWithId = dedupeObjectWithId; + function debounce2(fn2, delay) { + let timer = null; + return () => { + if (timer) { + clearTimeout(timer); + timer = setTimeout(fn2, delay); + } else { + timer = setTimeout(fn2, delay); + } + }; + } + utils2.debounce = debounce2; + function debouncePlus(fn2, delay, immdiate = false, resultCallback) { + let timer = null; + let isInvoke = false; + function _debounce(...arg) { + if (timer) + clearTimeout(timer); + if (immdiate && !isInvoke) { + const result = fn2.apply(this, arg); + if (resultCallback && typeof resultCallback === "function") + resultCallback(result); + isInvoke = true; + } else { + timer = setTimeout(() => { + const result = fn2.apply(this, arg); + if (resultCallback && typeof resultCallback === "function") + resultCallback(result); + isInvoke = false; + timer = null; + }, delay); + } + } + console.log("hi"); + _debounce.cancel = function() { + if (timer) + clearTimeout(timer); + timer = null; + isInvoke = false; + }; + return _debounce; + } + utils2.debouncePlus = debouncePlus; + function throttle(fn2, delay) { + let valid = true; + return () => { + if (!valid) { + return false; + } + valid = false; + setTimeout(() => { + fn2(); + valid = true; + }, delay); + }; + } + utils2.throttle = throttle; + function transformObjectToParamsString(object) { + const params = []; + const keys = Object.keys(object).sort(); + for (const key of keys) { + const val = object[key]; + if (val) { + if (typeof val === "object") { + params.push(...transformObjectToParamsString(val).split("&")); + } else { + params.push(`${key}=${val}`); + } + } + } + return params.join("&"); + } + utils2.transformObjectToParamsString = transformObjectToParamsString; + function transformParamsStringToObject(paramsString) { + const object = {}; + const params = paramsString.split("&"); + for (const p2 of params) { + const [key, val] = p2.split("="); + if (key && val) { + object[key] = val; + } + } + return object; + } + utils2.transformParamsStringToObject = transformParamsStringToObject; + function filterObjectNullKeys(object) { + if (!object) { + return {}; + } + const finalObject = {}; + const keys = Object.keys(object).sort(); + for (const key of keys) { + const val = object[key]; + if (typeof val === "object") { + const temp = filterObjectNullKeys(JSON.parse(JSON.stringify(val))); + if (temp && Object.keys(temp).length > 0) { + finalObject[key] = temp; + } + } else { + if (val) { + finalObject[key] = val; + } + } + } + return finalObject; + } + utils2.filterObjectNullKeys = filterObjectNullKeys; + async function copyTextToClipboard(text) { + if (navigator.clipboard && navigator.clipboard.writeText) { + try { + await navigator.clipboard.writeText(text); + } catch (error) { + console.warn("Copy to clipboard failed.", error); + } + } else { + console.warn("Copy to clipboard failed, methods not supports."); + } + } + utils2.copyTextToClipboard = copyTextToClipboard; + function getImageSize(src) { + return new Promise((resolve) => { + const imgEl = new Image(); + imgEl.onload = () => { + const { width, height } = imgEl; + if (width > 0 && height > 0) { + resolve({ width, height }); + } else { + resolve({ width: 0, height: 0 }); + } + }; + imgEl.onerror = () => { + resolve({ width: 0, height: 0 }); + }; + imgEl.className = "hidden"; + imgEl.src = src; + document.body.appendChild(imgEl); + imgEl.remove(); + }); + } + utils2.getImageSize = getImageSize; + async function createDailyNoteCheck(date) { + var _a, _b, _c, _d, _e, _f, _g; + let file; + if ((_d = (_c = (_b = (_a = window.app.plugins) == null ? void 0 : _a.getPlugin("periodic-notes")) == null ? void 0 : _b.calendarSetManager) == null ? void 0 : _c.getActiveConfig("day")) == null ? void 0 : _d.enabled) { + const periodicNotes = window.app.plugins.getPlugin("periodic-notes"); + file = await periodicNotes.createPeriodicNote("day", date); + return file; + } + if ((_g = (_f = (_e = window.app.plugins) == null ? void 0 : _e.getPlugin("periodic-notes")) == null ? void 0 : _f.settings) == null ? void 0 : _g.daily) { + const periodicNotes = window.app.plugins.getPlugin("periodic-notes"); + file = await periodicNotes.createPeriodicNote("day", date); + return file; + } + file = await createDailyNote_1(date); + return file; + } + utils2.createDailyNoteCheck = createDailyNoteCheck; +})(utils || (utils = {})); +function getDailyNoteFormat() { + var _a, _b, _c, _d; + let dailyNoteFormat = ""; + if ((_b = (_a = window.app.plugins.getPlugin("periodic-notes")) == null ? void 0 : _a.calendarSetManager) == null ? void 0 : _b.getActiveConfig("day").enabled) { + const periodicNotes = window.app.plugins.getPlugin("periodic-notes"); + dailyNoteFormat = periodicNotes.calendarSetManager.getActiveConfig("day").format || "YYYY-MM-DD"; + return dailyNoteFormat; + } + if ((_d = (_c = window.app.plugins.getPlugin("periodic-notes")) == null ? void 0 : _c.settings) == null ? void 0 : _d.daily) { + const dailyNotes = window.app.plugins.getPlugin("periodic-notes"); + dailyNoteFormat = dailyNotes.settings.daily.format || "YYYY-MM-DD"; + return dailyNoteFormat; + } + const dailyNotesSetting = getDailyNoteSettings_1(); + dailyNoteFormat = dailyNotesSetting.format; + return dailyNoteFormat; } -const TItem = ({ - entity: { - name, - char, - file +function getDailyNotePath() { + var _a, _b, _c, _d, _e, _f; + let dailyNotePath = ""; + let dailyNoteTempForPeriodicNotes = ""; + const folderFromPeriodicNotesNew = (_c = (_b = (_a = window.app.plugins.getPlugin("periodic-notes")) == null ? void 0 : _a.calendarSetManager) == null ? void 0 : _b.getActiveConfig("day")) == null ? void 0 : _c.folder; + const folderFromPeriodicNotes = (_f = (_e = (_d = window.app.plugins.getPlugin("periodic-notes")) == null ? void 0 : _d.settings) == null ? void 0 : _e.daily) == null ? void 0 : _f.folder; + if (folderFromPeriodicNotesNew === void 0) { + dailyNoteTempForPeriodicNotes = folderFromPeriodicNotes; + } else { + dailyNoteTempForPeriodicNotes = folderFromPeriodicNotesNew; } -}) => { - return /* @__PURE__ */ jsx("div", { - children: `${char}` - }); -}; -const Loading = ({ - data -}) => { - return /* @__PURE__ */ jsx("div", { - children: "Loading" - }); + switch (UseDailyOrPeriodic) { + case "Daily": + dailyNotePath = getDailyNoteSettings_1().folder || ""; + break; + case "Periodic": + dailyNotePath = dailyNoteTempForPeriodicNotes || ""; + break; + default: + dailyNotePath = getDailyNoteSettings_1().folder || ""; + break; + } + if (dailyNotePath === "" || dailyNotePath === void 0) { + new require$$0.Notice(t$1("You didn't set folder for daily notes in both periodic-notes and daily-notes plugins.")); + } + return dailyNotePath; +} +var utils$1 = utils; +function reducer$3(state, action) { + switch (action.type) { + case "SET_MEMOS": { + const memos = utils$1.dedupeObjectWithId(action.payload.memos.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt))); + return __spreadProps(__spreadValues({}, state), { + memos: [...memos] + }); + } + case "SET_COMMENT_MEMOS": { + const memos = utils$1.dedupeObjectWithId(action.payload.commentMemos.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt))); + return __spreadProps(__spreadValues({}, state), { + commentMemos: [...memos] + }); + } + case "SET_TAGS": { + return __spreadProps(__spreadValues({}, state), { + tags: action.payload.tags, + tagsNum: action.payload.tagsNum + }); + } + case "INSERT_MEMO": { + const memos = utils$1.dedupeObjectWithId([action.payload.memo, ...state.memos].sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt))); + return __spreadProps(__spreadValues({}, state), { + memos + }); + } + case "INSERT_COMMENT_MEMO": { + const memos = utils$1.dedupeObjectWithId([action.payload.memo, ...state.commentMemos].sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt))); + return __spreadProps(__spreadValues({}, state), { + commentMemos: [...memos] + }); + } + case "DELETE_MEMO_BY_ID": { + return __spreadProps(__spreadValues({}, state), { + memos: [...state.memos].filter((memo2) => memo2.id !== action.payload.id) + }); + } + case "EDIT_MEMO": { + const memos = state.memos.map((m2) => { + if (m2.id === action.payload.id) { + return __spreadValues(__spreadValues({}, m2), action.payload); + } else { + return m2; + } + }); + return __spreadProps(__spreadValues({}, state), { + memos + }); + } + case "EDIT_COMMENT_MEMO": { + const memos = state.commentMemos.map((m2) => { + if (m2.id === action.payload.id) { + return __spreadValues(__spreadValues({}, m2), action.payload); + } else { + return m2; + } + }); + return __spreadProps(__spreadValues({}, state), { + commentMemos: [...memos] + }); + } + default: { + return state; + } + } +} +const defaultState$3 = { + memos: [], + commentMemos: [], + tags: [], + tagsNum: {} }; -let actualToken; -const Editor = _react_17_0_2_react.exports.forwardRef((props, ref) => { - var _a, _b; - const { - globalState: { - useTinyUndoHistoryCache +function reducer$2(state, action) { + switch (action.type) { + case "SIGN_IN": { + return { + user: action.payload.user + }; + } + case "SIGN_OUT": { + return { + user: null + }; } - } = _react_17_0_2_react.exports.useContext(appContext); - const { - className, - initialContent, - placeholder, - showConfirmBtn, - showCancelBtn, - onConfirmBtnClick: handleConfirmBtnClickCallback, - onCancelBtnClick: handleCancelBtnClickCallback, - onContentChange: handleContentChangeCallback - } = props; - const editorRef = _react_17_0_2_react.exports.useRef(null); - const tinyUndoRef = _react_17_0_2_react.exports.useRef(null); - const refresh = useRefresh(); - _react_17_0_2_react.exports.useEffect(() => { - if (!editorRef.current) { - return; + default: { + return state; } - if (initialContent) { - editorRef.current.value = initialContent; - refresh(); + } +} +const defaultState$2 = { user: null }; +function reducer$1(state, action) { + switch (action.type) { + case "SET_QUERIES": { + const queries = utils$1.dedupeObjectWithId(action.payload.queries.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)).sort((a, b) => { + var _a, _b; + return utils$1.getTimeStampByDate((_a = b.pinnedAt) != null ? _a : 0) - utils$1.getTimeStampByDate((_b = a.pinnedAt) != null ? _b : 0); + })); + return __spreadProps(__spreadValues({}, state), { + queries + }); } - }, []); - _react_17_0_2_react.exports.useEffect(() => { - var _a2; - if (useTinyUndoHistoryCache) { - if (!editorRef.current) { - return; - } - const { - tinyUndoActionsCache, - tinyUndoIndexCache - } = storage.get(["tinyUndoActionsCache", "tinyUndoIndexCache"]); - tinyUndoRef.current = new TinyUndo(editorRef.current, { - interval: 5e3, - initialActions: tinyUndoActionsCache, - initialIndex: tinyUndoIndexCache + case "INSERT_QUERY": { + const queries = utils$1.dedupeObjectWithId([action.payload.query, ...state.queries].sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt))); + return __spreadProps(__spreadValues({}, state), { + queries }); - tinyUndoRef.current.subscribe((actions, index) => { - storage.set({ - tinyUndoActionsCache: actions, - tinyUndoIndexCache: index - }); + } + case "DELETE_QUERY_BY_ID": { + return __spreadProps(__spreadValues({}, state), { + queries: [...state.queries].filter((query) => query.id !== action.payload.id) }); - return () => { - var _a3; - (_a3 = tinyUndoRef.current) == null ? void 0 : _a3.destroy(); - }; - } else { - (_a2 = tinyUndoRef.current) == null ? void 0 : _a2.destroy(); - tinyUndoRef.current = null; - storage.remove(["tinyUndoActionsCache", "tinyUndoIndexCache"]); } - }, [useTinyUndoHistoryCache]); - _react_17_0_2_react.exports.useEffect(() => { - var _a2; - if (editorRef.current) { - editorRef.current.style.height = "auto"; - editorRef.current.style.height = ((_a2 = editorRef.current.scrollHeight) != null ? _a2 : 0) + "px"; + case "UPDATE_QUERY": { + const queries = state.queries.map((m2) => { + if (m2.id === action.payload.id) { + return __spreadValues(__spreadValues({}, m2), action.payload); + } else { + return m2; + } + }); + return __spreadProps(__spreadValues({}, state), { + queries + }); } - }, [(_a = editorRef.current) == null ? void 0 : _a.value]); - _react_17_0_2_react.exports.useImperativeHandle(ref, () => ({ - element: editorRef.current, - focus: () => { - var _a2; - if (FocusOnEditor) { - (_a2 = editorRef.current) == null ? void 0 : _a2.focus(); - } - }, - insertText: (rawText) => { - if (!editorRef.current) { - return; - } - const prevValue = editorRef.current.value; - editorRef.current.value = prevValue.slice(0, editorRef.current.selectionStart) + rawText + prevValue.slice(editorRef.current.selectionStart); - handleContentChangeCallback(editorRef.current.value); - refresh(); - }, - setContent: (text) => { - if (editorRef.current) { - editorRef.current.value = text; - handleContentChangeCallback(editorRef.current.value); - refresh(); - } - }, - getContent: () => { - var _a2, _b2; - return (_b2 = (_a2 = editorRef.current) == null ? void 0 : _a2.value) != null ? _b2 : ""; + default: { + return state; } - }), []); - const handleInsertTrigger = (event) => { - if (!editorRef.current) { - return; + } +} +const defaultState$1 = { + queries: [] +}; +function reducer(state, action) { + switch (action.type) { + case "SET_DAILYNOTES": { + const dailyNotes = getAllDailyNotes_1(); + return __spreadProps(__spreadValues({}, state), { + dailyNotes + }); } - const { - fileManager - } = appStore.getState().dailyNotesState.app; - if (event.currentTrigger === "#") { - const prevValue = editorRef.current.value; - let removeCharNum; - if (actualToken !== null && actualToken !== void 0) { - removeCharNum = actualToken.length; - } else { - removeCharNum = 0; + case "SET_APP": { + return __spreadProps(__spreadValues({}, state), { + app: action.payload.app + }); + } + default: { + return state; + } + } +} +const defaultState = { + dailyNotes: null, + app: null +}; +const appStore = createStore({ + globalState: defaultState$5, + locationState: defaultState$4, + memoState: defaultState$3, + userState: defaultState$2, + queryState: defaultState$1, + dailyNotesState: defaultState +}, combineReducers({ + globalState: reducer$5, + locationState: reducer$4, + memoState: reducer$3, + userState: reducer$2, + queryState: reducer$1, + dailyNotesState: reducer +})); +const appContext = _react_17_0_2_react.exports.createContext(appStore.getState()); +(() => { + if (!String.prototype.replaceAll) { + String.prototype.replaceAll = function(str, newStr) { + if (Object.prototype.toString.call(str).toLowerCase() === "[object regexp]") { + return this.replace(str, newStr); } - let behindCharNum = editorRef.current.selectionStart; - for (let i = 0; i < prevValue.length; i++) { - if (!/\s/g.test(prevValue[behindCharNum])) { - behindCharNum++; - } + return this.replace(new RegExp(str, "g"), newStr); + }; + } +})(); +var global$1 = ""; +const SHOW_SIDERBAR_MOBILE_CLASSNAME = "mobile-show-sidebar"; +const ANIMATION_DURATION = 200; +const DAILY_TIMESTAMP = 3600 * 24 * 1e3; +const TAG_REG = /\s#([\p{Letter}\p{Emoji_Presentation}\p{Number}\/_-]+)/gu; +const FIRST_TAG_REG = /(

|
)#([\p{Letter}\p{Emoji_Presentation}\p{Number}\/_-]+)/gu; +const NOP_FIRST_TAG_REG = /^#([\p{Letter}\p{Emoji_Presentation}\p{Number}\/_-]+)/gu; +const LINK_REG = /(\s|:|>|^)((http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-]))/g; +const MD_LINK_REG = /\[([\s\S]*?)\]\(([\s\S]*?)\)/gu; +const IMAGE_URL_REG = /([^\s<\\*>']+\.(jpeg|jpg|gif|png|svg))(\]\])?(\))?/g; +const MARKDOWN_URL_REG = /(!\[([^\]]*)(\|)?(.*?)\]\((.*?)("(?:.*[^"])")?\s*\))/g; +const MARKDOWN_WEB_URL_REG = /(\s|:|^)(http[s]?:\/\/)([^\/\s]+\/)(\S*?)(jpeg|jpg|gif|png|svg|bmp|wepg)(?!\))/g; +const WIKI_IMAGE_URL_REG = /!\[\[((.*?)\.(jpeg|jpg|gif|png|svg|bmp|wepg))?(\|)?(.*?)\]\]/g; +const MEMO_LINK_REG = /\[@(.+?)\]\((.+?)\)/g; +class DailyNotesService { + getState() { + return appStore.getState().dailyNotesState; + } + getApp(app2) { + appStore.dispatch({ + type: "SET_APP", + payload: { + app: app2 } - editorRef.current.value = prevValue.slice(0, editorRef.current.selectionStart - removeCharNum) + event.item.char + prevValue.slice(behindCharNum); - handleContentChangeCallback(editorRef.current.value); - refresh(); - } else if (event.currentTrigger === "[[") { - const filePath = fileManager.generateMarkdownLink(event.item.file, event.item.file.path, "", ""); - const prevValue = editorRef.current.value; - let removeCharNum; - if (actualToken !== null && actualToken !== void 0) { - if (filePath.contains("[[")) { - removeCharNum = actualToken.length + 1; - } else if (event.item.file.extension !== "md") { - removeCharNum = actualToken.length + 1; - } else { - removeCharNum = actualToken.length + 2; - } - } else { - removeCharNum = 2; + }); + return app2; + } + async getMyAllDailyNotes() { + const dailyNotes = getAllDailyNotes_1(); + appStore.dispatch({ + type: "SET_DAILYNOTES", + payload: { + dailyNotes } - let behindCharNum = editorRef.current.selectionStart; - for (let i = 0; i < prevValue.length; i++) { - if (!/\s/g.test(prevValue[behindCharNum])) { - behindCharNum++; + }); + return dailyNotes; + } + async getDailyNoteByMemo(date) { + const { dailyNotes } = this.getState(); + const dailyNote = getDailyNote_1(date, dailyNotes); + return dailyNote; + } +} +const dailyNotesService = new DailyNotesService(); +var storage; +((storage2) => { + function get(keys) { + const data = {}; + for (const key of keys) { + try { + const stringifyValue = localStorage.getItem(key); + if (stringifyValue !== null) { + const val = JSON.parse(stringifyValue); + data[key] = val; } + } catch (error) { + console.error("Get storage failed in ", key, error); } - editorRef.current.value = prevValue.slice(0, editorRef.current.selectionStart - removeCharNum) + filePath + prevValue.slice(behindCharNum); - handleContentChangeCallback(editorRef.current.value); - refresh(); } - }; - const handleEditorInput = _react_17_0_2_react.exports.useCallback(() => { - var _a2, _b2; - handleContentChangeCallback((_b2 = (_a2 = editorRef.current) == null ? void 0 : _a2.value) != null ? _b2 : ""); - refresh(); - }, []); - const handleEditorKeyDown = _react_17_0_2_react.exports.useCallback((event) => { - event.stopPropagation(); - if (event.code === "Enter") { - if (event.metaKey || event.ctrlKey) { - handleCommonConfirmBtnClick(); + return data; + } + storage2.get = get; + function set(data) { + for (const key in data) { + try { + const stringifyValue = JSON.stringify(data[key]); + localStorage.setItem(key, stringifyValue); + } catch (error) { + console.error("Save storage failed in ", key, error); } } - refresh(); - }, []); - const handleCommonConfirmBtnClick = _react_17_0_2_react.exports.useCallback(() => { - var _a2; - if (!editorRef.current) { - return; - } - editorRef.current.value = getEditorContentCache2(); - handleConfirmBtnClickCallback(editorRef.current.value); - editorRef.current.value = ""; - refresh(); - (_a2 = tinyUndoRef.current) == null ? void 0 : _a2.resetState(); - }, []); - const handleCommonCancelBtnClick = _react_17_0_2_react.exports.useCallback(() => { - handleCancelBtnClickCallback(); - }, []); - const getEditorContentCache2 = () => { - var _a2; - return (_a2 = storage.get(["editorContentCache"]).editorContentCache) != null ? _a2 : ""; - }; - const getEditorContent = () => { - if (!editorRef.current) { - return; + } + storage2.set = set; + function remove(keys) { + for (const key of keys) { + try { + localStorage.removeItem(key); + } catch (error) { + console.error("Remove storage failed in ", key, error); + } } - editorRef.current.value = getEditorContentCache2(); - return editorRef.current.value; - }; - return /* @__PURE__ */ jsxs("div", { - className: "common-editor-wrapper " + className, - children: [/* @__PURE__ */ jsx(ReactTextareaAutocomplete, { - className: "common-editor-inputer scroll", - loadingComponent: Loading, - placeholder, - movePopupAsYouType: true, - ref: (rta) => { - }, - value: getEditorContent(), - innerRef: (textarea) => { - editorRef.current = textarea; - }, - onInput: handleEditorInput, - onKeyDown: handleEditorKeyDown, - style: { - minHeight: 48 - }, - dropdownStyle: { - minWidth: 180, - maxHeight: 250, - overflowY: "auto" - }, - minChar: 0, - onItemSelected: handleInsertTrigger, - scrollToItem: true, - trigger: { - "#": { - dataProvider: (token) => { - actualToken = token; - return usedTags(token).map(({ - name, - char - }) => ({ - name, - char - })); - }, - component: TItem, - afterWhitespace: true, - output: (item) => item.char - }, - "[[": { - dataProvider: (token) => { - actualToken = token; - return getSuggestions(token).slice(0, 10).map(({ - name, - char, - file - }) => ({ - name, - char, - file - })); - }, - component: TItem, - afterWhitespace: true, - output: (item) => item.char + } + storage2.remove = remove; + function emitStorageChangedEvent() { + var _a; + const iframeEl = document.createElement("iframe"); + iframeEl.style.display = "none"; + document.body.appendChild(iframeEl); + (_a = iframeEl.contentWindow) == null ? void 0 : _a.localStorage.setItem("t", Date.now().toString()); + iframeEl.remove(); + } + storage2.emitStorageChangedEvent = emitStorageChangedEvent; +})(storage || (storage = {})); +class GlobalStateService { + constructor() { + __publicField(this, "getState", () => { + return appStore.getState().globalState; + }); + __publicField(this, "setEditMemoId", (editMemoId) => { + appStore.dispatch({ + type: "SET_EDIT_MEMO_ID", + payload: { + editMemoId + } + }); + }); + __publicField(this, "setCommentMemoId", (commentMemoId) => { + appStore.dispatch({ + type: "SET_COMMENT_MEMO_ID", + payload: { + commentMemoId + } + }); + }); + __publicField(this, "setMarkMemoId", (markMemoId) => { + appStore.dispatch({ + type: "SET_MARK_MEMO_ID", + payload: { + markMemoId + } + }); + }); + __publicField(this, "setIsMobileView", (isMobileView) => { + appStore.dispatch({ + type: "SET_MOBILE_VIEW", + payload: { + isMobileView + } + }); + }); + __publicField(this, "setChangedByMemos", (changedByMemos) => { + appStore.dispatch({ + type: "SET_CHANGED_BY_MEMOS", + payload: { + changedByMemos + } + }); + }); + __publicField(this, "setShowSiderbarInMobileView", (showSiderbarInMobileView) => { + appStore.dispatch({ + type: "SET_SHOW_SIDEBAR_IN_MOBILE_VIEW", + payload: { + showSiderbarInMobileView + } + }); + }); + __publicField(this, "setAppSetting", (appSetting) => { + appStore.dispatch({ + type: "SET_APP_SETTING", + payload: appSetting + }); + storage.set(appSetting); + }); + var _a, _b, _c, _d; + const cachedSetting = storage.get([ + "shouldSplitMemoWord", + "shouldHideImageUrl", + "shouldUseMarkdownParser", + "useTinyUndoHistoryCache" + ]); + const defaultAppSetting = { + shouldSplitMemoWord: (_a = cachedSetting.shouldSplitMemoWord) != null ? _a : true, + shouldHideImageUrl: (_b = cachedSetting.shouldHideImageUrl) != null ? _b : true, + shouldUseMarkdownParser: (_c = cachedSetting.shouldUseMarkdownParser) != null ? _c : true, + useTinyUndoHistoryCache: (_d = cachedSetting.useTinyUndoHistoryCache) != null ? _d : false + }; + this.setAppSetting(defaultAppSetting); + } +} +const globalStateService = new GlobalStateService(); +class LocationService { + constructor() { + __publicField(this, "updateStateWithLocation", () => { + var _a, _b, _c, _d, _e, _f; + const { pathname, search, hash: hash2 } = window.location; + const urlParams = new URLSearchParams(search); + const state = { + pathname: "/", + hash: "", + query: { + tag: "", + duration: null, + text: "", + type: "", + filter: "" + } + }; + state.query.tag = (_a = urlParams.get("tag")) != null ? _a : ""; + state.query.type = (_b = urlParams.get("type")) != null ? _b : ""; + state.query.text = (_c = urlParams.get("text")) != null ? _c : ""; + state.query.filter = (_d = urlParams.get("filter")) != null ? _d : ""; + const from = parseInt((_e = urlParams.get("from")) != null ? _e : "0"); + const to = parseInt((_f = urlParams.get("to")) != null ? _f : "0"); + if (to > from && to !== 0) { + state.query.duration = { + from, + to + }; + } + state.hash = hash2; + state.pathname = this.getValidPathname(pathname); + appStore.dispatch({ + type: "SET_LOCATION", + payload: state + }); + }); + __publicField(this, "getState", () => { + return appStore.getState().locationState; + }); + __publicField(this, "clearQuery", () => { + appStore.dispatch({ + type: "SET_QUERY", + payload: { + tag: "", + duration: null, + text: "", + type: "", + filter: "" + } + }); + }); + __publicField(this, "setQuery", (query) => { + appStore.dispatch({ + type: "SET_QUERY", + payload: query + }); + }); + __publicField(this, "setHash", (hash2) => { + appStore.dispatch({ + type: "SET_HASH", + payload: { + hash: hash2 + } + }); + }); + __publicField(this, "setPathname", (pathname) => { + appStore.dispatch({ + type: "SET_PATHNAME", + payload: { + pathname + } + }); + }); + __publicField(this, "pushHistory", (pathname) => { + appStore.dispatch({ + type: "SET_PATHNAME", + payload: { + pathname + } + }); + }); + __publicField(this, "replaceHistory", (pathname) => { + appStore.dispatch({ + type: "SET_PATHNAME", + payload: { + pathname + } + }); + }); + __publicField(this, "setMemoTypeQuery", (type = "") => { + appStore.dispatch({ + type: "SET_TYPE", + payload: { + type + } + }); + }); + __publicField(this, "setMemoFilter", (filterId) => { + appStore.dispatch({ + type: "SET_QUERY_FILTER", + payload: filterId + }); + }); + __publicField(this, "setTextQuery", (text) => { + appStore.dispatch({ + type: "SET_TEXT", + payload: { + text + } + }); + }); + __publicField(this, "setTimeQuery", (duration) => { + appStore.dispatch({ + type: "SET_DURATION_QUERY", + payload: { + duration + } + }); + }); + __publicField(this, "setTagQuery", (tag) => { + appStore.dispatch({ + type: "SET_TAG_QUERY", + payload: { + tag + } + }); + }); + __publicField(this, "setFromAndToQuery", (from, to) => { + appStore.dispatch({ + type: "SET_DURATION_QUERY", + payload: { + duration: { from, to } } + }); + }); + __publicField(this, "getValidPathname", (pathname) => { + if (["/", "/homeboard", "/recycle", "/setting"].includes(pathname)) { + return pathname; + } else { + return "/"; } - }), /* @__PURE__ */ jsxs("div", { - className: "common-tools-wrapper", - children: [/* @__PURE__ */ jsx("div", { - className: "common-tools-container", - children: /* @__PURE__ */ jsx(Only, { - when: props.tools !== void 0, - children: props.tools - }) - }), /* @__PURE__ */ jsxs("div", { - className: "btns-container", - children: [/* @__PURE__ */ jsx(Only, { - when: showCancelBtn, - children: /* @__PURE__ */ jsx("button", { - className: "action-btn cancel-btn", - onClick: handleCommonCancelBtnClick, - children: t("CANCEL EDIT") - }) - }), /* @__PURE__ */ jsx(Only, { - when: showConfirmBtn, - children: /* @__PURE__ */ jsxs("button", { - className: "action-btn confirm-btn", - disabled: !((_b = editorRef.current) == null ? void 0 : _b.value), - onClick: handleCommonConfirmBtnClick, - children: [SaveMemoButtonLabel, /* @__PURE__ */ jsx("span", { - className: "icon-text", - children: "\u270D\uFE0F" - })] - }) - })] - })] - })] - }); -}); -var memoEditor = ""; -var selectDatePicker = ""; -var tag = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0cHgiIGZpbGw9IiMwMDAwMDAiPjxnPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCIvPjwvZz48Zz48cGF0aCBkPSJNMjAsMTBWOGgtNFY0aC0ydjRoLTRWNEg4djRINHYyaDR2NEg0djJoNHY0aDJ2LTRoNHY0aDJ2LTRoNHYtMmgtNHYtNEgyMHogTTE0LDE0aC00di00aDRWMTR6Ii8+PC9nPjwvc3ZnPg=="; -var imageSvg = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzAwMDAwMCI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS00Ljg2IDguODZsLTMgMy44N0w5IDEzLjE0IDYgMTdoMTJsLTMuODYtNS4xNHoiLz48L3N2Zz4="; -var task = "data:image/svg+xml;base64,PHN2ZyB0PSIxNjQyNDA3MDQzMTQ2IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE4ODEiIHdpZHRoPSIyNiIgaGVpZ2h0PSIyNiIgZmlsbD0iIzEyOTZkYiI+PHBhdGggZD0iTTIyNCA4MDAuMjU2TDIyMy43MTIgMjI0SDMyMHYzMS42OGMwIDM1LjQ1NiAyOC42NCA2NC4zMiA2My44NzIgNjQuMzJoMjU2LjI1NkE2NC4xNiA2NC4xNiAwIDAgMCA3MDQgMjU1LjY4VjIyNGw5Ni0wLjI1Nkw4MDAuMjU2IDgwMCAyMjQgODAwLjI1NnpNNjQwIDE5Mi4zMkw2NDAuMTI4IDI1NiAzODQgMjU1LjY4VjE5Mi4zMkwzODMuODcyIDE5MiA2NDAgMTkyLjMyek03OTkuODQgMTYwSDY5NS4wNGMtMTEuMDcyLTE5LjA0LTMxLjQyNC0zMi01NC45MTItMzJoLTI1Ni4yNTZjLTIzLjQ4OCAwLTQzLjgwOCAxMi45MjgtNTQuOTEyIDMySDIyMy43MTJBNjMuNzc2IDYzLjc3NiAwIDAgMCAxNjAgMjIzLjc0NHY1NzYuNTEyQzE2MCA4MzUuMzkyIDE4OC42MDggODY0IDIyMy43NDQgODY0aDU3Ni41MTJBNjMuODQgNjMuODQgMCAwIDAgODY0IDgwMC4yNTZWMjIzLjc0NEE2NCA2NCAwIDAgMCA3OTkuODQgMTYweiIgcC1pZD0iMTg4MiI+PC9wYXRoPjxwYXRoIGQ9Ik02MTkuMDcyIDQyOS4wODhsLTE1MS43NDQgMTY1Ljg4OC02Mi4xMTItNjkuNmEzMiAzMiAwIDEgMC00Ny43NDQgNDIuNjI0bDg1LjY5NiA5NmEzMiAzMiAwIDAgMCAyMy42OCAxMC42ODhoMC4xOTJjOC45NiAwIDE3LjUzNi0zLjc3NiAyMy42MTYtMTAuNGwxNzUuNjQ4LTE5MmEzMiAzMiAwIDAgMC00Ny4yMzItNDMuMiIgcC1pZD0iMTg4MyI+PC9wYXRoPjwvc3ZnPg0K"; -var showEditorSvg = "data:image/svg+xml;base64,PHN2ZyB0PSIxNjQyNTY0NDUyMjA4IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjYxOTQiIHdpZHRoPSIzNiIgaGVpZ2h0PSIzNiI+PHBhdGggZD0iTTUxMiAzMkMyNDggMzIgMzIgMjQ4IDMyIDUxMnMyMTYgNDgwIDQ4MCA0ODAgNDgwLTIxNiA0ODAtNDgwUzc3NiAzMiA1MTIgMzJ6IiBmaWxsPSIjRkZGRkZGIiBwLWlkPSI2MTk1Ij48L3BhdGg+PHBhdGggZD0iTTUxMiAwQzIyOC44IDAgMCAyMjguOCAwIDUxMnMyMjguOCA1MTIgNTEyIDUxMiA1MTItMjI4LjggNTEyLTUxMlM3OTUuMiAwIDUxMiAweiBtMCA5OTJDMjQ4IDk5MiAzMiA3NzYgMzIgNTEyUzI0OCAzMiA1MTIgMzJzNDgwIDIxNiA0ODAgNDgwLTIxNiA0ODAtNDgwIDQ4MHoiIGZpbGw9IiIgcC1pZD0iNjE5NiI+PC9wYXRoPjxwYXRoIGQ9Ik01MTIgNTEybS0zOTIgMGEzOTIgMzkyIDAgMSAwIDc4NCAwIDM5MiAzOTIgMCAxIDAtNzg0IDBaIiBmaWxsPSIjOURFOEY3IiBwLWlkPSI2MTk3Ij48L3BhdGg+PHBhdGggZD0iTTc4NCA0OTZINTI4VjI0MGgtMzJ2MjU2SDI0MHYzMmgyNTZ2MjU2aDMyVjUyOGgyNTZ6IiBmaWxsPSIjMUExNzE4IiBwLWlkPSI2MTk4Ij48L3BhdGg+PC9zdmc+"; -var journalSvg = "data:image/svg+xml;base64,PHN2ZyB0PSIxNjQyNDA2OTY3MTE1IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE2NTIiIHdpZHRoPSIyNiIgaGVpZ2h0PSIyNiIgZmlsbD0iIzEyOTZkYiI+PHBhdGggZD0iTTU0NCA4MDAuMTI4bC0zMjAgMC4xNi0wLjA2NC05Ni4zMi0wLjA2NC0xNjAtMC4wMzItNjQtMC4wOTYtMTYwLTAuMDMyLTk2aDU3Ni4xMjhMODAwIDIyMy43NzYgODAwLjI1NiA4MDAgNTQ0IDgwMC4xMjh6TTc5OS44NCAxNjBIMjIzLjcxMkE2My44MDggNjMuODA4IDAgMCAwIDE2MCAyMjMuNzQ0djU3Ni41NDRjMCAzNS4xMzYgMjguNjA4IDYzLjY4IDYzLjc0NCA2My42OGg1NzYuNTEyQTYzLjgwOCA2My44MDggMCAwIDAgODY0IDgwMC4zMlYyMjMuNzQ0QTY0IDY0IDAgMCAwIDc5OS44NCAxNjB6IiBwLWlkPSIxNjUzIj48L3BhdGg+PHBhdGggZD0iTTY4MC42MDggMzIwaC0yMjRhMzIgMzIgMCAwIDAgMCA2NGgyMjRhMzIgMzIgMCAwIDAgMC02NE02ODAuNjA4IDQ4MGgtMjI0YTMyIDMyIDAgMCAwIDAgNjRoMjI0YTMyIDMyIDAgMCAwIDAtNjRNNjgwLjYwOCA2NDBoLTIyNGEzMiAzMiAwIDAgMCAwIDY0aDIyNGEzMiAzMiAwIDAgMCAwLTY0TTM1MiAzMjBhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDAgMCAwLTY0TTM1MiA0ODBhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDAgMCAwLTY0TTM1MiA2NDBhMzIgMzIgMCAxIDAgMCA2NCAzMiAzMiAwIDAgMCAwLTY0IiBwLWlkPSIxNjU0Ij48L3BhdGg+PC9zdmc+"; -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -var __assign = function() { - __assign = Object.assign || function __assign2(t2) { - for (var s, i = 1, n2 = arguments.length; i < n2; i++) { - s = arguments[i]; - for (var p2 in s) - if (Object.prototype.hasOwnProperty.call(s, p2)) - t2[p2] = s[p2]; - } - return t2; - }; - return __assign.apply(this, arguments); -}; -function __rest(s, e) { - var t2 = {}; - for (var p2 in s) - if (Object.prototype.hasOwnProperty.call(s, p2) && e.indexOf(p2) < 0) - t2[p2] = s[p2]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p2 = Object.getOwnPropertySymbols(s); i < p2.length; i++) { - if (e.indexOf(p2[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p2[i])) - t2[p2[i]] = s[p2[i]]; - } - return t2; -} -function __spreadArray(to, from, pack) { - if (pack || arguments.length === 2) - for (var i = 0, l2 = from.length, ar2; i < l2; i++) { - if (ar2 || !(i in from)) { - if (!ar2) - ar2 = Array.prototype.slice.call(from, 0, i); - ar2[i] = from[i]; - } - } - return to.concat(ar2 || Array.prototype.slice.call(from)); -} -function canUseDOM() { - return !!(typeof window !== "undefined" && window.document && window.document.createElement); -} -var useIsomorphicLayoutEffect$1 = /* @__PURE__ */ canUseDOM() ? _react_17_0_2_react.exports.useLayoutEffect : _react_17_0_2_react.exports.useEffect; -var serverHandoffComplete = false; -var id = 0; -var genId = function genId2() { - return ++id; -}; -function useId(idFromProps) { - var initialId = idFromProps || (serverHandoffComplete ? genId() : null); - var _React$useState = _react_17_0_2_react.exports.useState(initialId), id2 = _React$useState[0], setId = _React$useState[1]; - useIsomorphicLayoutEffect$1(function() { - if (id2 === null) { - setId(genId()); - } - }, []); - _react_17_0_2_react.exports.useEffect(function() { - if (serverHandoffComplete === false) { - serverHandoffComplete = true; - } - }, []); - return id2 != null ? String(id2) : void 0; -} -function buildFormatLongFn(args) { - return function() { - var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; - var width = options.width ? String(options.width) : args.defaultWidth; - var format2 = args.formats[width] || args.formats[args.defaultWidth]; - return format2; - }; -} -function buildLocalizeFn(args) { - return function(dirtyIndex, dirtyOptions) { - var options = dirtyOptions || {}; - var context = options.context ? String(options.context) : "standalone"; - var valuesArray; - if (context === "formatting" && args.formattingValues) { - var defaultWidth = args.defaultFormattingWidth || args.defaultWidth; - var width = options.width ? String(options.width) : defaultWidth; - valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth]; - } else { - var _defaultWidth = args.defaultWidth; - var _width = options.width ? String(options.width) : args.defaultWidth; - valuesArray = args.values[_width] || args.values[_defaultWidth]; - } - var index = args.argumentCallback ? args.argumentCallback(dirtyIndex) : dirtyIndex; - return valuesArray[index]; - }; -} -function buildMatchPatternFn(args) { - return function(string) { - var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; - var matchResult = string.match(args.matchPattern); - if (!matchResult) - return null; - var matchedString = matchResult[0]; - var parseResult = string.match(args.parsePattern); - if (!parseResult) - return null; - var value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0]; - value = options.valueCallback ? options.valueCallback(value) : value; - var rest = string.slice(matchedString.length); - return { - value, - rest - }; - }; -} -function buildMatchFn(args) { - return function(string) { - var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; - var width = options.width; - var matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth]; - var matchResult = string.match(matchPattern); - if (!matchResult) { - return null; - } - var matchedString = matchResult[0]; - var parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth]; - var key = Array.isArray(parsePatterns) ? findIndex$1(parsePatterns, function(pattern) { - return pattern.test(matchedString); - }) : findKey(parsePatterns, function(pattern) { - return pattern.test(matchedString); }); - var value; - value = args.valueCallback ? args.valueCallback(key) : key; - value = options.valueCallback ? options.valueCallback(value) : value; - var rest = string.slice(matchedString.length); - return { - value, - rest + this.updateStateWithLocation(); + window.onpopstate = () => { + this.updateStateWithLocation(); }; - }; -} -function findKey(object, predicate) { - for (var key in object) { - if (object.hasOwnProperty(key) && predicate(object[key])) { - return key; - } - } - return void 0; -} -function findIndex$1(array, predicate) { - for (var key = 0; key < array.length; key++) { - if (predicate(array[key])) { - return key; - } - } - return void 0; -} -function requiredArgs(required, args) { - if (args.length < required) { - throw new TypeError(required + " argument" + (required > 1 ? "s" : "") + " required, but only " + args.length + " present"); } } -function toDate(argument) { - requiredArgs(1, arguments); - var argStr = Object.prototype.toString.call(argument); - if (argument instanceof Date || typeof argument === "object" && argStr === "[object Date]") { - return new Date(argument.getTime()); - } else if (typeof argument === "number" || argStr === "[object Number]") { - return new Date(argument); - } else { - if ((typeof argument === "string" || argStr === "[object String]") && typeof console !== "undefined") { - console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://git.io/fjule"); - console.warn(new Error().stack); - } - return new Date(NaN); - } -} -function toInteger(dirtyNumber) { - if (dirtyNumber === null || dirtyNumber === true || dirtyNumber === false) { - return NaN; - } - var number = Number(dirtyNumber); - if (isNaN(number)) { - return number; - } - return number < 0 ? Math.ceil(number) : Math.floor(number); -} -function startOfUTCWeek(dirtyDate, dirtyOptions) { - requiredArgs(1, arguments); - var options = dirtyOptions || {}; - var locale2 = options.locale; - var localeWeekStartsOn = locale2 && locale2.options && locale2.options.weekStartsOn; - var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn); - var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); - if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { - throw new RangeError("weekStartsOn must be between 0 and 6 inclusively"); - } - var date = toDate(dirtyDate); - var day = date.getUTCDay(); - var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn; - date.setUTCDate(date.getUTCDate() - diff); - date.setUTCHours(0, 0, 0, 0); - return date; -} -function addDays(dirtyDate, dirtyAmount) { - requiredArgs(2, arguments); - var date = toDate(dirtyDate); - var amount = toInteger(dirtyAmount); - if (isNaN(amount)) { - return new Date(NaN); - } - if (!amount) { - return date; - } - date.setDate(date.getDate() + amount); - return date; -} -function addMonths(dirtyDate, dirtyAmount) { - requiredArgs(2, arguments); - var date = toDate(dirtyDate); - var amount = toInteger(dirtyAmount); - if (isNaN(amount)) { - return new Date(NaN); - } - if (!amount) { - return date; - } - var dayOfMonth = date.getDate(); - var endOfDesiredMonth = new Date(date.getTime()); - endOfDesiredMonth.setMonth(date.getMonth() + amount + 1, 0); - var daysInMonth = endOfDesiredMonth.getDate(); - if (dayOfMonth >= daysInMonth) { - return endOfDesiredMonth; - } else { - date.setFullYear(endOfDesiredMonth.getFullYear(), endOfDesiredMonth.getMonth(), dayOfMonth); - return date; - } -} -function addMilliseconds(dirtyDate, dirtyAmount) { - requiredArgs(2, arguments); - var timestamp = toDate(dirtyDate).getTime(); - var amount = toInteger(dirtyAmount); - return new Date(timestamp + amount); -} -function startOfWeek(dirtyDate, dirtyOptions) { - requiredArgs(1, arguments); - var options = dirtyOptions || {}; - var locale2 = options.locale; - var localeWeekStartsOn = locale2 && locale2.options && locale2.options.weekStartsOn; - var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn); - var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); - if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { - throw new RangeError("weekStartsOn must be between 0 and 6 inclusively"); - } - var date = toDate(dirtyDate); - var day = date.getDay(); - var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn; - date.setDate(date.getDate() - diff); - date.setHours(0, 0, 0, 0); - return date; -} -function getTimezoneOffsetInMilliseconds(date) { - var utcDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds())); - utcDate.setUTCFullYear(date.getFullYear()); - return date.getTime() - utcDate.getTime(); -} -function startOfDay(dirtyDate) { - requiredArgs(1, arguments); - var date = toDate(dirtyDate); - date.setHours(0, 0, 0, 0); - return date; -} -var MILLISECONDS_IN_DAY$1 = 864e5; -function differenceInCalendarDays(dirtyDateLeft, dirtyDateRight) { - requiredArgs(2, arguments); - var startOfDayLeft = startOfDay(dirtyDateLeft); - var startOfDayRight = startOfDay(dirtyDateRight); - var timestampLeft = startOfDayLeft.getTime() - getTimezoneOffsetInMilliseconds(startOfDayLeft); - var timestampRight = startOfDayRight.getTime() - getTimezoneOffsetInMilliseconds(startOfDayRight); - return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_DAY$1); -} -function addWeeks(dirtyDate, dirtyAmount) { - requiredArgs(2, arguments); - var amount = toInteger(dirtyAmount); - var days = amount * 7; - return addDays(dirtyDate, days); -} -function addYears(dirtyDate, dirtyAmount) { - requiredArgs(2, arguments); - var amount = toInteger(dirtyAmount); - return addMonths(dirtyDate, amount * 12); -} -function isSameDay(dirtyDateLeft, dirtyDateRight) { - requiredArgs(2, arguments); - var dateLeftStartOfDay = startOfDay(dirtyDateLeft); - var dateRightStartOfDay = startOfDay(dirtyDateRight); - return dateLeftStartOfDay.getTime() === dateRightStartOfDay.getTime(); -} -function isDate(value) { - requiredArgs(1, arguments); - return value instanceof Date || typeof value === "object" && Object.prototype.toString.call(value) === "[object Date]"; -} -function isValid(dirtyDate) { - requiredArgs(1, arguments); - if (!isDate(dirtyDate) && typeof dirtyDate !== "number") { - return false; - } - var date = toDate(dirtyDate); - return !isNaN(Number(date)); -} -function differenceInCalendarMonths(dirtyDateLeft, dirtyDateRight) { - requiredArgs(2, arguments); - var dateLeft = toDate(dirtyDateLeft); - var dateRight = toDate(dirtyDateRight); - var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear(); - var monthDiff = dateLeft.getMonth() - dateRight.getMonth(); - return yearDiff * 12 + monthDiff; -} -var MILLISECONDS_IN_WEEK$3 = 6048e5; -function differenceInCalendarWeeks(dirtyDateLeft, dirtyDateRight, dirtyOptions) { - requiredArgs(2, arguments); - var startOfWeekLeft = startOfWeek(dirtyDateLeft, dirtyOptions); - var startOfWeekRight = startOfWeek(dirtyDateRight, dirtyOptions); - var timestampLeft = startOfWeekLeft.getTime() - getTimezoneOffsetInMilliseconds(startOfWeekLeft); - var timestampRight = startOfWeekRight.getTime() - getTimezoneOffsetInMilliseconds(startOfWeekRight); - return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK$3); -} -function endOfMonth(dirtyDate) { - requiredArgs(1, arguments); - var date = toDate(dirtyDate); - var month = date.getMonth(); - date.setFullYear(date.getFullYear(), month + 1, 0); - date.setHours(23, 59, 59, 999); - return date; -} -function startOfMonth(dirtyDate) { - requiredArgs(1, arguments); - var date = toDate(dirtyDate); - date.setDate(1); - date.setHours(0, 0, 0, 0); - return date; -} -function startOfYear(dirtyDate) { - requiredArgs(1, arguments); - var cleanDate = toDate(dirtyDate); - var date = new Date(0); - date.setFullYear(cleanDate.getFullYear(), 0, 1); - date.setHours(0, 0, 0, 0); - return date; -} -function endOfWeek(dirtyDate, dirtyOptions) { - requiredArgs(1, arguments); - var options = dirtyOptions || {}; - var locale2 = options.locale; - var localeWeekStartsOn = locale2 && locale2.options && locale2.options.weekStartsOn; - var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn); - var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); - if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { - throw new RangeError("weekStartsOn must be between 0 and 6 inclusively"); - } - var date = toDate(dirtyDate); - var day = date.getDay(); - var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn); - date.setDate(date.getDate() + diff); - date.setHours(23, 59, 59, 999); - return date; -} -var formatDistanceLocale = { - lessThanXSeconds: { - one: "less than a second", - other: "less than {{count}} seconds" - }, - xSeconds: { - one: "1 second", - other: "{{count}} seconds" - }, - halfAMinute: "half a minute", - lessThanXMinutes: { - one: "less than a minute", - other: "less than {{count}} minutes" - }, - xMinutes: { - one: "1 minute", - other: "{{count}} minutes" - }, - aboutXHours: { - one: "about 1 hour", - other: "about {{count}} hours" - }, - xHours: { - one: "1 hour", - other: "{{count}} hours" - }, - xDays: { - one: "1 day", - other: "{{count}} days" - }, - aboutXWeeks: { - one: "about 1 week", - other: "about {{count}} weeks" - }, - xWeeks: { - one: "1 week", - other: "{{count}} weeks" - }, - aboutXMonths: { - one: "about 1 month", - other: "about {{count}} months" - }, - xMonths: { - one: "1 month", - other: "{{count}} months" - }, - aboutXYears: { - one: "about 1 year", - other: "about {{count}} years" - }, - xYears: { - one: "1 year", - other: "{{count}} years" - }, - overXYears: { - one: "over 1 year", - other: "over {{count}} years" - }, - almostXYears: { - one: "almost 1 year", - other: "almost {{count}} years" - } -}; -var formatDistance = function(token, count, options) { - var result; - var tokenValue = formatDistanceLocale[token]; - if (typeof tokenValue === "string") { - result = tokenValue; - } else if (count === 1) { - result = tokenValue.one; - } else { - result = tokenValue.other.replace("{{count}}", count.toString()); - } - if (options !== null && options !== void 0 && options.addSuffix) { - if (options.comparison && options.comparison > 0) { - return "in " + result; - } else { - return result + " ago"; - } - } - return result; -}; -var formatDistance$1 = formatDistance; -var dateFormats = { - full: "EEEE, MMMM do, y", - long: "MMMM do, y", - medium: "MMM d, y", - short: "MM/dd/yyyy" -}; -var timeFormats = { - full: "h:mm:ss a zzzz", - long: "h:mm:ss a z", - medium: "h:mm:ss a", - short: "h:mm a" -}; -var dateTimeFormats = { - full: "{{date}} 'at' {{time}}", - long: "{{date}} 'at' {{time}}", - medium: "{{date}}, {{time}}", - short: "{{date}}, {{time}}" -}; -var formatLong = { - date: buildFormatLongFn({ - formats: dateFormats, - defaultWidth: "full" - }), - time: buildFormatLongFn({ - formats: timeFormats, - defaultWidth: "full" - }), - dateTime: buildFormatLongFn({ - formats: dateTimeFormats, - defaultWidth: "full" - }) -}; -var formatLong$1 = formatLong; -var formatRelativeLocale = { - lastWeek: "'last' eeee 'at' p", - yesterday: "'yesterday at' p", - today: "'today at' p", - tomorrow: "'tomorrow at' p", - nextWeek: "eeee 'at' p", - other: "P" -}; -var formatRelative = function(token, _date, _baseDate, _options) { - return formatRelativeLocale[token]; -}; -var formatRelative$1 = formatRelative; -var eraValues = { - narrow: ["B", "A"], - abbreviated: ["BC", "AD"], - wide: ["Before Christ", "Anno Domini"] -}; -var quarterValues = { - narrow: ["1", "2", "3", "4"], - abbreviated: ["Q1", "Q2", "Q3", "Q4"], - wide: ["1st quarter", "2nd quarter", "3rd quarter", "4th quarter"] -}; -var monthValues = { - narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], - abbreviated: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - wide: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] -}; -var dayValues = { - narrow: ["S", "M", "T", "W", "T", "F", "S"], - short: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], - abbreviated: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - wide: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] -}; -var dayPeriodValues = { - narrow: { - am: "a", - pm: "p", - midnight: "mi", - noon: "n", - morning: "morning", - afternoon: "afternoon", - evening: "evening", - night: "night" - }, - abbreviated: { - am: "AM", - pm: "PM", - midnight: "midnight", - noon: "noon", - morning: "morning", - afternoon: "afternoon", - evening: "evening", - night: "night" - }, - wide: { - am: "a.m.", - pm: "p.m.", - midnight: "midnight", - noon: "noon", - morning: "morning", - afternoon: "afternoon", - evening: "evening", - night: "night" - } -}; -var formattingDayPeriodValues = { - narrow: { - am: "a", - pm: "p", - midnight: "mi", - noon: "n", - morning: "in the morning", - afternoon: "in the afternoon", - evening: "in the evening", - night: "at night" - }, - abbreviated: { - am: "AM", - pm: "PM", - midnight: "midnight", - noon: "noon", - morning: "in the morning", - afternoon: "in the afternoon", - evening: "in the evening", - night: "at night" - }, - wide: { - am: "a.m.", - pm: "p.m.", - midnight: "midnight", - noon: "noon", - morning: "in the morning", - afternoon: "in the afternoon", - evening: "in the evening", - night: "at night" - } -}; -var ordinalNumber = function(dirtyNumber, _options) { - var number = Number(dirtyNumber); - var rem100 = number % 100; - if (rem100 > 20 || rem100 < 10) { - switch (rem100 % 10) { - case 1: - return number + "st"; - case 2: - return number + "nd"; - case 3: - return number + "rd"; +const locationService = new LocationService(); +const findQuery = async () => { + const { metadataCache, vault } = appStore.getState().dailyNotesState.app; + const queryList2 = []; + const filePath = getDailyNotePath(); + const absolutePath = filePath + "/" + QueryFileName + ".md"; + const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath); + if (queryFile instanceof require$$0.TFile) { + const fileContents = await vault.read(queryFile); + const fileLines = getAllLinesFromFile$9(fileContents); + if (fileLines && fileLines.length != 0) { + for (let i = 0; i < fileLines.length; i++) { + if (fileLines[i] === "") + continue; + const createdDateString = getCreatedDateFromLine(fileLines[i]); + const createdDate = require$$0.moment(createdDateString, "YYYYMMDDHHmmss").format("YYYY/MM/DD HH:mm:ss"); + const updatedDate = createdDate; + const id2 = createdDateString + getIDFromLine$1(fileLines[i]); + const querystring = getStringFromLine(fileLines[i]); + const title = getTitleFromLine(fileLines[i]); + let pinnedDate; + if (/^(.+)pinnedAt(.+)$/.test(fileLines[i])) { + pinnedDate = require$$0.moment(getPinnedDateFromLine$1(fileLines[i]), "YYYYMMDDHHmmss"); + queryList2.push({ + createdAt: createdDate, + id: id2, + pinnedAt: pinnedDate.format("YYYY/MM/DD HH:mm:ss"), + querystring, + title, + updatedAt: updatedDate, + userId: "" + }); + } else if (/^(.+)\[\](.+)?$/.test(fileLines[i])) { + queryList2.push({ + createdAt: createdDate, + id: id2, + pinnedAt: "", + querystring: "", + title, + updatedAt: updatedDate, + userId: "" + }); + } else { + queryList2.push({ + createdAt: createdDate, + id: id2, + pinnedAt: "", + querystring, + title, + updatedAt: updatedDate, + userId: "" + }); + } + } } } - return number + "th"; -}; -var localize = { - ordinalNumber, - era: buildLocalizeFn({ - values: eraValues, - defaultWidth: "wide" - }), - quarter: buildLocalizeFn({ - values: quarterValues, - defaultWidth: "wide", - argumentCallback: function(quarter) { - return quarter - 1; - } - }), - month: buildLocalizeFn({ - values: monthValues, - defaultWidth: "wide" - }), - day: buildLocalizeFn({ - values: dayValues, - defaultWidth: "wide" - }), - dayPeriod: buildLocalizeFn({ - values: dayPeriodValues, - defaultWidth: "wide", - formattingValues: formattingDayPeriodValues, - defaultFormattingWidth: "wide" - }) -}; -var localize$1 = localize; -var matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i; -var parseOrdinalNumberPattern = /\d+/i; -var matchEraPatterns = { - narrow: /^(b|a)/i, - abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i, - wide: /^(before christ|before common era|anno domini|common era)/i -}; -var parseEraPatterns = { - any: [/^b/i, /^(a|c)/i] + return queryList2; }; -var matchQuarterPatterns = { - narrow: /^[1234]/i, - abbreviated: /^q[1234]/i, - wide: /^[1234](th|st|nd|rd)? quarter/i +const getAllLinesFromFile$9 = (cache) => cache.split(/\r?\n/); +const getCreatedDateFromLine = (line) => { + var _a; + return (_a = /^(\d{14})/.exec(line)) == null ? void 0 : _a[1]; }; -var parseQuarterPatterns = { - any: [/1/i, /2/i, /3/i, /4/i] +const getIDFromLine$1 = (line) => { + var _a; + return (_a = /^(\d{14})(\d{1,})\s/.exec(line)) == null ? void 0 : _a[2]; }; -var matchMonthPatterns = { - narrow: /^[jfmasond]/i, - abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i, - wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i +const getStringFromLine = (line) => { + var _a; + return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)?\])/.exec(line)) == null ? void 0 : _a[4]; }; -var parseMonthPatterns = { - narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i], - any: [/^ja/i, /^f/i, /^mar/i, /^ap/i, /^may/i, /^jun/i, /^jul/i, /^au/i, /^s/i, /^o/i, /^n/i, /^d/i] +const getTitleFromLine = (line) => { + var _a; + return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])/.exec(line)) == null ? void 0 : _a[3]; }; -var matchDayPatterns = { - narrow: /^[smtwf]/i, - short: /^(su|mo|tu|we|th|fr|sa)/i, - abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i, - wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i +const getPinnedDateFromLine$1 = (line) => { + var _a; + return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])\s(pinnedAt: (\d{14}))/.exec(line)) == null ? void 0 : _a[7]; }; -var parseDayPatterns = { - narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i], - any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i] +const createObsidianQuery = async (title, querystring) => { + const { metadataCache, vault } = appStore.getState().dailyNotesState.app; + const filePath = getDailyNotePath(); + const absolutePath = filePath + "/" + QueryFileName + ".md"; + const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath); + if (queryFile instanceof require$$0.TFile) { + const fileContents = await vault.read(queryFile); + const fileLines = getAllLinesFromFile$8(fileContents); + const date = require$$0.moment(); + const createdDate = date.format("YYYY/MM/DD HH:mm:ss"); + const updatedDate = createdDate; + let lineNum; + if (fileLines.length === 1 && fileLines[0] === "") { + lineNum = 1; + } else { + lineNum = fileLines.length + 1; + } + const id2 = date.format("YYYYMMDDHHmmss") + lineNum; + await createQueryInFile(queryFile, fileContents, id2, title, querystring); + return [ + { + createdAt: createdDate, + id: id2, + pinnedAt: "", + querystring, + title, + updatedAt: updatedDate, + userId: "" + } + ]; + } else { + const queryFilePath = require$$0.normalizePath(absolutePath); + const file = await createQueryFile(queryFilePath); + const fileContents = await vault.read(file); + const date = require$$0.moment(); + const createdDate = date.format("YYYY/MM/DD HH:mm:ss"); + const updatedDate = createdDate; + const id2 = date.format("YYYYMMDDHHmmss") + 1; + await createQueryInFile(file, fileContents, id2, title, querystring); + return [ + { + createdAt: createdDate, + id: id2, + pinnedAt: "", + querystring, + title, + updatedAt: updatedDate, + userId: "" + } + ]; + } }; -var matchDayPeriodPatterns = { - narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i, - any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i +const createQueryInFile = async (file, fileContent, id2, title, queryString) => { + const { vault } = appStore.getState().dailyNotesState.app; + let newContent; + if (fileContent === "") { + newContent = id2 + " " + title + " " + queryString; + } else { + newContent = fileContent + "\n" + id2 + " " + title + " " + queryString; + } + await vault.modify(file, newContent); + return true; }; -var parseDayPeriodPatterns = { - any: { - am: /^a/i, - pm: /^p/i, - midnight: /^mi/i, - noon: /^no/i, - morning: /morning/i, - afternoon: /afternoon/i, - evening: /evening/i, - night: /night/i +const createQueryFile = async (path) => { + const { vault } = appStore.getState().dailyNotesState.app; + try { + const createdFile = await vault.create(path, ""); + return createdFile; + } catch (err) { + console.error(`Failed to create file: '${path}'`, err); + new require$$0.Notice(t("Unable to create new file.")); } }; -var match = { - ordinalNumber: buildMatchPatternFn({ - matchPattern: matchOrdinalNumberPattern, - parsePattern: parseOrdinalNumberPattern, - valueCallback: function(value) { - return parseInt(value, 10); - } - }), - era: buildMatchFn({ - matchPatterns: matchEraPatterns, - defaultMatchWidth: "wide", - parsePatterns: parseEraPatterns, - defaultParseWidth: "any" - }), - quarter: buildMatchFn({ - matchPatterns: matchQuarterPatterns, - defaultMatchWidth: "wide", - parsePatterns: parseQuarterPatterns, - defaultParseWidth: "any", - valueCallback: function(index) { - return index + 1; - } - }), - month: buildMatchFn({ - matchPatterns: matchMonthPatterns, - defaultMatchWidth: "wide", - parsePatterns: parseMonthPatterns, - defaultParseWidth: "any" - }), - day: buildMatchFn({ - matchPatterns: matchDayPatterns, - defaultMatchWidth: "wide", - parsePatterns: parseDayPatterns, - defaultParseWidth: "any" - }), - dayPeriod: buildMatchFn({ - matchPatterns: matchDayPeriodPatterns, - defaultMatchWidth: "any", - parsePatterns: parseDayPeriodPatterns, - defaultParseWidth: "any" - }) +const getAllLinesFromFile$8 = (cache) => cache.split(/\r?\n/); +var lib = {}; +Object.defineProperty(lib, "__esModule", { value: true }); +const getAPI = (app2) => { + var _a; + if (app2) + return (_a = app2.plugins.plugins.dataview) === null || _a === void 0 ? void 0 : _a.api; + else + return window["DataviewAPI"]; }; -var match$1 = match; -var locale = { - code: "en-US", - formatDistance: formatDistance$1, - formatLong: formatLong$1, - formatRelative: formatRelative$1, - localize: localize$1, - match: match$1, - options: { - weekStartsOn: 0, - firstWeekContainsDate: 1 +const isPluginEnabled = (app2) => app2.plugins.enabledPlugins.has("dataview"); +var getAPI_1 = lib.getAPI = getAPI; +lib.isPluginEnabled = isPluginEnabled; +class DailyNotesFolderMissingError extends Error { +} +const getTaskType = (memoTaskType) => { + let memoType; + if (memoTaskType === " ") { + memoType = "TASK-TODO"; + return memoType; + } else if (memoTaskType === "x" || memoTaskType === "X") { + memoType = "TASK-DONE"; + return memoType; + } else { + memoType = "TASK-" + memoTaskType; + return memoType; } }; -var enUS = locale; -function subMilliseconds(dirtyDate, dirtyAmount) { - requiredArgs(2, arguments); - var amount = toInteger(dirtyAmount); - return addMilliseconds(dirtyDate, -amount); -} -var MILLISECONDS_IN_DAY = 864e5; -function getUTCDayOfYear(dirtyDate) { - requiredArgs(1, arguments); - var date = toDate(dirtyDate); - var timestamp = date.getTime(); - date.setUTCMonth(0, 1); - date.setUTCHours(0, 0, 0, 0); - var startOfYearTimestamp = date.getTime(); - var difference = timestamp - startOfYearTimestamp; - return Math.floor(difference / MILLISECONDS_IN_DAY) + 1; -} -function startOfUTCISOWeek(dirtyDate) { - requiredArgs(1, arguments); - var weekStartsOn = 1; - var date = toDate(dirtyDate); - var day = date.getUTCDay(); - var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn; - date.setUTCDate(date.getUTCDate() - diff); - date.setUTCHours(0, 0, 0, 0); - return date; -} -function getUTCISOWeekYear(dirtyDate) { - requiredArgs(1, arguments); - var date = toDate(dirtyDate); - var year = date.getUTCFullYear(); - var fourthOfJanuaryOfNextYear = new Date(0); - fourthOfJanuaryOfNextYear.setUTCFullYear(year + 1, 0, 4); - fourthOfJanuaryOfNextYear.setUTCHours(0, 0, 0, 0); - var startOfNextYear = startOfUTCISOWeek(fourthOfJanuaryOfNextYear); - var fourthOfJanuaryOfThisYear = new Date(0); - fourthOfJanuaryOfThisYear.setUTCFullYear(year, 0, 4); - fourthOfJanuaryOfThisYear.setUTCHours(0, 0, 0, 0); - var startOfThisYear = startOfUTCISOWeek(fourthOfJanuaryOfThisYear); - if (date.getTime() >= startOfNextYear.getTime()) { - return year + 1; - } else if (date.getTime() >= startOfThisYear.getTime()) { - return year; - } else { - return year - 1; - } -} -function startOfUTCISOWeekYear(dirtyDate) { - requiredArgs(1, arguments); - var year = getUTCISOWeekYear(dirtyDate); - var fourthOfJanuary = new Date(0); - fourthOfJanuary.setUTCFullYear(year, 0, 4); - fourthOfJanuary.setUTCHours(0, 0, 0, 0); - var date = startOfUTCISOWeek(fourthOfJanuary); - return date; -} -var MILLISECONDS_IN_WEEK$2 = 6048e5; -function getUTCISOWeek(dirtyDate) { - requiredArgs(1, arguments); - var date = toDate(dirtyDate); - var diff = startOfUTCISOWeek(date).getTime() - startOfUTCISOWeekYear(date).getTime(); - return Math.round(diff / MILLISECONDS_IN_WEEK$2) + 1; -} -function getUTCWeekYear(dirtyDate, dirtyOptions) { - requiredArgs(1, arguments); - var date = toDate(dirtyDate); - var year = date.getUTCFullYear(); - var options = dirtyOptions || {}; - var locale2 = options.locale; - var localeFirstWeekContainsDate = locale2 && locale2.options && locale2.options.firstWeekContainsDate; - var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate); - var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate); - if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) { - throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively"); - } - var firstWeekOfNextYear = new Date(0); - firstWeekOfNextYear.setUTCFullYear(year + 1, 0, firstWeekContainsDate); - firstWeekOfNextYear.setUTCHours(0, 0, 0, 0); - var startOfNextYear = startOfUTCWeek(firstWeekOfNextYear, dirtyOptions); - var firstWeekOfThisYear = new Date(0); - firstWeekOfThisYear.setUTCFullYear(year, 0, firstWeekContainsDate); - firstWeekOfThisYear.setUTCHours(0, 0, 0, 0); - var startOfThisYear = startOfUTCWeek(firstWeekOfThisYear, dirtyOptions); - if (date.getTime() >= startOfNextYear.getTime()) { - return year + 1; - } else if (date.getTime() >= startOfThisYear.getTime()) { - return year; +async function getRemainingMemos(note) { + if (!note) { + return 0; + } + const { vault } = appStore.getState().dailyNotesState.app; + let fileContents = await vault.read(note); + let regexMatch; + if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) { + regexMatch = "(-|\\*) (\\[(.{1})\\]\\s)?" + DefaultMemoComposition.replace(/{TIME}/g, "((\\)?\\d{1,2}:\\d{2})?").replace(/ {CONTENT}/g, ""); } else { - return year - 1; - } -} -function startOfUTCWeekYear(dirtyDate, dirtyOptions) { - requiredArgs(1, arguments); - var options = dirtyOptions || {}; - var locale2 = options.locale; - var localeFirstWeekContainsDate = locale2 && locale2.options && locale2.options.firstWeekContainsDate; - var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate); - var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate); - var year = getUTCWeekYear(dirtyDate, dirtyOptions); - var firstWeek = new Date(0); - firstWeek.setUTCFullYear(year, 0, firstWeekContainsDate); - firstWeek.setUTCHours(0, 0, 0, 0); - var date = startOfUTCWeek(firstWeek, dirtyOptions); - return date; -} -var MILLISECONDS_IN_WEEK$1 = 6048e5; -function getUTCWeek(dirtyDate, options) { - requiredArgs(1, arguments); - var date = toDate(dirtyDate); - var diff = startOfUTCWeek(date, options).getTime() - startOfUTCWeekYear(date, options).getTime(); - return Math.round(diff / MILLISECONDS_IN_WEEK$1) + 1; -} -function addLeadingZeros(number, targetLength) { - var sign = number < 0 ? "-" : ""; - var output = Math.abs(number).toString(); - while (output.length < targetLength) { - output = "0" + output; - } - return sign + output; -} -var formatters$3 = { - y: function(date, token) { - var signedYear = date.getUTCFullYear(); - var year = signedYear > 0 ? signedYear : 1 - signedYear; - return addLeadingZeros(token === "yy" ? year % 100 : year, token.length); - }, - M: function(date, token) { - var month = date.getUTCMonth(); - return token === "M" ? String(month + 1) : addLeadingZeros(month + 1, 2); - }, - d: function(date, token) { - return addLeadingZeros(date.getUTCDate(), token.length); - }, - a: function(date, token) { - var dayPeriodEnumValue = date.getUTCHours() / 12 >= 1 ? "pm" : "am"; - switch (token) { - case "a": - case "aa": - return dayPeriodEnumValue.toUpperCase(); - case "aaa": - return dayPeriodEnumValue; - case "aaaaa": - return dayPeriodEnumValue[0]; - case "aaaa": - default: - return dayPeriodEnumValue === "am" ? "a.m." : "p.m."; - } - }, - h: function(date, token) { - return addLeadingZeros(date.getUTCHours() % 12 || 12, token.length); - }, - H: function(date, token) { - return addLeadingZeros(date.getUTCHours(), token.length); - }, - m: function(date, token) { - return addLeadingZeros(date.getUTCMinutes(), token.length); - }, - s: function(date, token) { - return addLeadingZeros(date.getUTCSeconds(), token.length); - }, - S: function(date, token) { - var numberOfDigits = token.length; - var milliseconds = date.getUTCMilliseconds(); - var fractionalSeconds = Math.floor(milliseconds * Math.pow(10, numberOfDigits - 3)); - return addLeadingZeros(fractionalSeconds, token.length); + regexMatch = "(-|\\*) (\\[(.{1})\\]\\s)?((\\)?\\d{1,2}\\:\\d{2})?"; } -}; -var formatters$4 = formatters$3; -var dayPeriodEnum = { - am: "am", - pm: "pm", - midnight: "midnight", - noon: "noon", - morning: "morning", - afternoon: "afternoon", - evening: "evening", - night: "night" -}; -var formatters$1 = { - G: function(date, token, localize2) { - var era = date.getUTCFullYear() > 0 ? 1 : 0; - switch (token) { - case "G": - case "GG": - case "GGG": - return localize2.era(era, { - width: "abbreviated" - }); - case "GGGGG": - return localize2.era(era, { - width: "narrow" - }); - case "GGGG": - default: - return localize2.era(era, { - width: "wide" - }); - } - }, - y: function(date, token, localize2) { - if (token === "yo") { - var signedYear = date.getUTCFullYear(); - var year = signedYear > 0 ? signedYear : 1 - signedYear; - return localize2.ordinalNumber(year, { - unit: "year" - }); - } - return formatters$4.y(date, token); - }, - Y: function(date, token, localize2, options) { - var signedWeekYear = getUTCWeekYear(date, options); - var weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear; - if (token === "YY") { - var twoDigitYear = weekYear % 100; - return addLeadingZeros(twoDigitYear, 2); - } - if (token === "Yo") { - return localize2.ordinalNumber(weekYear, { - unit: "year" - }); - } - return addLeadingZeros(weekYear, token.length); - }, - R: function(date, token) { - var isoWeekYear = getUTCISOWeekYear(date); - return addLeadingZeros(isoWeekYear, token.length); - }, - u: function(date, token) { - var year = date.getUTCFullYear(); - return addLeadingZeros(year, token.length); - }, - Q: function(date, token, localize2) { - var quarter = Math.ceil((date.getUTCMonth() + 1) / 3); - switch (token) { - case "Q": - return String(quarter); - case "QQ": - return addLeadingZeros(quarter, 2); - case "Qo": - return localize2.ordinalNumber(quarter, { - unit: "quarter" - }); - case "QQQ": - return localize2.quarter(quarter, { - width: "abbreviated", - context: "formatting" - }); - case "QQQQQ": - return localize2.quarter(quarter, { - width: "narrow", - context: "formatting" - }); - case "QQQQ": - default: - return localize2.quarter(quarter, { - width: "wide", - context: "formatting" - }); - } - }, - q: function(date, token, localize2) { - var quarter = Math.ceil((date.getUTCMonth() + 1) / 3); - switch (token) { - case "q": - return String(quarter); - case "qq": - return addLeadingZeros(quarter, 2); - case "qo": - return localize2.ordinalNumber(quarter, { - unit: "quarter" - }); - case "qqq": - return localize2.quarter(quarter, { - width: "abbreviated", - context: "standalone" - }); - case "qqqqq": - return localize2.quarter(quarter, { - width: "narrow", - context: "standalone" - }); - case "qqqq": - default: - return localize2.quarter(quarter, { - width: "wide", - context: "standalone" - }); - } - }, - M: function(date, token, localize2) { - var month = date.getUTCMonth(); - switch (token) { - case "M": - case "MM": - return formatters$4.M(date, token); - case "Mo": - return localize2.ordinalNumber(month + 1, { - unit: "month" - }); - case "MMM": - return localize2.month(month, { - width: "abbreviated", - context: "formatting" - }); - case "MMMMM": - return localize2.month(month, { - width: "narrow", - context: "formatting" - }); - case "MMMM": - default: - return localize2.month(month, { - width: "wide", - context: "formatting" - }); - } - }, - L: function(date, token, localize2) { - var month = date.getUTCMonth(); - switch (token) { - case "L": - return String(month + 1); - case "LL": - return addLeadingZeros(month + 1, 2); - case "Lo": - return localize2.ordinalNumber(month + 1, { - unit: "month" - }); - case "LLL": - return localize2.month(month, { - width: "abbreviated", - context: "standalone" - }); - case "LLLLL": - return localize2.month(month, { - width: "narrow", - context: "standalone" - }); - case "LLLL": - default: - return localize2.month(month, { - width: "wide", - context: "standalone" - }); - } - }, - w: function(date, token, localize2, options) { - var week = getUTCWeek(date, options); - if (token === "wo") { - return localize2.ordinalNumber(week, { - unit: "week" - }); - } - return addLeadingZeros(week, token.length); - }, - I: function(date, token, localize2) { - var isoWeek = getUTCISOWeek(date); - if (token === "Io") { - return localize2.ordinalNumber(isoWeek, { - unit: "week" - }); - } - return addLeadingZeros(isoWeek, token.length); - }, - d: function(date, token, localize2) { - if (token === "do") { - return localize2.ordinalNumber(date.getUTCDate(), { - unit: "date" - }); - } - return formatters$4.d(date, token); - }, - D: function(date, token, localize2) { - var dayOfYear = getUTCDayOfYear(date); - if (token === "Do") { - return localize2.ordinalNumber(dayOfYear, { - unit: "dayOfYear" - }); - } - return addLeadingZeros(dayOfYear, token.length); - }, - E: function(date, token, localize2) { - var dayOfWeek = date.getUTCDay(); - switch (token) { - case "E": - case "EE": - case "EEE": - return localize2.day(dayOfWeek, { - width: "abbreviated", - context: "formatting" - }); - case "EEEEE": - return localize2.day(dayOfWeek, { - width: "narrow", - context: "formatting" - }); - case "EEEEEE": - return localize2.day(dayOfWeek, { - width: "short", - context: "formatting" - }); - case "EEEE": - default: - return localize2.day(dayOfWeek, { - width: "wide", - context: "formatting" - }); - } - }, - e: function(date, token, localize2, options) { - var dayOfWeek = date.getUTCDay(); - var localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7; - switch (token) { - case "e": - return String(localDayOfWeek); - case "ee": - return addLeadingZeros(localDayOfWeek, 2); - case "eo": - return localize2.ordinalNumber(localDayOfWeek, { - unit: "day" - }); - case "eee": - return localize2.day(dayOfWeek, { - width: "abbreviated", - context: "formatting" - }); - case "eeeee": - return localize2.day(dayOfWeek, { - width: "narrow", - context: "formatting" - }); - case "eeeeee": - return localize2.day(dayOfWeek, { - width: "short", - context: "formatting" - }); - case "eeee": - default: - return localize2.day(dayOfWeek, { - width: "wide", - context: "formatting" - }); - } - }, - c: function(date, token, localize2, options) { - var dayOfWeek = date.getUTCDay(); - var localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7; - switch (token) { - case "c": - return String(localDayOfWeek); - case "cc": - return addLeadingZeros(localDayOfWeek, token.length); - case "co": - return localize2.ordinalNumber(localDayOfWeek, { - unit: "day" - }); - case "ccc": - return localize2.day(dayOfWeek, { - width: "abbreviated", - context: "standalone" - }); - case "ccccc": - return localize2.day(dayOfWeek, { - width: "narrow", - context: "standalone" - }); - case "cccccc": - return localize2.day(dayOfWeek, { - width: "short", - context: "standalone" - }); - case "cccc": - default: - return localize2.day(dayOfWeek, { - width: "wide", - context: "standalone" - }); - } - }, - i: function(date, token, localize2) { - var dayOfWeek = date.getUTCDay(); - var isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek; - switch (token) { - case "i": - return String(isoDayOfWeek); - case "ii": - return addLeadingZeros(isoDayOfWeek, token.length); - case "io": - return localize2.ordinalNumber(isoDayOfWeek, { - unit: "day" - }); - case "iii": - return localize2.day(dayOfWeek, { - width: "abbreviated", - context: "formatting" - }); - case "iiiii": - return localize2.day(dayOfWeek, { - width: "narrow", - context: "formatting" - }); - case "iiiiii": - return localize2.day(dayOfWeek, { - width: "short", - context: "formatting" - }); - case "iiii": - default: - return localize2.day(dayOfWeek, { - width: "wide", - context: "formatting" - }); - } - }, - a: function(date, token, localize2) { - var hours = date.getUTCHours(); - var dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am"; - switch (token) { - case "a": - case "aa": - return localize2.dayPeriod(dayPeriodEnumValue, { - width: "abbreviated", - context: "formatting" - }); - case "aaa": - return localize2.dayPeriod(dayPeriodEnumValue, { - width: "abbreviated", - context: "formatting" - }).toLowerCase(); - case "aaaaa": - return localize2.dayPeriod(dayPeriodEnumValue, { - width: "narrow", - context: "formatting" - }); - case "aaaa": - default: - return localize2.dayPeriod(dayPeriodEnumValue, { - width: "wide", - context: "formatting" - }); - } - }, - b: function(date, token, localize2) { - var hours = date.getUTCHours(); - var dayPeriodEnumValue; - if (hours === 12) { - dayPeriodEnumValue = dayPeriodEnum.noon; - } else if (hours === 0) { - dayPeriodEnumValue = dayPeriodEnum.midnight; - } else { - dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am"; - } - switch (token) { - case "b": - case "bb": - return localize2.dayPeriod(dayPeriodEnumValue, { - width: "abbreviated", - context: "formatting" - }); - case "bbb": - return localize2.dayPeriod(dayPeriodEnumValue, { - width: "abbreviated", - context: "formatting" - }).toLowerCase(); - case "bbbbb": - return localize2.dayPeriod(dayPeriodEnumValue, { - width: "narrow", - context: "formatting" - }); - case "bbbb": - default: - return localize2.dayPeriod(dayPeriodEnumValue, { - width: "wide", - context: "formatting" - }); - } - }, - B: function(date, token, localize2) { - var hours = date.getUTCHours(); - var dayPeriodEnumValue; - if (hours >= 17) { - dayPeriodEnumValue = dayPeriodEnum.evening; - } else if (hours >= 12) { - dayPeriodEnumValue = dayPeriodEnum.afternoon; - } else if (hours >= 4) { - dayPeriodEnumValue = dayPeriodEnum.morning; - } else { - dayPeriodEnumValue = dayPeriodEnum.night; - } - switch (token) { - case "B": - case "BB": - case "BBB": - return localize2.dayPeriod(dayPeriodEnumValue, { - width: "abbreviated", - context: "formatting" - }); - case "BBBBB": - return localize2.dayPeriod(dayPeriodEnumValue, { - width: "narrow", - context: "formatting" - }); - case "BBBB": - default: - return localize2.dayPeriod(dayPeriodEnumValue, { - width: "wide", - context: "formatting" - }); - } - }, - h: function(date, token, localize2) { - if (token === "ho") { - var hours = date.getUTCHours() % 12; - if (hours === 0) - hours = 12; - return localize2.ordinalNumber(hours, { - unit: "hour" - }); - } - return formatters$4.h(date, token); - }, - H: function(date, token, localize2) { - if (token === "Ho") { - return localize2.ordinalNumber(date.getUTCHours(), { - unit: "hour" - }); - } - return formatters$4.H(date, token); - }, - K: function(date, token, localize2) { - var hours = date.getUTCHours() % 12; - if (token === "Ko") { - return localize2.ordinalNumber(hours, { - unit: "hour" - }); - } - return addLeadingZeros(hours, token.length); - }, - k: function(date, token, localize2) { - var hours = date.getUTCHours(); - if (hours === 0) - hours = 24; - if (token === "ko") { - return localize2.ordinalNumber(hours, { - unit: "hour" - }); - } - return addLeadingZeros(hours, token.length); - }, - m: function(date, token, localize2) { - if (token === "mo") { - return localize2.ordinalNumber(date.getUTCMinutes(), { - unit: "minute" - }); - } - return formatters$4.m(date, token); - }, - s: function(date, token, localize2) { - if (token === "so") { - return localize2.ordinalNumber(date.getUTCSeconds(), { - unit: "second" - }); - } - return formatters$4.s(date, token); - }, - S: function(date, token) { - return formatters$4.S(date, token); - }, - X: function(date, token, _localize, options) { - var originalDate = options._originalDate || date; - var timezoneOffset = originalDate.getTimezoneOffset(); - if (timezoneOffset === 0) { - return "Z"; - } - switch (token) { - case "X": - return formatTimezoneWithOptionalMinutes(timezoneOffset); - case "XXXX": - case "XX": - return formatTimezone(timezoneOffset); - case "XXXXX": - case "XXX": - default: - return formatTimezone(timezoneOffset, ":"); - } - }, - x: function(date, token, _localize, options) { - var originalDate = options._originalDate || date; - var timezoneOffset = originalDate.getTimezoneOffset(); - switch (token) { - case "x": - return formatTimezoneWithOptionalMinutes(timezoneOffset); - case "xxxx": - case "xx": - return formatTimezone(timezoneOffset); - case "xxxxx": - case "xxx": - default: - return formatTimezone(timezoneOffset, ":"); - } - }, - O: function(date, token, _localize, options) { - var originalDate = options._originalDate || date; - var timezoneOffset = originalDate.getTimezoneOffset(); - switch (token) { - case "O": - case "OO": - case "OOO": - return "GMT" + formatTimezoneShort(timezoneOffset, ":"); - case "OOOO": - default: - return "GMT" + formatTimezone(timezoneOffset, ":"); - } - }, - z: function(date, token, _localize, options) { - var originalDate = options._originalDate || date; - var timezoneOffset = originalDate.getTimezoneOffset(); - switch (token) { - case "z": - case "zz": - case "zzz": - return "GMT" + formatTimezoneShort(timezoneOffset, ":"); - case "zzzz": - default: - return "GMT" + formatTimezone(timezoneOffset, ":"); + const regexMatchRe = new RegExp(regexMatch, "g"); + const matchLength = (fileContents.match(regexMatchRe) || []).length; + const re2 = new RegExp(ProcessEntriesBelow.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"), "g"); + const processEntriesHeader = (fileContents.match(re2) || []).length; + fileContents = null; + if (processEntriesHeader) { + return matchLength; + } + return 0; +} +async function getMemosFromDailyNote(dailyNote, allMemos, commentMemos) { + var _a, _b, _c, _d, _e, _f, _g, _h; + if (!dailyNote) { + return []; + } + const { vault } = appStore.getState().dailyNotesState.app; + const Memos2 = await getRemainingMemos(dailyNote); + let underComments; + if (Memos2 === 0) + return; + if (CommentOnMemos && CommentsInOriginalNotes && getAPI_1().version.compare(">=", "0.5.9") === true) { + const dataviewAPI = getAPI_1(); + if (dataviewAPI !== void 0 && ProcessEntriesBelow !== "") { + try { + underComments = (_b = (_a = dataviewAPI.page(dailyNote.path)) == null ? void 0 : _a.file.lists.values) == null ? void 0 : _b.filter((item) => item.header.subpath === (ProcessEntriesBelow == null ? void 0 : ProcessEntriesBelow.replace(/#{1,} /g, "").trim()) && item.children.length > 0); + } catch (e) { + console.error(e); + } + } else { + try { + underComments = (_d = (_c = dataviewAPI.page(dailyNote.path)) == null ? void 0 : _c.file.lists.values) == null ? void 0 : _d.filter((item) => item.children.length > 0); + } catch (e) { + console.error(e); + } } - }, - t: function(date, token, _localize, options) { - var originalDate = options._originalDate || date; - var timestamp = Math.floor(originalDate.getTime() / 1e3); - return addLeadingZeros(timestamp, token.length); - }, - T: function(date, token, _localize, options) { - var originalDate = options._originalDate || date; - var timestamp = originalDate.getTime(); - return addLeadingZeros(timestamp, token.length); } -}; -function formatTimezoneShort(offset2, dirtyDelimiter) { - var sign = offset2 > 0 ? "-" : "+"; - var absOffset = Math.abs(offset2); - var hours = Math.floor(absOffset / 60); - var minutes = absOffset % 60; - if (minutes === 0) { - return sign + String(hours); - } - var delimiter = dirtyDelimiter || ""; - return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2); -} -function formatTimezoneWithOptionalMinutes(offset2, dirtyDelimiter) { - if (offset2 % 60 === 0) { - var sign = offset2 > 0 ? "-" : "+"; - return sign + addLeadingZeros(Math.abs(offset2) / 60, 2); - } - return formatTimezone(offset2, dirtyDelimiter); -} -function formatTimezone(offset2, dirtyDelimiter) { - var delimiter = dirtyDelimiter || ""; - var sign = offset2 > 0 ? "-" : "+"; - var absOffset = Math.abs(offset2); - var hours = addLeadingZeros(Math.floor(absOffset / 60), 2); - var minutes = addLeadingZeros(absOffset % 60, 2); - return sign + hours + delimiter + minutes; -} -var formatters$2 = formatters$1; -function dateLongFormatter(pattern, formatLong2) { - switch (pattern) { - case "P": - return formatLong2.date({ - width: "short" - }); - case "PP": - return formatLong2.date({ - width: "medium" - }); - case "PPP": - return formatLong2.date({ - width: "long" - }); - case "PPPP": - default: - return formatLong2.date({ - width: "full" - }); + let fileContents = await vault.read(dailyNote); + let fileLines = getAllLinesFromFile$7(fileContents); + const startDate = getDateFromFile_1(dailyNote, "day"); + const endDate = getDateFromFile_1(dailyNote, "day"); + let processHeaderFound = false; + let memoType; + for (let i = 0; i < fileLines.length; i++) { + const line = fileLines[i]; + if (line.length === 0) + continue; + if (processHeaderFound == false && lineContainsParseBelowToken(line)) { + processHeaderFound = true; + } + if (processHeaderFound == true && !lineContainsParseBelowToken(line) && /^#{1,} /g.test(line)) { + processHeaderFound = false; + } + if (lineContainsTime(line) && processHeaderFound) { + const hourText = extractHourFromBulletLine(line); + const minText = extractMinFromBulletLine(line); + startDate.hours(parseInt(hourText)); + startDate.minutes(parseInt(minText)); + endDate.hours(parseInt(hourText)); + if (parseInt(hourText) > 22) { + endDate.minutes(parseInt(minText)); + } else { + endDate.minutes(parseInt(minText)); + } + if (/^\s*[-*]\s(\[(.{1})\])\s/g.test(line)) { + const memoTaskType = extractMemoTaskTypeFromLine(line); + memoType = getTaskType(memoTaskType); + } else { + memoType = "JOURNAL"; + } + const rawText = extractTextFromTodoLine(line); + let originId = ""; + if (rawText !== "") { + let hasId = Math.random().toString(36).slice(-6); + originId = hasId; + let linkId = ""; + if (CommentOnMemos && /comment:(.*)#\^\S{6}]]/g.test(rawText)) { + linkId = extractCommentFromLine(rawText); + } + if (/\^\S{6}$/g.test(rawText)) { + hasId = rawText.slice(-6); + originId = hasId; + } + allMemos.push({ + id: startDate.format("YYYYMMDDHHmmSS") + i, + content: rawText, + user_id: 1, + createdAt: startDate.format("YYYY/MM/DD HH:mm:SS"), + updatedAt: endDate.format("YYYY/MM/DD HH:mm:SS"), + memoType, + hasId, + linkId, + path: dailyNote.path + }); + } + if (/comment:(.*)#\^\S{6}]]/g.test(rawText) && CommentOnMemos && CommentsInOriginalNotes !== true) { + const commentId = extractCommentFromLine(rawText); + const hasId = ""; + commentMemos.push({ + id: startDate.format("YYYYMMDDHHmmSS") + i, + content: rawText, + user_id: 1, + createdAt: startDate.format("YYYY/MM/DD HH:mm:SS"), + updatedAt: endDate.format("YYYY/MM/DD HH:mm:SS"), + memoType, + hasId, + linkId: commentId + }); + continue; + } + if (rawText !== "" && !rawText.contains(" comment") && underComments !== null && underComments !== void 0 && underComments.length > 0) { + const originalText = (_e = line.replace(/^[-*]\s(\[(.{1})\]\s?)?/, "")) == null ? void 0 : _e.trim(); + const commentsInMemos = underComments.filter((item) => item.text === originalText || item.line === i || item.blockId === originId); + if (commentsInMemos.length === 0) + continue; + if (((_g = (_f = commentsInMemos[0].children) == null ? void 0 : _f.values) == null ? void 0 : _g.length) > 0) { + for (let j = 0; j < commentsInMemos[0].children.values.length; j++) { + const hasId = ""; + let commentTime; + if (/^\d{12}/.test(commentsInMemos[0].children.values[j].text)) { + commentTime = (_h = commentsInMemos[0].children.values[j].text) == null ? void 0 : _h.match(/^\d{14}/)[0]; + } else { + commentTime = startDate.format("YYYYMMDDHHmmSS"); + } + commentMemos.push({ + id: commentTime + commentsInMemos[0].children.values[j].line, + content: commentsInMemos[0].children.values[j].text, + user_id: 1, + createdAt: require$$0.moment(commentTime, "YYYYMMDDHHmmSS").format("YYYY/MM/DD HH:mm:SS"), + updatedAt: require$$0.moment(commentTime, "YYYYMMDDHHmmSS").format("YYYY/MM/DD HH:mm:SS"), + memoType: commentsInMemos[0].children.values[j].task ? getTaskType(commentsInMemos[0].children.values[j].status) : "JOURNAL", + hasId, + linkId: originId, + path: commentsInMemos[0].children.values[j].path + }); + } + } + } + } } + fileLines = null; + fileContents = null; } -function timeLongFormatter(pattern, formatLong2) { - switch (pattern) { - case "p": - return formatLong2.time({ - width: "short" - }); - case "pp": - return formatLong2.time({ - width: "medium" - }); - case "ppp": - return formatLong2.time({ - width: "long" - }); - case "pppp": - default: - return formatLong2.time({ - width: "full" +async function getMemosFromNote(allMemos, commentMemos) { + var _a, _b; + const notes = getAPI_1().pages(FetchMemosMark); + const dailyNotesPath = getDailyNotePath(); + let files = notes == null ? void 0 : notes.values; + if (files.length === 0) + return; + files = files.filter((item) => item.file.name !== QueryFileName && item.file.name !== DeleteFileName && item["excalidraw-plugin"] === void 0 && item["kanban-plugin"] === void 0 && item.file.folder !== dailyNotesPath); + for (let i = 0; i < files.length; i++) { + const createDate = files[i]["creation-date"]; + const list = (_a = files[i].file.lists) == null ? void 0 : _a.filter((item) => item.parent === void 0); + if (list.length === 0) + continue; + for (let j = 0; j < list.length; j++) { + const content = list[j].text; + const header = list[j].header.subpath; + const path = list[j].path; + const line = list[j].line; + let memoType = "JOURNAL"; + let hasId; + let realCreateDate = require$$0.moment(createDate, "YYYY-MM-DD HH:mm"); + if (/\^\S{6}$/g.test(content)) { + hasId = content.slice(-6); + } else { + hasId = Math.random().toString(36).slice(-6); + } + if (list[j].task === true) { + memoType = getTaskType(list[j].status); + } + if (header !== void 0) { + if (require$$0.moment(header).isValid()) { + realCreateDate = require$$0.moment(header); + } + } + if (/^\d{2}:\d{2}/g.test(content)) { + const time = content.match(/^\d{2}:\d{2}/)[0]; + const timeArr = time.split(":"); + const hour = parseInt(timeArr[0], 10); + const minute = parseInt(timeArr[1], 10); + realCreateDate = require$$0.moment(createDate, "YYYYMMDDHHmmSS").hours(hour).minutes(minute); + } + allMemos.push({ + id: realCreateDate.format("YYYYMMDDHHmmSS") + line, + content, + user_id: 1, + createdAt: realCreateDate.format("YYYY/MM/DD HH:mm:SS"), + updatedAt: realCreateDate.format("YYYY/MM/DD HH:mm:SS"), + memoType, + hasId, + linkId: "", + path }); + if (((_b = list[j].children) == null ? void 0 : _b.values.length) > 0) { + for (let k = 0; k < list[j].children.values.length; k++) { + const childContent = list[j].children.values[k].text; + const childLine = list[j].children.values[k].line; + let childMemoType = "JOURNAL"; + let childRealCreateDate = realCreateDate; + let commentTime; + if (list[j].children.values[k].task === true) { + childMemoType = getTaskType(list[j].children.values[k].status); + } + if (/^\d{12}/.test(childContent)) { + commentTime = childContent == null ? void 0 : childContent.match(/^\d{14}/)[0]; + childRealCreateDate = require$$0.moment(commentTime, "YYYYMMDDHHmmSS"); + } + if (/^\d{2}:\d{2}/g.test(childContent)) { + const time = childContent.match(/^\d{2}:\d{2}/)[0]; + const timeArr = time.split(":"); + const hour = parseInt(timeArr[0], 10); + const minute = parseInt(timeArr[1], 10); + childRealCreateDate = childRealCreateDate.hours(hour).minutes(minute); + } + commentMemos.push({ + id: childRealCreateDate.format("YYYYMMDDHHmmSS") + childLine, + content: childContent, + user_id: 1, + createdAt: childRealCreateDate.format("YYYY/MM/DD HH:mm:SS"), + updatedAt: childRealCreateDate.format("YYYY/MM/DD HH:mm:SS"), + memoType: childMemoType, + hasId: "", + linkId: hasId, + path + }); + } + } + } } + return; } -function dateTimeLongFormatter(pattern, formatLong2) { - var matchResult = pattern.match(/(P+)(p+)?/) || []; - var datePattern = matchResult[1]; - var timePattern = matchResult[2]; - if (!timePattern) { - return dateLongFormatter(pattern, formatLong2); +async function getMemos() { + const memos = []; + const commentMemos = []; + const { vault } = appStore.getState().dailyNotesState.app; + const folder = getDailyNotePath(); + if (folder === "" || folder === void 0) { + new require$$0.Notice(t$1("Please check your daily note plugin OR periodic notes plugin settings")); + return; } - var dateTimeFormat; - switch (datePattern) { - case "P": - dateTimeFormat = formatLong2.dateTime({ - width: "short" - }); - break; - case "PP": - dateTimeFormat = formatLong2.dateTime({ - width: "medium" - }); - break; - case "PPP": - dateTimeFormat = formatLong2.dateTime({ - width: "long" - }); - break; - case "PPPP": - default: - dateTimeFormat = formatLong2.dateTime({ - width: "full" - }); - break; + const dailyNotesFolder = vault.getAbstractFileByPath(require$$0.normalizePath(folder)); + if (!dailyNotesFolder) { + throw new DailyNotesFolderMissingError("Failed to find daily notes folder"); + } + const dailyNotes = getAllDailyNotes_1(); + for (const string in dailyNotes) { + if (dailyNotes[string] instanceof require$$0.TFile && dailyNotes[string].extension === "md") { + await getMemosFromDailyNote(dailyNotes[string], memos, commentMemos); + } + } + if (FetchMemosFromNote) { + await getMemosFromNote(memos, commentMemos); } - return dateTimeFormat.replace("{{date}}", dateLongFormatter(datePattern, formatLong2)).replace("{{time}}", timeLongFormatter(timePattern, formatLong2)); + return { memos, commentMemos }; } -var longFormatters = { - p: timeLongFormatter, - P: dateTimeLongFormatter +const getAllLinesFromFile$7 = (cache) => cache.split(/\r?\n/); +const lineContainsTime = (line) => { + let regexMatch; + let indent = "\\s*"; + if (CommentsInOriginalNotes) { + indent = ""; + } + if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) { + regexMatch = "^" + indent + "(-|\\*)\\s(\\[(.{1})\\]\\s)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\)?\\d{1,2}:\\d{2}(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$"); + } else { + regexMatch = "^" + indent + "(-|\\*)\\s(\\[(.{1})\\]\\s)?(\\)?\\d{1,2}\\:\\d{2}(.*)$"; + } + const regexMatchRe = new RegExp(regexMatch, ""); + return regexMatchRe.test(line); }; -var longFormatters$1 = longFormatters; -var protectedDayOfYearTokens = ["D", "DD"]; -var protectedWeekYearTokens = ["YY", "YYYY"]; -function isProtectedDayOfYearToken(token) { - return protectedDayOfYearTokens.indexOf(token) !== -1; -} -function isProtectedWeekYearToken(token) { - return protectedWeekYearTokens.indexOf(token) !== -1; -} -function throwProtectedError(token, format2, input) { - if (token === "YYYY") { - throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(format2, "`) for formatting years to the input `").concat(input, "`; see: https://git.io/fxCyr")); - } else if (token === "YY") { - throw new RangeError("Use `yy` instead of `YY` (in `".concat(format2, "`) for formatting years to the input `").concat(input, "`; see: https://git.io/fxCyr")); - } else if (token === "D") { - throw new RangeError("Use `d` instead of `D` (in `".concat(format2, "`) for formatting days of the month to the input `").concat(input, "`; see: https://git.io/fxCyr")); - } else if (token === "DD") { - throw new RangeError("Use `dd` instead of `DD` (in `".concat(format2, "`) for formatting days of the month to the input `").concat(input, "`; see: https://git.io/fxCyr")); - } -} -var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g; -var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g; -var escapedStringRegExp = /^'([^]*?)'?$/; -var doubleQuoteRegExp = /''/g; -var unescapedLatinCharacterRegExp = /[a-zA-Z]/; -function format(dirtyDate, dirtyFormatStr, dirtyOptions) { - requiredArgs(2, arguments); - var formatStr = String(dirtyFormatStr); - var options = dirtyOptions || {}; - var locale2 = options.locale || enUS; - var localeFirstWeekContainsDate = locale2.options && locale2.options.firstWeekContainsDate; - var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate); - var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate); - if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) { - throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively"); - } - var localeWeekStartsOn = locale2.options && locale2.options.weekStartsOn; - var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn); - var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); - if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) { - throw new RangeError("weekStartsOn must be between 0 and 6 inclusively"); - } - if (!locale2.localize) { - throw new RangeError("locale must contain localize property"); - } - if (!locale2.formatLong) { - throw new RangeError("locale must contain formatLong property"); - } - var originalDate = toDate(dirtyDate); - if (!isValid(originalDate)) { - throw new RangeError("Invalid time value"); - } - var timezoneOffset = getTimezoneOffsetInMilliseconds(originalDate); - var utcDate = subMilliseconds(originalDate, timezoneOffset); - var formatterOptions = { - firstWeekContainsDate, - weekStartsOn, - locale: locale2, - _originalDate: originalDate - }; - var result = formatStr.match(longFormattingTokensRegExp).map(function(substring) { - var firstCharacter = substring[0]; - if (firstCharacter === "p" || firstCharacter === "P") { - var longFormatter = longFormatters$1[firstCharacter]; - return longFormatter(substring, locale2.formatLong, formatterOptions); - } - return substring; - }).join("").match(formattingTokensRegExp).map(function(substring) { - if (substring === "''") { - return "'"; - } - var firstCharacter = substring[0]; - if (firstCharacter === "'") { - return cleanEscapedString(substring); +const lineContainsParseBelowToken = (line) => { + if (ProcessEntriesBelow === "") { + return true; + } + const re2 = new RegExp(ProcessEntriesBelow.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"), ""); + return re2.test(line); +}; +const extractTextFromTodoLine = (line) => { + var _a; + let regexMatch; + if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) { + regexMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\)?((\\d{1,2})\\:(\\d{2}))?(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$"); + } else { + regexMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?(\\)?((\\d{1,2})\\:(\\d{2}))?(\\<\\/time\\>)?\\s?(.*)$"; + } + const regexMatchRe = new RegExp(regexMatch, ""); + return (_a = regexMatchRe.exec(line)) == null ? void 0 : _a[8]; +}; +const extractHourFromBulletLine = (line) => { + var _a; + let regexHourMatch; + if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) { + regexHourMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\)?(\\d{1,2})\\:(\\d{2})(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$"); + } else { + regexHourMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?(\\)?(\\d{1,2})\\:(\\d{2})(.*)$"; + } + const regexMatchRe = new RegExp(regexHourMatch, ""); + return (_a = regexMatchRe.exec(line)) == null ? void 0 : _a[4]; +}; +const extractMinFromBulletLine = (line) => { + var _a; + let regexHourMatch; + if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) { + regexHourMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\)?(\\d{1,2})\\:(\\d{2})(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$"); + } else { + regexHourMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?(\\)?(\\d{1,2})\\:(\\d{2})(.*)$"; + } + const regexMatchRe = new RegExp(regexHourMatch, ""); + return (_a = regexMatchRe.exec(line)) == null ? void 0 : _a[5]; +}; +const extractMemoTaskTypeFromLine = (line) => { + var _a; + return (_a = /^\s*[\-\*]\s(\[(.{1})\])\s(.*)$/.exec(line)) == null ? void 0 : _a[2]; +}; +const extractCommentFromLine = (line) => { + const regex = "#\\^(\\S{6})"; + const regexMatchRe = new RegExp(regex, ""); + return regexMatchRe.exec(line)[1]; +}; +const updateObsidianQuery = async (queryId, title, queryString) => { + const { metadataCache, vault } = appStore.getState().dailyNotesState.app; + const filePath = getDailyNotePath(); + const absolutePath = filePath + "/" + QueryFileName + ".md"; + const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath); + if (queryFile instanceof require$$0.TFile) { + const fileContents = await vault.read(queryFile); + const fileLines = getAllLinesFromFile$6(fileContents); + let lineID; + if (/^\d{1,3}$/.test(queryId)) { + lineID = queryId; + } else { + lineID = getIDFromLine(queryId); } - var formatter = formatters$2[firstCharacter]; - if (formatter) { - if (!options.useAdditionalWeekYearTokens && isProtectedWeekYearToken(substring)) { - throwProtectedError(substring, dirtyFormatStr, dirtyDate); - } - if (!options.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(substring)) { - throwProtectedError(substring, dirtyFormatStr, dirtyDate); + const lineNum = parseInt(lineID) - 1; + if (fileLines && fileLines.length != 0) { + const oldContent = fileLines[lineNum]; + const date = require$$0.moment(); + const updatedDateString = date.format("YYYYMMDDHHmmss"); + const updatedDate = date.format("YYYY/MM/DD HH:mm:ss"); + const newLineNum = lineNum + 1; + const id2 = updatedDateString + newLineNum; + if (/^(.+)pinnedAt(.+)$/.test(oldContent)) { + const pinnedString = getPinnedStringFromLine(oldContent); + const pinnedDateString = getPinnedDateFromLine(oldContent); + const newContent = id2 + " " + title + " " + queryString + " " + pinnedString; + const pinnedAtDate = require$$0.moment(pinnedDateString, "YYYYMMDDHHmmss").format("YYYY/MM/DD HH:mm:ss"); + const newFileContents = fileContents.replace(oldContent, newContent); + await vault.modify(queryFile, newFileContents); + return [ + { + createdAt: updatedDate, + id: id2, + pinnedAt: pinnedAtDate, + querystring: queryString, + title, + updatedAt: updatedDate, + userId: "" + } + ]; + } else { + const newContent = id2 + " " + title + " " + queryString; + const newFileContents = fileContents.replace(oldContent, newContent); + await vault.modify(queryFile, newFileContents); + return [ + { + createdAt: updatedDate, + id: id2, + pinnedAt: "", + querystring: queryString, + title, + updatedAt: updatedDate, + userId: "" + } + ]; } - return formatter(utcDate, substring, locale2.localize, formatterOptions); } - if (firstCharacter.match(unescapedLatinCharacterRegExp)) { - throw new RangeError("Format string contains an unescaped latin alphabet character `" + firstCharacter + "`"); + } +}; +const getAllLinesFromFile$6 = (cache) => cache.split(/\r?\n/); +const getIDFromLine = (line) => { + var _a; + return (_a = /^(\d{14})(\d{1,})/.exec(line)) == null ? void 0 : _a[2]; +}; +const getPinnedStringFromLine = (line) => { + var _a; + return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])\s(pinnedAt: (\d{14})\d+)/.exec(line)) == null ? void 0 : _a[6]; +}; +const getPinnedDateFromLine = (line) => { + var _a; + return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])\s(pinnedAt: (\d{14})\d+)/.exec(line)) == null ? void 0 : _a[7]; +}; +async function escapeRegExp(text) { + return await text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); +} +function getLinesInString(input) { + const lines = []; + let tempString = input; + while (tempString.contains("\n")) { + const lineEndIndex = tempString.indexOf("\n"); + lines.push(tempString.slice(0, lineEndIndex)); + tempString = tempString.slice(lineEndIndex + 1); + } + lines.push(tempString); + return lines; +} +async function waitForInsert(MemoContent, isTASK, insertDate) { + const { vault } = appStore.getState().dailyNotesState.app === void 0 ? app : appStore.getState().dailyNotesState.app; + const removeEnter = MemoContent.replace(/\n/g, "
"); + let date; + if (insertDate !== void 0) { + date = insertDate; + } else { + date = require$$0.moment(); + } + const timeHour = date.format("HH"); + const timeMinute = date.format("mm"); + let newEvent; + let lineNum; + const timeText = String(timeHour) + `:` + String(timeMinute); + if (isTASK && DefaultMemoComposition === "") { + newEvent = `- [ ] ` + String(timeHour) + `:` + String(timeMinute) + ` ` + removeEnter; + } else if (!isTASK && DefaultMemoComposition === "") { + newEvent = `- ` + String(timeHour) + `:` + String(timeMinute) + ` ` + removeEnter; + } + if (isTASK && DefaultMemoComposition != "") { + newEvent = `- [ ] ` + DefaultMemoComposition.replace(/{TIME}/g, timeText).replace(/{CONTENT}/g, removeEnter); + } else if (!isTASK && DefaultMemoComposition != "") { + newEvent = `- ` + DefaultMemoComposition.replace(/{TIME}/g, timeText).replace(/{CONTENT}/g, removeEnter); + } + const dailyNotes = await getAllDailyNotes_1(); + const existingFile = getDailyNote_1(date, dailyNotes); + if (!existingFile) { + const file = await utils$1.createDailyNoteCheck(date); + await dailyNotesService.getMyAllDailyNotes(); + const fileContents = await vault.read(file); + const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents); + await vault.modify(file, newFileContent.content); + if (newFileContent.posNum === -1) { + const allLines = getAllLinesFromFile$5(newFileContent.content); + lineNum = allLines.length + 1; + } else { + lineNum = newFileContent.posNum + 1; + } + if (isTASK) { + return { + id: date.format("YYYYMMDDHHmm") + "00" + lineNum, + content: MemoContent, + deletedAt: "", + createdAt: date.format("YYYY/MM/DD HH:mm:ss"), + updatedAt: date.format("YYYY/MM/DD HH:mm:ss"), + memoType: "TASK-TODO", + path: file.path, + hasId: "", + linkId: "" + }; + } else { + return { + id: date.format("YYYYMMDDHHmm") + "00" + lineNum, + content: MemoContent, + deletedAt: "", + createdAt: date.format("YYYY/MM/DD HH:mm:ss"), + updatedAt: date.format("YYYY/MM/DD HH:mm:ss"), + memoType: "JOURNAL", + path: file.path, + hasId: "", + linkId: "" + }; } - return substring; - }).join(""); - return result; -} -function cleanEscapedString(input) { - return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, "'"); -} -function getDaysInMonth(dirtyDate) { - requiredArgs(1, arguments); - var date = toDate(dirtyDate); - var year = date.getFullYear(); - var monthIndex = date.getMonth(); - var lastDayOfMonth2 = new Date(0); - lastDayOfMonth2.setFullYear(year, monthIndex + 1, 0); - lastDayOfMonth2.setHours(0, 0, 0, 0); - return lastDayOfMonth2.getDate(); -} -function getTime(dirtyDate) { - requiredArgs(1, arguments); - var date = toDate(dirtyDate); - var timestamp = date.getTime(); - return timestamp; -} -function getUnixTime(dirtyDate) { - requiredArgs(1, arguments); - return Math.floor(getTime(dirtyDate) / 1e3); -} -function getWeekYear(dirtyDate, options) { - var _options$locale, _options$locale$optio; - requiredArgs(1, arguments); - var date = toDate(dirtyDate); - var year = date.getFullYear(); - var localeFirstWeekContainsDate = options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.firstWeekContainsDate; - var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate); - var firstWeekContainsDate = (options === null || options === void 0 ? void 0 : options.firstWeekContainsDate) == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate); - if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) { - throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively"); - } - var firstWeekOfNextYear = new Date(0); - firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate); - firstWeekOfNextYear.setHours(0, 0, 0, 0); - var startOfNextYear = startOfWeek(firstWeekOfNextYear, options); - var firstWeekOfThisYear = new Date(0); - firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate); - firstWeekOfThisYear.setHours(0, 0, 0, 0); - var startOfThisYear = startOfWeek(firstWeekOfThisYear, options); - if (date.getTime() >= startOfNextYear.getTime()) { - return year + 1; - } else if (date.getTime() >= startOfThisYear.getTime()) { - return year; } else { - return year - 1; - } -} -function startOfWeekYear(dirtyDate, dirtyOptions) { - requiredArgs(1, arguments); - var options = dirtyOptions || {}; - var locale2 = options.locale; - var localeFirstWeekContainsDate = locale2 && locale2.options && locale2.options.firstWeekContainsDate; - var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate); - var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate); - var year = getWeekYear(dirtyDate, dirtyOptions); - var firstWeek = new Date(0); - firstWeek.setFullYear(year, 0, firstWeekContainsDate); - firstWeek.setHours(0, 0, 0, 0); - var date = startOfWeek(firstWeek, dirtyOptions); - return date; -} -var MILLISECONDS_IN_WEEK = 6048e5; -function getWeek(dirtyDate, options) { - requiredArgs(1, arguments); - var date = toDate(dirtyDate); - var diff = startOfWeek(date, options).getTime() - startOfWeekYear(date, options).getTime(); - return Math.round(diff / MILLISECONDS_IN_WEEK) + 1; -} -function lastDayOfMonth(dirtyDate) { - requiredArgs(1, arguments); - var date = toDate(dirtyDate); - var month = date.getMonth(); - date.setFullYear(date.getFullYear(), month + 1, 0); - date.setHours(0, 0, 0, 0); - return date; -} -function getWeeksInMonth(date, options) { - requiredArgs(1, arguments); - return differenceInCalendarWeeks(lastDayOfMonth(date), startOfMonth(date), options) + 1; -} -function isAfter(dirtyDate, dirtyDateToCompare) { - requiredArgs(2, arguments); - var date = toDate(dirtyDate); - var dateToCompare = toDate(dirtyDateToCompare); - return date.getTime() > dateToCompare.getTime(); -} -function isBefore(dirtyDate, dirtyDateToCompare) { - requiredArgs(2, arguments); - var date = toDate(dirtyDate); - var dateToCompare = toDate(dirtyDateToCompare); - return date.getTime() < dateToCompare.getTime(); -} -function isSameMonth(dirtyDateLeft, dirtyDateRight) { - requiredArgs(2, arguments); - var dateLeft = toDate(dirtyDateLeft); - var dateRight = toDate(dirtyDateRight); - return dateLeft.getFullYear() === dateRight.getFullYear() && dateLeft.getMonth() === dateRight.getMonth(); -} -function isSameYear(dirtyDateLeft, dirtyDateRight) { - requiredArgs(2, arguments); - var dateLeft = toDate(dirtyDateLeft); - var dateRight = toDate(dirtyDateRight); - return dateLeft.getFullYear() === dateRight.getFullYear(); -} -function setMonth(dirtyDate, dirtyMonth) { - requiredArgs(2, arguments); - var date = toDate(dirtyDate); - var month = toInteger(dirtyMonth); - var year = date.getFullYear(); - var day = date.getDate(); - var dateWithDesiredMonth = new Date(0); - dateWithDesiredMonth.setFullYear(year, month, 15); - dateWithDesiredMonth.setHours(0, 0, 0, 0); - var daysInMonth = getDaysInMonth(dateWithDesiredMonth); - date.setMonth(month, Math.min(day, daysInMonth)); - return date; -} -function setYear(dirtyDate, dirtyYear) { - requiredArgs(2, arguments); - var date = toDate(dirtyDate); - var year = toInteger(dirtyYear); - if (isNaN(date.getTime())) { - return new Date(NaN); - } - date.setFullYear(year); - return date; -} -function MonthsDropdown(props) { - var displayMonth = props.displayMonth; - var _a = useDayPicker(), fromDate = _a.fromDate, toDate2 = _a.toDate, styles = _a.styles, locale2 = _a.locale, formatMonthCaption2 = _a.formatters.formatMonthCaption, classNames = _a.classNames, Dropdown2 = _a.components.Dropdown, labelMonthDropdown2 = _a.labels.labelMonthDropdown; - if (!fromDate && !toDate2) { - return React$1.createElement(React$1.Fragment, null); - } - var dropdownMonths = []; - if (fromDate && toDate2) { - if (isSameYear(fromDate, toDate2)) { - for (var month = fromDate.getMonth(); month <= toDate2.getMonth(); month++) { - dropdownMonths.push(setMonth(startOfMonth(fromDate), month)); - } + const fileContents = await vault.read(existingFile); + const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents); + await vault.modify(existingFile, newFileContent.content); + if (newFileContent.posNum === -1) { + const allLines = getAllLinesFromFile$5(newFileContent.content); + lineNum = allLines.length + 1; } else { - for (var month = 0; month <= 11; month++) { - var anyDate = new Date(); - dropdownMonths.push(setMonth(startOfMonth(anyDate), month)); - } + lineNum = newFileContent.posNum + 1; + } + if (isTASK) { + return { + id: date.format("YYYYMMDDHHmm") + "00" + lineNum, + content: MemoContent, + deletedAt: "", + createdAt: date.format("YYYY/MM/DD HH:mm:ss"), + updatedAt: date.format("YYYY/MM/DD HH:mm:ss"), + memoType: "TASK-TODO", + path: existingFile.path, + hasId: "", + linkId: "" + }; + } else { + return { + id: date.format("YYYYMMDDHHmm") + "00" + lineNum, + content: MemoContent, + deletedAt: "", + createdAt: date.format("YYYY/MM/DD HH:mm:ss"), + updatedAt: date.format("YYYY/MM/DD HH:mm:ss"), + memoType: "JOURNAL", + path: existingFile.path, + hasId: "", + linkId: "" + }; } } - var handleChange = function(e) { - var newMonth = setMonth(new Date(displayMonth), Number(e.target.value)); - props.onChange(newMonth); - }; - return React$1.createElement(Dropdown2, { "aria-label": labelMonthDropdown2(), className: classNames.dropdown_month, style: styles.dropdown_month, onChange: handleChange, value: displayMonth.getMonth(), caption: formatMonthCaption2(displayMonth, { locale: locale2 }) }, dropdownMonths.map(function(m2) { - return React$1.createElement("option", { key: m2.getMonth(), value: m2.getMonth() }, formatMonthCaption2(m2, { locale: locale2 })); - })); -} -var Button = React$1.forwardRef(function(props, ref) { - var _a = useDayPicker(), classNames = _a.classNames, styles = _a.styles; - var classNamesArr = [classNames.button_reset, classNames.button]; - if (props.className) { - classNamesArr.push(props.className); - } - var className = classNamesArr.join(" "); - var style = __assign(__assign({}, styles.button_reset), styles.button); - if (props.style) { - Object.assign(style, props.style); - } - return React$1.createElement("button", __assign({}, props, { ref, type: "button", className, style })); -}); -function Navigation(props) { - var _a; - var _b = useDayPicker(), dir = _b.dir, locale2 = _b.locale, classNames = _b.classNames, styles = _b.styles, _c = _b.labels, labelPrevious2 = _c.labelPrevious, labelNext2 = _c.labelNext, _d = _b.components, IconRight2 = _d.IconRight, IconLeft2 = _d.IconLeft; - var onPreviousClick = props.onPreviousClick, onNextClick = props.onNextClick; - if (dir === "rtl") { - _a = [onPreviousClick, onNextClick], onNextClick = _a[0], onPreviousClick = _a[1]; - } - var previousMonth = props.previousMonth, nextMonth = props.nextMonth; - var previousLabel = labelPrevious2(previousMonth, { locale: locale2 }); - var previousClassName = [ - classNames.nav_button, - classNames.nav_button_previous - ].join(" "); - var nextLabel = labelNext2(nextMonth, { locale: locale2 }); - var nextClassName = [ - classNames.nav_button, - classNames.nav_button_next - ].join(" "); - if (!nextMonth && !previousMonth) { - return React$1.createElement(React$1.Fragment, null); - } - return React$1.createElement("div", { className: classNames.nav, style: styles.nav }, !props.hidePrevious && React$1.createElement(Button, { "aria-label": previousLabel, className: previousClassName, style: styles.nav_button_next, disabled: !previousMonth, onClick: dir === "rtl" ? onNextClick : onPreviousClick }, dir === "rtl" ? React$1.createElement(IconRight2, { className: classNames.nav_icon, style: styles.nav_icon }) : React$1.createElement(IconLeft2, { className: classNames.nav_icon, style: styles.nav_icon })), !props.hideNext && React$1.createElement(Button, { "aria-label": nextLabel, className: nextClassName, style: styles.nav_button_next, disabled: !nextMonth, onClick: dir === "rtl" ? onPreviousClick : onNextClick }, dir === "rtl" ? React$1.createElement(IconLeft2, { className: classNames.nav_icon, style: styles.nav_icon }) : React$1.createElement(IconRight2, { className: classNames.nav_icon, style: styles.nav_icon }))); -} -function YearsDropdown(props) { - var displayMonth = props.displayMonth; - var _a = useDayPicker(), fromDate = _a.fromDate, toDate2 = _a.toDate, locale2 = _a.locale, styles = _a.styles, classNames = _a.classNames, Dropdown2 = _a.components.Dropdown, formatYearCaption2 = _a.formatters.formatYearCaption, labelYearDropdown2 = _a.labels.labelYearDropdown; - var years = []; - if (fromDate && toDate2) { - var fromYear = fromDate.getFullYear(); - var toYear = toDate2.getFullYear(); - for (var year = fromYear; year <= toYear; year++) { - years.push(setYear(startOfYear(new Date()), year)); - } - } - var handleChange = function(e) { - var newMonth = setYear(new Date(displayMonth), Number(e.target.value)); - props.onChange(newMonth); - }; - return React$1.createElement(Dropdown2, { "aria-label": labelYearDropdown2(), className: classNames.dropdown_month, style: styles.dropdown_month, onChange: handleChange, value: displayMonth.getFullYear(), caption: formatYearCaption2(displayMonth, { locale: locale2 }) }, years.map(function(year2) { - return React$1.createElement("option", { key: year2.getFullYear(), value: year2.getFullYear() }, formatYearCaption2(year2, { locale: locale2 })); - })); } -function useControlledValue(defaultValue, controlledValue) { - var _a = React$1.useState(defaultValue), uncontrolledValue = _a[0], setValue = _a[1]; - var value = controlledValue === void 0 ? uncontrolledValue : controlledValue; - return [value, setValue]; -} -function getInitialMonth(context) { - var month = context.month, defaultMonth = context.defaultMonth, today = context.today; - var initialMonth = month || defaultMonth || today || new Date(); - var toDate2 = context.toDate, fromDate = context.fromDate, _a = context.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a; - if (toDate2 && differenceInCalendarMonths(toDate2, initialMonth) < 0) { - var offset2 = -1 * (numberOfMonths - 1); - initialMonth = addMonths(toDate2, offset2); - } - if (fromDate && differenceInCalendarMonths(initialMonth, fromDate) < 0) { - initialMonth = fromDate; - } - return startOfMonth(initialMonth); -} -function useNavigationState() { - var context = useDayPicker(); - var initialMonth = getInitialMonth(context); - var _a = useControlledValue(initialMonth, context.month), month = _a[0], setMonth2 = _a[1]; - var goToMonth = function(date) { - if (context.disableNavigation) - return; - setMonth2(date); - }; - return [month, goToMonth]; -} -function getDisplayMonths(month, _a) { - var reverseMonths = _a.reverseMonths, numberOfMonths = _a.numberOfMonths; - var start2 = startOfMonth(month); - var end2 = startOfMonth(addMonths(start2, numberOfMonths)); - var monthsDiff = differenceInCalendarMonths(end2, start2); - var months = []; - for (var i = 0; i < monthsDiff; i++) { - var nextMonth = addMonths(start2, i); - months.push(nextMonth); - } - if (reverseMonths) - months = months.reverse(); - return months; -} -function getNextMonth(startingMonth, options) { - if (options.disableNavigation) { - return void 0; - } - var toDate2 = options.toDate, pagedNavigation = options.pagedNavigation, _a = options.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a; - var offset2 = pagedNavigation ? numberOfMonths : 1; - var month = startOfMonth(startingMonth); - if (!toDate2) { - return addMonths(month, offset2); - } - var monthsDiff = differenceInCalendarMonths(toDate2, startingMonth); - if (monthsDiff < numberOfMonths) { - return void 0; - } - return addMonths(month, offset2); -} -function getPreviousMonth(startingMonth, options) { - if (options.disableNavigation) { - return void 0; - } - var fromDate = options.fromDate, pagedNavigation = options.pagedNavigation, _a = options.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a; - var offset2 = pagedNavigation ? numberOfMonths : 1; - var month = startOfMonth(startingMonth); - if (!fromDate) { - return addMonths(month, -offset2); - } - var monthsDiff = differenceInCalendarMonths(month, fromDate); - if (monthsDiff <= 0) { - return void 0; - } - return addMonths(month, -offset2); -} -var NavigationContext = React$1.createContext(void 0); -function NavigationProvider(props) { - var context = useDayPicker(); - var _a = useNavigationState(), month = _a[0], goToMonth = _a[1]; - var displayMonths = getDisplayMonths(month, context); - var nextMonth = getNextMonth(month, context); - var previousMonth = getPreviousMonth(month, context); - return React$1.createElement(NavigationContext.Provider, { value: { - month, - displayMonths, - goToMonth, - previousMonth, - nextMonth - } }, props.children); -} -function useNavigation() { - var context = React$1.useContext(NavigationContext); - if (!context) { - throw new Error("useNavigation must be used within a NavigationProvider"); +async function insertAfterHandler(targetString, formatted, fileContent) { + const targetRegex = new RegExp(`s*${await escapeRegExp(targetString)}s*`); + const fileContentLines = getLinesInString(fileContent); + const targetPosition = fileContentLines.findIndex((line) => targetRegex.test(line)); + const targetNotFound = targetPosition === -1; + if (targetNotFound) { + console.log("unable to find insert after line in file."); } - return context; -} -function Caption(props) { - var _a; - var displayMonth = props.displayMonth; - var context = useDayPicker(); - var classNames = context.classNames, numberOfMonths = context.numberOfMonths, disableNavigation = context.disableNavigation, styles = context.styles, captionLayout = context.captionLayout, onMonthChange = context.onMonthChange, dir = context.dir, CaptionLabel2 = context.components.CaptionLabel; - var _b = useNavigation(), previousMonth = _b.previousMonth, nextMonth = _b.nextMonth, goToMonth = _b.goToMonth, displayMonths = _b.displayMonths; - var handlePreviousClick = function() { - if (!previousMonth) - return; - goToMonth(previousMonth); - onMonthChange === null || onMonthChange === void 0 ? void 0 : onMonthChange(previousMonth); - }; - var handleNextClick = function() { - if (!nextMonth) - return; - goToMonth(nextMonth); - onMonthChange === null || onMonthChange === void 0 ? void 0 : onMonthChange(nextMonth); - }; - var handleMonthChange = function(newMonth) { - goToMonth(newMonth); - onMonthChange === null || onMonthChange === void 0 ? void 0 : onMonthChange(newMonth); - }; - var displayIndex = displayMonths.findIndex(function(month) { - return isSameMonth(displayMonth, month); - }); - var isFirst = displayIndex === 0; - var isLast = displayIndex === displayMonths.length - 1; - if (dir === "rtl") { - _a = [isFirst, isLast], isLast = _a[0], isFirst = _a[1]; - } - var hideNext = numberOfMonths > 1 && (isFirst || !isLast); - var hidePrevious = numberOfMonths > 1 && (isLast || !isFirst); - var captionLabel = React$1.createElement(CaptionLabel2, { id: props.id, displayMonth }); - var captionContent; - if (disableNavigation) { - captionContent = captionLabel; - } else if (captionLayout === "dropdown") { - captionContent = React$1.createElement("div", { className: classNames.caption_dropdowns, style: styles.caption_dropdowns }, React$1.createElement("div", { className: classNames.vhidden }, captionLabel), React$1.createElement(MonthsDropdown, { onChange: handleMonthChange, displayMonth }), React$1.createElement(YearsDropdown, { onChange: handleMonthChange, displayMonth })); + const nextHeaderPositionAfterTargetPosition = fileContentLines.slice(targetPosition + 1).findIndex((line) => /^#+ |---/.test(line)); + const foundNextHeader = nextHeaderPositionAfterTargetPosition !== -1; + if (foundNextHeader) { + let endOfSectionIndex; + for (let i = nextHeaderPositionAfterTargetPosition + targetPosition; i > targetPosition; i--) { + const lineIsNewline = /^[\s\n ]*$/.test(fileContentLines[i]); + if (!lineIsNewline) { + endOfSectionIndex = i; + break; + } + } + if (!endOfSectionIndex) + endOfSectionIndex = targetPosition; + return await insertTextAfterPositionInBody$1(formatted, fileContent, endOfSectionIndex, foundNextHeader); } else { - captionContent = React$1.createElement(React$1.Fragment, null, captionLabel, React$1.createElement(Navigation, { displayMonth, hideNext, hidePrevious, nextMonth, previousMonth, onPreviousClick: handlePreviousClick, onNextClick: handleNextClick })); + return await insertTextAfterPositionInBody$1(formatted, fileContent, fileContentLines.length - 1, foundNextHeader); } - return React$1.createElement("div", { className: classNames.caption, style: styles.caption }, captionContent); -} -function CaptionLabel(props) { - var _a = useDayPicker(), locale2 = _a.locale, classNames = _a.classNames, styles = _a.styles, formatCaption2 = _a.formatters.formatCaption; - return React$1.createElement("h2", { className: classNames.caption_label, style: styles.caption_label, "aria-live": "polite", "aria-atomic": "true", id: props.id }, formatCaption2(props.displayMonth, { locale: locale2 })); } -function isDayPickerMultiple(props) { - return props.mode === "multiple"; -} -var SelectMultipleContext = React$1.createContext(void 0); -function SelectMultipleProvider(props) { - if (!isDayPickerMultiple(props.initialProps)) { - var emptyContextValue = { - selected: void 0, - modifiers: { - disabled: [] - } +async function insertTextAfterPositionInBody$1(text, body, pos, found) { + if (pos === -1) { + return { + content: `${body} +${text}`, + posNum: -1 }; - return React$1.createElement(SelectMultipleContext.Provider, { value: emptyContextValue }, props.children); } - return React$1.createElement(SelectMultipleProviderInternal, { initialProps: props.initialProps, children: props.children }); -} -function SelectMultipleProviderInternal(_a) { - var initialProps = _a.initialProps, children = _a.children; - var selected = initialProps.selected; - var onDayClick = function(day, modifiers2, e) { - var _a2, _b; - (_a2 = initialProps.onDayClick) === null || _a2 === void 0 ? void 0 : _a2.call(initialProps, day, modifiers2, e); - var isMinSelected = Boolean(initialProps.min && modifiers2.selected && selected && selected.length === initialProps.min); - if (isMinSelected) { - return; - } - var isMaxSelected = Boolean(initialProps.max && !modifiers2.selected && selected && selected.length === initialProps.max); - if (isMaxSelected) { - return; - } - var days = selected ? __spreadArray([], selected, true) : []; - if (modifiers2.selected) { - var index = days.findIndex(function(selectedDay) { - return isSameDay(day, selectedDay); - }); - days.splice(index, 1); + const splitContent = body.split("\n"); + if (found) { + const pre = splitContent.slice(0, pos + 1).join("\n"); + const post = splitContent.slice(pos + 1).join("\n"); + return { + content: `${pre} +${text} +${post}`, + posNum: pos + }; + } else { + const pre = splitContent.slice(0, pos + 1).join("\n"); + const post = splitContent.slice(pos + 1).join("\n"); + if (/[\s\S]*?/g.test(post)) { + return { + content: `${pre} +${text}`, + posNum: pos + }; } else { - days.push(day); + return { + content: `${pre}${text} +${post}`, + posNum: pos + }; } - (_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, days, day, modifiers2, e); - }; - var modifiers = { - disabled: [] - }; - if (selected) { - modifiers.disabled = [ - function disableDay(day) { - var isMaxSelected = initialProps.max && selected && selected.length > initialProps.max - 1; - var isSelected = selected === null || selected === void 0 ? void 0 : selected.some(function(selectedDay) { - return isSameDay(selectedDay, day); - }); - return Boolean(isMaxSelected && !isSelected); - } - ]; - } - var contextValue = { selected, onDayClick, modifiers }; - return React$1.createElement(SelectMultipleContext.Provider, { value: contextValue }, children); -} -function useSelectMultiple() { - var context = React$1.useContext(SelectMultipleContext); - if (!context) { - throw new Error("useSelectMultiple must be used within a SelectMultipleProvider"); - } - return context; -} -function isDayPickerRange(props) { - return props.mode === "range"; -} -function addToRange(day, range) { - var _a = range || {}, from = _a.from, to = _a.to; - if (!from) { - return { from: day, to: day }; - } - if (!to && isSameDay(from, day)) { - return void 0; - } - if (!to && isBefore(day, from)) { - return { from: day, to: from }; - } - if (!to) { - return { from, to: day }; - } - if (isSameDay(to, day) && isSameDay(from, day)) { - return void 0; - } - if (isSameDay(to, day)) { - return { from: to, to }; - } - if (isSameDay(from, day)) { - return void 0; - } - if (isAfter(from, day)) { - return { from: day, to }; - } - return { from, to: day }; -} -var SelectRangeContext = React$1.createContext(void 0); -function SelectRangeProvider(props) { - if (!isDayPickerRange(props.initialProps)) { - var emptyContextValue = { - selected: void 0, - modifiers: { - range_start: [], - range_end: [], - range_middle: [], - disabled: [] - } - }; - return React$1.createElement(SelectRangeContext.Provider, { value: emptyContextValue }, props.children); } - return React$1.createElement(SelectRangeProviderInternal, { initialProps: props.initialProps, children: props.children }); } -function SelectRangeProviderInternal(_a) { - var initialProps = _a.initialProps, children = _a.children; - var selected = initialProps.selected; - var min2 = initialProps.min; - var max2 = initialProps.max; - var onDayClick = function(day, modifiers2, e) { - var _a2, _b; - (_a2 = initialProps.onDayClick) === null || _a2 === void 0 ? void 0 : _a2.call(initialProps, day, modifiers2, e); - var newValue = addToRange(day, selected); - if ((min2 || max2) && selected && (newValue === null || newValue === void 0 ? void 0 : newValue.to) && newValue.from && newValue.from !== newValue.to) { - var diff = Math.abs(differenceInCalendarDays(newValue === null || newValue === void 0 ? void 0 : newValue.to, newValue === null || newValue === void 0 ? void 0 : newValue.from)); - if (min2 && diff < min2) { - return; - } - if (max2 && diff >= max2) { +const getAllLinesFromFile$5 = (cache) => cache.split(/\r?\n/); +async function restoreDeletedMemo(deletedMemoid) { + const { vault, metadataCache } = appStore.getState().dailyNotesState.app; + if (/\d{14,}/.test(deletedMemoid)) { + const filePath = getDailyNotePath(); + const absolutePath = filePath + "/" + DeleteFileName + ".md"; + const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath); + if (deleteFile instanceof require$$0.TFile) { + let fileContents = await vault.read(deleteFile); + let fileLines = getAllLinesFromFile$4(fileContents); + if (fileLines.length === 0) { return; - } - } - (_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, newValue, day, modifiers2, e); - }; - var modifiers = { - range_start: [], - range_end: [], - range_middle: [], - disabled: [] - }; - if (selected) { - if (selected.from) { - modifiers.range_start = [selected.from]; - if (selected.to) { - modifiers.range_middle = [ - { - after: selected.from, - before: selected.to - } - ]; - if (max2 || min2) { - modifiers.disabled = [ - function(date) { - if (max2 && selected.to && selected.from && isBefore(date, selected.from)) { - var diff = differenceInCalendarDays(selected.to, date); - if (diff >= max2) { - return true; - } - } - if (max2 && selected.to && selected.from && isAfter(date, selected.to)) { - var diff = differenceInCalendarDays(date, selected.from); - if (diff >= max2) { - return true; - } - } - if (min2 && selected.from && isBefore(date, selected.from)) { - var diff = differenceInCalendarDays(selected.from, date); - if (diff < min2) { - return true; - } + } else { + const lineNum = parseInt(deletedMemoid.slice(14)); + const line = fileLines[lineNum - 1]; + const newDeletefileContents = fileContents.replace(line, ""); + await vault.modify(deleteFile, newDeletefileContents); + if (/^- (.+)$/.test(line)) { + const id2 = extractIDfromText(line); + const date = require$$0.moment(id2, "YYYYMMDDHHmmss"); + const timeHour = date.format("HH"); + const timeMinute = date.format("mm"); + const newEvent = `- ` + String(timeHour) + `:` + String(timeMinute) + ` ` + extractContentfromText$1(line); + const dailyNotes = await getAllDailyNotes_1(); + const existingFile = getDailyNote_1(date, dailyNotes); + if (!existingFile) { + const file = await createDailyNote_1(date); + const fileContents2 = await vault.read(file); + const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents2); + await vault.modify(file, newFileContent.content); + return [ + { + deletedAt: "" } - if (min2 && selected.to && selected.from && isAfter(date, selected.to)) { - var diff = differenceInCalendarDays(date, selected.from); - if (diff < min2) { - return true; - } + ]; + } else { + const fileContents2 = await vault.read(existingFile); + const newFileContent = await insertAfterHandler(InsertAfter, newEvent, fileContents2); + await vault.modify(existingFile, newFileContent.content); + return [ + { + deletedAt: "" } - return false; - } - ]; + ]; + } } - modifiers.range_end = [selected.to]; - } else { - modifiers.range_end = [selected.from]; + fileLines = null; + fileContents = null; } } } - return React$1.createElement(SelectRangeContext.Provider, { value: { selected, onDayClick, modifiers } }, children); -} -function useSelectRange() { - var context = React$1.useContext(SelectRangeContext); - if (!context) { - throw new Error("useSelectRange must be used within a SelectRangeProvider"); - } - return context; -} -function isDayPickerSingle(props) { - return props.mode === "single"; -} -var SelectSingleContext = React$1.createContext(void 0); -function SelectSingleProvider(props) { - if (!isDayPickerSingle(props.initialProps)) { - var emptyContextValue = { - selected: void 0 - }; - return React$1.createElement(SelectSingleContext.Provider, { value: emptyContextValue }, props.children); - } - return React$1.createElement(SelectSingleProviderInternal, { initialProps: props.initialProps, children: props.children }); -} -function SelectSingleProviderInternal(_a) { - var initialProps = _a.initialProps, children = _a.children; - var onDayClick = function(day, dayModifiers, e) { - var _a2, _b; - if (dayModifiers.selected && !initialProps.required) { - (_a2 = initialProps.onSelect) === null || _a2 === void 0 ? void 0 : _a2.call(initialProps, void 0, day, dayModifiers, e); - return; - } - (_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, day, day, dayModifiers, e); - }; - var contextValue = { - selected: initialProps.selected, - onDayClick - }; - return React$1.createElement(SelectSingleContext.Provider, { value: contextValue }, children); -} -function useSelectSingle() { - var context = React$1.useContext(SelectSingleContext); - if (!context) { - throw new Error("useSelectSingle must be used within a SelectSingleProvider"); - } - return context; -} -function toMatcherArray(modifierFromProp) { - if (Array.isArray(modifierFromProp)) { - return modifierFromProp; - } else if (modifierFromProp !== void 0) { - return [modifierFromProp]; - } else { - return []; - } -} -function getCustomModifiers(dayPicker) { - var customModifiers = {}; - Object.entries(dayPicker.modifiers).forEach(function(_a) { - var modifier = _a[0], matcher = _a[1]; - customModifiers[modifier] = toMatcherArray(matcher); - }); - return customModifiers; -} -var InternalModifier; -(function(InternalModifier2) { - InternalModifier2["Disabled"] = "disabled"; - InternalModifier2["Selected"] = "selected"; - InternalModifier2["Hidden"] = "hidden"; - InternalModifier2["Today"] = "today"; - InternalModifier2["RangeStart"] = "range_start"; - InternalModifier2["RangeEnd"] = "range_end"; - InternalModifier2["RangeMiddle"] = "range_middle"; -})(InternalModifier || (InternalModifier = {})); -function getInternalModifiers(dayPicker, selectMultiple, selectRange) { - var _a; - var internalModifiers = (_a = {}, _a[InternalModifier.Selected] = toMatcherArray(dayPicker.selected), _a[InternalModifier.Disabled] = toMatcherArray(dayPicker.disabled), _a[InternalModifier.Hidden] = toMatcherArray(dayPicker.hidden), _a[InternalModifier.Today] = [dayPicker.today], _a[InternalModifier.RangeEnd] = [], _a[InternalModifier.RangeMiddle] = [], _a[InternalModifier.RangeStart] = [], _a); - if (dayPicker.fromDate) { - internalModifiers.disabled.push({ before: dayPicker.fromDate }); - } - if (dayPicker.toDate) { - internalModifiers.disabled.push({ after: dayPicker.toDate }); - } - if (isDayPickerMultiple(dayPicker)) { - internalModifiers.disabled = internalModifiers.disabled.concat(selectMultiple.modifiers.disabled); - } else if (isDayPickerRange(dayPicker)) { - internalModifiers.disabled = internalModifiers.disabled.concat(selectRange.modifiers.disabled); - internalModifiers.range_start = selectRange.modifiers.range_start; - internalModifiers.range_middle = selectRange.modifiers.range_middle; - internalModifiers.range_end = selectRange.modifiers.range_end; - } - return internalModifiers; -} -var ModifiersContext = React$1.createContext(void 0); -function ModifiersProvider(props) { - var dayPicker = useDayPicker(); - var selectMultiple = useSelectMultiple(); - var selectRange = useSelectRange(); - var internalModifiers = getInternalModifiers(dayPicker, selectMultiple, selectRange); - var customModifiers = getCustomModifiers(dayPicker); - var modifiers = __assign(__assign({}, internalModifiers), customModifiers); - return React$1.createElement(ModifiersContext.Provider, { value: modifiers }, props.children); -} -function useModifiers() { - var context = React$1.useContext(ModifiersContext); - if (!context) { - throw new Error("useModifiers must be used within a ModifiersProvider"); - } - return context; -} -function isDateInterval(matcher) { - return Boolean(matcher && typeof matcher === "object" && "before" in matcher && "after" in matcher); -} -function isDateRange(value) { - return Boolean(value && typeof value === "object" && "from" in value); -} -function isDateAfterType(value) { - return Boolean(value && typeof value === "object" && "after" in value); -} -function isDateBeforeType(value) { - return Boolean(value && typeof value === "object" && "before" in value); -} -function isDayOfWeekType(value) { - return Boolean(value && typeof value === "object" && "dayOfWeek" in value); -} -function isDateInRange(date, range) { - var _a; - var from = range.from, to = range.to; - if (!from) { - return false; - } - if (!to && isSameDay(from, date)) { - return true; - } - if (!to) { - return false; - } - var isToBeforeFrom = differenceInCalendarDays(to, from) < 0; - if (to && isToBeforeFrom) { - _a = [to, from], from = _a[0], to = _a[1]; - } - return differenceInCalendarDays(date, from) >= 0 && differenceInCalendarDays(to, date) >= 0; -} -function isDateType(value) { - return isDate(value); -} -function isArrayOfDates(value) { - return Array.isArray(value) && value.every(isDate); -} -function isMatch(day, matchers) { - return matchers.some(function(matcher) { - if (typeof matcher === "boolean") { - return matcher; - } - if (isDateType(matcher)) { - return isSameDay(day, matcher); - } - if (isArrayOfDates(matcher)) { - return matcher.includes(day); - } - if (isDateRange(matcher)) { - return isDateInRange(day, matcher); - } - if (isDayOfWeekType(matcher)) { - return matcher.dayOfWeek.includes(day.getDay()); - } - if (isDateInterval(matcher)) { - var isBefore2 = differenceInCalendarDays(matcher.before, day) > 0; - var isAfter2 = differenceInCalendarDays(day, matcher.after) > 0; - return isBefore2 && isAfter2; - } - if (isDateAfterType(matcher)) { - return differenceInCalendarDays(day, matcher.after) > 0; - } - if (isDateBeforeType(matcher)) { - return differenceInCalendarDays(matcher.before, day) > 0; - } - if (typeof matcher === "function") { - return matcher(day); - } - return false; - }); } -function getModifierStatus(date, modifiers) { - var modifiersList = Object.keys(modifiers).reduce(function(previousValue, key) { - var modifier = modifiers[key]; - if (isMatch(date, modifier)) { - previousValue.push(key); - } - return previousValue; - }, []); - var modifiersStatus = {}; - modifiersList.forEach(function(modifier) { - return modifiersStatus[modifier] = true; - }); - return modifiersStatus; -} -function useDayModifiers(date) { - var context = useDayPicker(); - var modifiersContext = useModifiers(); - var modifiers = getModifierStatus(date, modifiersContext); - var modifierClassNames = []; - Object.keys(modifiers).forEach(function(modifier) { - var customClassName = context.modifierClassNames[modifier]; - if (customClassName) { - modifierClassNames.push(customClassName); - } else { - modifierClassNames.push("" + context.modifierPrefix + modifier); +async function deleteForever(deletedMemoid) { + const { vault, metadataCache } = appStore.getState().dailyNotesState.app; + if (/\d{14,}/.test(deletedMemoid)) { + const filePath = getDailyNotePath(); + const absolutePath = filePath + "/" + DeleteFileName + ".md"; + const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath); + if (deleteFile instanceof require$$0.TFile) { + let fileContents = await vault.read(deleteFile); + let fileLines = getAllLinesFromFile$4(fileContents); + if (fileLines.length === 0) { + return; + } else { + const lineNum = parseInt(deletedMemoid.slice(14)); + const line = fileLines[lineNum - 1]; + if (/^- (.+)$/.test(line)) { + const newFileContent = fileContents.replace(line, ""); + await vault.modify(deleteFile, newFileContent); + } + } + fileLines = null; + fileContents = null; } - }); - var modifierStyle = {}; - if (context.modifierStyles) { - Object.keys(modifiers).forEach(function(modifier) { - var _a; - modifierStyle = __assign(__assign({}, modifierStyle), (_a = context.modifierStyles) === null || _a === void 0 ? void 0 : _a[modifier]); - }); } - return { - modifiers, - modifierClassNames, - modifierStyle - }; } -var isFocusable$1 = function(modifiers) { - return !modifiers.disabled && !modifiers.hidden; -}; -function getInitialFocusTarget(displayMonths, modifiersContext) { - var firstDayInMonth = startOfMonth(displayMonths[0]); - var lastDayInMonth = endOfMonth(displayMonths[displayMonths.length - 1]); - var firstFocusableDay; - var today; - var date = firstDayInMonth; - while (date <= lastDayInMonth) { - var modifiers = getModifierStatus(date, modifiersContext); - if (!isFocusable$1(modifiers)) { - date = addDays(date, 1); - continue; - } - if (modifiers.selected) { - return date; - } - if (modifiers.today && !today) { - today = date; - } - if (!firstFocusableDay) { - firstFocusableDay = date; - } - date = addDays(date, 1); - } - if (today) { - return today; - } else { - return firstFocusableDay; - } -} -var FocusContext = React$1.createContext(void 0); -function FocusProvider(_a) { - var children = _a.children; - var _b = React$1.useState(), focusedDay = _b[0], setDay = _b[1]; - var _c = useNavigation(), goToMonth = _c.goToMonth, displayMonths = _c.displayMonths; - var numberOfMonths = useDayPicker().numberOfMonths; - var modifiersContext = useModifiers(); - var initialFocusTarget = getInitialFocusTarget(displayMonths, modifiersContext); - var _d = React$1.useState(), lastFocusedDay = _d[0], setLastFocusedDay = _d[1]; - var isWithinDisplayMonths = function(date) { - return displayMonths.some(function(displayMonth) { - return isSameMonth(date, displayMonth); - }); - }; - var focusTarget = (focusedDay !== null && focusedDay !== void 0 ? focusedDay : lastFocusedDay && isWithinDisplayMonths(lastFocusedDay)) ? lastFocusedDay : initialFocusTarget; - var blur = function() { - setLastFocusedDay(focusedDay); - setDay(void 0); - }; - var focus = function(date) { - return setDay(date); - }; - var switchMonth = function(date, offset2) { - if (displayMonths.some(function(m2) { - return isSameMonth(date, m2); - })) - return; - if (offset2 < 0) { - goToMonth(addMonths(date, 1 + offset2)); +async function getDeletedMemos() { + const { vault, metadataCache } = appStore.getState().dailyNotesState.app; + const filePath = getDailyNotePath(); + const absolutePath = filePath + "/" + DeleteFileName + ".md"; + const deletedMemos = []; + const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath); + if (deleteFile instanceof require$$0.TFile) { + let fileContents = await vault.read(deleteFile); + let fileLines = getAllLinesFromFile$4(fileContents); + if (fileLines.length === 0) { + return deletedMemos; } else { - goToMonth(date); + for (let i = 0; i < fileLines.length; i++) { + const line = fileLines[i]; + if (!/- /.test(line)) { + continue; + } else { + const id2 = extractIDfromText(line); + const timeString = id2.slice(0, 13); + const createdDate = require$$0.moment(timeString, "YYYYMMDDHHmmss"); + const deletedDateID = extractDeleteDatefromText(fileLines[i]); + const deletedDate = require$$0.moment(deletedDateID.slice(0, 13), "YYYYMMDDHHmmss"); + const content = extractContentfromText$1(fileLines[i]); + deletedMemos.push({ + id: deletedDateID, + content, + user_id: 1, + createdAt: createdDate.format("YYYY/MM/DD HH:mm:SS"), + updatedAt: createdDate.format("YYYY/MM/DD HH:mm:SS"), + deletedAt: deletedDate + }); + } + } } - }; - var focusDayBefore = function() { - if (!focusedDay) - return; - var before = addDays(focusedDay, -1); - focus(before); - switchMonth(before, numberOfMonths * -1); - }; - var focusDayAfter = function() { - if (!focusedDay) - return; - var after = addDays(focusedDay, 1); - focus(after); - switchMonth(after, numberOfMonths); - }; - var focusWeekBeforeDay = function() { - if (!focusedDay) - return; - var up = addWeeks(focusedDay, -1); - focus(up); - switchMonth(up, numberOfMonths * -1); - }; - var focusWeekAfterDay = function() { - if (!focusedDay) - return; - var down = addWeeks(focusedDay, 1); - focus(down); - switchMonth(down, numberOfMonths); - }; - var focusStartOfWeek = function() { - if (!focusedDay) - return; - var dayToFocus = startOfWeek(focusedDay); - switchMonth(dayToFocus, numberOfMonths); - focus(dayToFocus); - }; - var focusEndOfWeek = function() { - if (!focusedDay) - return; - var dayToFocus = endOfWeek(focusedDay); - switchMonth(dayToFocus, numberOfMonths); - focus(dayToFocus); - }; - var focusMonthBefore = function() { - if (!focusedDay) - return; - var monthBefore = addMonths(focusedDay, -1); - switchMonth(monthBefore, numberOfMonths); - focus(monthBefore); - }; - var focusMonthAfter = function() { - if (!focusedDay) - return; - var monthAfter = addMonths(focusedDay, 1); - switchMonth(monthAfter, numberOfMonths); - focus(monthAfter); - }; - var focusYearBefore = function() { - if (!focusedDay) - return; - var yearBefore = addYears(focusedDay, -1); - switchMonth(yearBefore, numberOfMonths); - focus(yearBefore); - }; - var focusYearAfter = function() { - if (!focusedDay) - return; - var yearAfter = addYears(focusedDay, 1); - switchMonth(yearAfter, numberOfMonths); - focus(yearAfter); - }; - var value = { - focusedDay, - focusTarget, - blur, - focus, - focusDayAfter, - focusDayBefore, - focusWeekAfterDay, - focusWeekBeforeDay, - focusMonthBefore, - focusMonthAfter, - focusYearBefore, - focusYearAfter, - focusStartOfWeek, - focusEndOfWeek - }; - return React$1.createElement(FocusContext.Provider, { value }, children); -} -function useFocus() { - var context = React$1.useContext(FocusContext); - if (!context) { - throw new Error("useFocus must be used within a FocusProvider"); + fileLines = null; + fileContents = null; } - return context; + return deletedMemos; } -function useDayFocus(date, buttonRef) { - var _a = useFocus(), focusedDay = _a.focusedDay, focusTarget = _a.focusTarget, focusDayAfter = _a.focusDayAfter, focusDayBefore = _a.focusDayBefore, focusWeekAfterDay = _a.focusWeekAfterDay, focusWeekBeforeDay = _a.focusWeekBeforeDay, blur = _a.blur, focus = _a.focus, focusMonthBefore = _a.focusMonthBefore, focusMonthAfter = _a.focusMonthAfter, focusYearBefore = _a.focusYearBefore, focusYearAfter = _a.focusYearAfter, focusStartOfWeek = _a.focusStartOfWeek, focusEndOfWeek = _a.focusEndOfWeek; - var dir = useDayPicker().dir; - React$1.useEffect(function() { - var _a2; - if (!focusedDay) - return; - if (isSameDay(focusedDay, date)) { - (_a2 = buttonRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus(); - } - }, [focusedDay, date, buttonRef]); - var focusOnKeyDown = function(e) { - switch (e.key) { - case "ArrowLeft": - e.preventDefault(); - e.stopPropagation(); - dir === "rtl" ? focusDayAfter() : focusDayBefore(); - break; - case "ArrowRight": - e.preventDefault(); - e.stopPropagation(); - dir === "rtl" ? focusDayBefore() : focusDayAfter(); - break; - case "ArrowDown": - e.preventDefault(); - e.stopPropagation(); - focusWeekAfterDay(); - break; - case "ArrowUp": - e.preventDefault(); - e.stopPropagation(); - focusWeekBeforeDay(); - break; - case "PageUp": - e.preventDefault(); - e.stopPropagation(); - e.shiftKey ? focusYearBefore() : focusMonthBefore(); - break; - case "PageDown": - e.preventDefault(); - e.stopPropagation(); - e.shiftKey ? focusYearAfter() : focusMonthAfter(); - break; - case "Home": - e.preventDefault(); - e.stopPropagation(); - focusStartOfWeek(); - break; - case "End": - e.preventDefault(); - e.stopPropagation(); - focusEndOfWeek(); - break; - } - }; - var isFocusTarget = Boolean(focusTarget && isSameDay(focusTarget, date)); - return { focus, blur, focusOnKeyDown, isFocusTarget }; -} -function useDay(date, displayMonth, buttonRef) { - var context = useDayPicker(); - var single = useSelectSingle(); - var multiple = useSelectMultiple(); - var range = useSelectRange(); - var _a = useDayFocus(date, buttonRef), focus = _a.focus, blur = _a.blur, focusOnKeyDown = _a.focusOnKeyDown, isFocusTarget = _a.isFocusTarget; - var _b = useDayModifiers(date), modifiers = _b.modifiers, modifierClassNames = _b.modifierClassNames, modifierStyle = _b.modifierStyle; - var isOutside = !isSameMonth(date, displayMonth); - var returnValue = { - isOutside, - modifiers, - selected: isDayPickerSingle(context) ? single.selected : isDayPickerMultiple(context) ? multiple.selected : isDayPickerRange(context) ? range.selected : void 0, - single, - multiple, - range - }; - if (isOutside && !context.showOutsideDays) { - return returnValue; - } - if (modifiers.hidden) { - return returnValue; - } - var classNames = [context.classNames.day].concat(modifierClassNames); - var style = __assign(__assign({}, context.styles.day), modifierStyle); - if (isOutside) { - classNames.push(context.classNames.day_outside); - style = __assign(__assign({}, context.styles), context.styles.day_outside); - } - var DayContent2 = context.components.DayContent; - var children = React$1.createElement(DayContent2, { date, displayMonth, modifiers }); - var className = classNames.join(" "); - if (!context.mode && !context.onDayClick) { - return __assign(__assign({}, returnValue), { nonInteractiveProps: { - style, - className, - children - } }); - } - var handleClick = function(e) { - var _a2, _b2, _c, _d; - if (isDayPickerSingle(context)) { - (_a2 = single.onDayClick) === null || _a2 === void 0 ? void 0 : _a2.call(single, date, modifiers, e); - } else if (isDayPickerMultiple(context)) { - (_b2 = multiple.onDayClick) === null || _b2 === void 0 ? void 0 : _b2.call(multiple, date, modifiers, e); - } else if (isDayPickerRange(context)) { - (_c = range.onDayClick) === null || _c === void 0 ? void 0 : _c.call(range, date, modifiers, e); +const sendMemoToDelete = async (memoContent) => { + const { metadataCache, vault } = appStore.getState().dailyNotesState.app; + const filePath = getDailyNotePath(); + const absolutePath = filePath + "/" + DeleteFileName + ".md"; + const deleteFile = metadataCache.getFirstLinkpathDest("", absolutePath); + if (deleteFile instanceof require$$0.TFile) { + const fileContents = await vault.read(deleteFile); + const fileLines = getAllLinesFromFile$4(fileContents); + const date = require$$0.moment(); + const deleteDate = date.format("YYYY/MM/DD HH:mm:ss"); + let lineNum; + if (fileLines.length === 1 && fileLines[0] === "") { + lineNum = 1; + } else { + lineNum = fileLines.length + 1; } - (_d = context.onDayClick) === null || _d === void 0 ? void 0 : _d.call(context, date, modifiers, e); - }; - var handleFocus = function(e) { - var _a2; - focus(date); - (_a2 = context.onDayFocus) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e); - }; - var handleBlur = function(e) { - var _a2; - blur(); - (_a2 = context.onDayBlur) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e); - }; - var handleKeyDown = function(e) { - var _a2; - focusOnKeyDown(e); - (_a2 = context.onDayKeyDown) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e); - }; - var handleKeyUp = function(e) { - var _a2; - (_a2 = context.onDayKeyUp) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e); - }; - var handleMouseEnter = function(e) { - var _a2; - (_a2 = context.onDayMouseEnter) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e); - }; - var handleMouseLeave = function(e) { - var _a2; - (_a2 = context.onDayMouseLeave) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e); - }; - var handleTouchCancel = function(e) { - var _a2; - (_a2 = context.onDayTouchCancel) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e); - }; - var handleTouchEnd = function(e) { - var _a2; - (_a2 = context.onDayTouchEnd) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e); - }; - var handleTouchMove = function(e) { - var _a2; - (_a2 = context.onDayTouchMove) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e); - }; - var handleTouchStart = function(e) { - var _a2; - (_a2 = context.onDayTouchStart) === null || _a2 === void 0 ? void 0 : _a2.call(context, date, modifiers, e); - }; - if (isOutside) { - classNames.push(context.classNames.day_outside); - style = __assign(__assign({}, context.styles), context.styles.day_outside); - } - className = classNames.join(" "); - var selected = modifiers.selected, disabled = modifiers.disabled; - var tabIndex = isFocusTarget ? 0 : -1; - return __assign(__assign({}, returnValue), { buttonProps: { - children, - "aria-pressed": selected, - style, - disabled, - className, - tabIndex, - onClick: handleClick, - onFocus: handleFocus, - onBlur: handleBlur, - onKeyDown: handleKeyDown, - onKeyUp: handleKeyUp, - onMouseEnter: handleMouseEnter, - onMouseLeave: handleMouseLeave, - onTouchCancel: handleTouchCancel, - onTouchEnd: handleTouchEnd, - onTouchMove: handleTouchMove, - onTouchStart: handleTouchStart - } }); -} -function Day(props) { - var buttonRef = React$1.useRef(null); - var day = useDay(props.date, props.displayMonth, buttonRef); - var buttonProps = day.buttonProps, nonInteractiveProps = day.nonInteractiveProps; - if (!buttonProps && !nonInteractiveProps) { - return React$1.createElement(React$1.Fragment, null); - } - if (nonInteractiveProps) { - return React$1.createElement("div", __assign({}, nonInteractiveProps)); - } - return React$1.createElement(Button, __assign({ ref: buttonRef }, buttonProps)); -} -function DayContent(props) { - var _a = useDayPicker(), locale2 = _a.locale, classNames = _a.classNames, styles = _a.styles, labelDay2 = _a.labels.labelDay, formatDay2 = _a.formatters.formatDay; - return React$1.createElement(React$1.Fragment, null, React$1.createElement("span", { "aria-hidden": "true" }, formatDay2(props.date, { locale: locale2 })), React$1.createElement("span", { className: classNames.vhidden, style: styles.vhidden }, labelDay2(props.date, props.modifiers, { locale: locale2 }))); -} -function Dropdown(props) { - var onChange = props.onChange, value = props.value, children = props.children, caption = props.caption, className = props.className, style = props.style; - var _a = useDayPicker(), classNames = _a.classNames, styles = _a.styles, IconDropdown2 = _a.components.IconDropdown; - return React$1.createElement("div", { className, style }, React$1.createElement("span", { className: classNames.vhidden }, props["aria-label"]), React$1.createElement("select", { "aria-label": props["aria-label"], className: classNames.dropdown, style: styles.dropdown, value, onChange }, children), React$1.createElement("div", { className: classNames.caption_label, style: styles.caption_label, "aria-hidden": "true" }, caption, React$1.createElement(IconDropdown2, { className: classNames.dropdown_icon, style: styles.dropdown_icon }))); -} -function Footer() { - var _a = useDayPicker(), footer = _a.footer, styles = _a.styles, tfoot = _a.classNames.tfoot; - if (!footer) - return React$1.createElement(React$1.Fragment, null); - return React$1.createElement("tfoot", { className: tfoot, style: styles.tfoot }, React$1.createElement("tr", null, React$1.createElement("td", { colSpan: 8 }, footer))); -} -function getWeekdays(locale2) { - var start2 = startOfWeek(new Date(), { locale: locale2 }); - var days = []; - for (var i = 0; i < 7; i++) { - var day = addDays(start2, i); - days.push(day); - } - return days; -} -function Head() { - var _a = useDayPicker(), classNames = _a.classNames, styles = _a.styles, showWeekNumber = _a.showWeekNumber, locale2 = _a.locale, formatWeekdayName2 = _a.formatters.formatWeekdayName, labelWeekday2 = _a.labels.labelWeekday; - var weekdays = getWeekdays(locale2); - return React$1.createElement("thead", { style: styles.head, className: classNames.head }, React$1.createElement("tr", { style: styles.head_row, className: classNames.head_row }, showWeekNumber && React$1.createElement("th", { scope: "col", style: styles.head_cell, className: classNames.head_cell }), weekdays.map(function(weekday, i) { - return React$1.createElement("th", { key: i, scope: "col", className: classNames.head_cell, style: styles.head_cell }, React$1.createElement("span", { "aria-hidden": true }, formatWeekdayName2(weekday, { locale: locale2 })), React$1.createElement("span", { className: classNames.vhidden }, labelWeekday2(weekday, { locale: locale2 }))); - }))); -} -function IconDropdown(props) { - return React$1.createElement("svg", __assign({ width: "8px", height: "8px", viewBox: "0 0 120 120", "data-testid": "iconDropdown" }, props), React$1.createElement("path", { d: "M4.22182541,48.2218254 C8.44222828,44.0014225 15.2388494,43.9273804 19.5496459,47.9996989 L19.7781746,48.2218254 L60,88.443 L100.221825,48.2218254 C104.442228,44.0014225 111.238849,43.9273804 115.549646,47.9996989 L115.778175,48.2218254 C119.998577,52.4422283 120.07262,59.2388494 116.000301,63.5496459 L115.778175,63.7781746 L67.7781746,111.778175 C63.5577717,115.998577 56.7611506,116.07262 52.4503541,112.000301 L52.2218254,111.778175 L4.22182541,63.7781746 C-0.0739418023,59.4824074 -0.0739418023,52.5175926 4.22182541,48.2218254 Z", fill: "currentColor", fillRule: "nonzero" })); -} -function IconLeft(props) { - return React$1.createElement("svg", __assign({ width: "16px", height: "16px", viewBox: "0 0 120 120", "data-testid": "iconLeft" }, props), React$1.createElement("path", { d: "M69.490332,3.34314575 C72.6145263,0.218951416 77.6798462,0.218951416 80.8040405,3.34314575 C83.8617626,6.40086786 83.9268205,11.3179931 80.9992143,14.4548388 L80.8040405,14.6568542 L35.461,60 L80.8040405,105.343146 C83.8617626,108.400868 83.9268205,113.317993 80.9992143,116.454839 L80.8040405,116.656854 C77.7463184,119.714576 72.8291931,119.779634 69.6923475,116.852028 L69.490332,116.656854 L18.490332,65.6568542 C15.4326099,62.5991321 15.367552,57.6820069 18.2951583,54.5451612 L18.490332,54.3431458 L69.490332,3.34314575 Z", fill: "currentColor", fillRule: "nonzero" })); -} -function IconRight(props) { - return React$1.createElement("svg", __assign({ width: "16px", height: "16px", viewBox: "0 0 120 120" }, props, { "data-testid": "iconRight" }), React$1.createElement("path", { d: "M49.8040405,3.34314575 C46.6798462,0.218951416 41.6145263,0.218951416 38.490332,3.34314575 C35.4326099,6.40086786 35.367552,11.3179931 38.2951583,14.4548388 L38.490332,14.6568542 L83.8333725,60 L38.490332,105.343146 C35.4326099,108.400868 35.367552,113.317993 38.2951583,116.454839 L38.490332,116.656854 C41.5480541,119.714576 46.4651794,119.779634 49.602025,116.852028 L49.8040405,116.656854 L100.804041,65.6568542 C103.861763,62.5991321 103.926821,57.6820069 100.999214,54.5451612 L100.804041,54.3431458 L49.8040405,3.34314575 Z", fill: "currentColor" })); -} -function Row(props) { - var _a = useDayPicker(), styles = _a.styles, classNames = _a.classNames, showWeekNumber = _a.showWeekNumber, _b = _a.components, Day2 = _b.Day, WeekNumber2 = _b.WeekNumber; - var weekNumberCell; - if (showWeekNumber) { - weekNumberCell = React$1.createElement("td", { className: classNames.cell, style: styles.cell }, React$1.createElement(WeekNumber2, { number: props.weekNumber, dates: props.dates })); + const deleteDateID = date.format("YYYYMMDDHHmmss") + lineNum; + await createDeleteMemoInFile(deleteFile, fileContents, memoContent, deleteDateID); + return deleteDate; + } else { + const deleteFilePath = require$$0.normalizePath(absolutePath); + const file = await createdeleteFile(deleteFilePath); + const date = require$$0.moment(); + const deleteDate = date.format("YYYY/MM/DD HH:mm:ss"); + const lineNum = 1; + const deleteDateID = date.format("YYYYMMDDHHmmss") + lineNum; + await createDeleteMemoInFile(file, "", memoContent, deleteDateID); + return deleteDate; } - return React$1.createElement("tr", { className: classNames.row, style: styles.row }, weekNumberCell, props.dates.map(function(date) { - return React$1.createElement("td", { className: classNames.cell, style: styles.cell, key: getUnixTime(date) }, React$1.createElement(Day2, { displayMonth: props.displayMonth, date })); - })); -} -function WeekNumber(props) { - var weekNumber = props.number, dates = props.dates; - var _a = useDayPicker(), onWeekNumberClick = _a.onWeekNumberClick, styles = _a.styles, classNames = _a.classNames, locale2 = _a.locale, labelWeekNumber2 = _a.labels.labelWeekNumber, formatWeekNumber2 = _a.formatters.formatWeekNumber; - var handleClick = function(e) { - onWeekNumberClick === null || onWeekNumberClick === void 0 ? void 0 : onWeekNumberClick(weekNumber, dates, e); - }; - var content = formatWeekNumber2(Number(weekNumber), { locale: locale2 }); - if (!onWeekNumberClick) { - return React$1.createElement("span", { className: classNames.weeknumber, style: styles.weeknumber }, content); - } - var label = labelWeekNumber2(Number(weekNumber), { locale: locale2 }); - return React$1.createElement(Button, { "aria-label": label, className: classNames.weeknumber, style: styles.weeknumber, onClick: handleClick }, content); -} -var defaultClassNames = { - root: "rdp", - multiple_months: "rdp-multiple_months", - with_weeknumber: "rdp-with_weeknumber", - vhidden: "rdp-vhidden", - button_reset: "rdp-button_reset", - button: "rdp-button", - caption: "rdp-caption", - caption_start: "rdp-caption_start", - caption_end: "rdp-caption_end", - caption_between: "rdp-caption_between", - caption_label: "rdp-caption_label", - caption_dropdowns: "rdp-caption_dropdowns", - dropdown: "rdp-dropdown", - dropdown_month: "rdp-dropdown_month", - dropdown_year: "rdp-dropdown_year", - dropdown_icon: "rdp-dropdown_icon", - months: "rdp-months", - month: "rdp-month", - table: "rdp-table", - tbody: "rdp-tbody", - tfoot: "rdp-tfoot", - head: "rdp-head", - head_row: "rdp-head_row", - head_cell: "rdp-head_cell", - nav: "rdp-nav", - nav_button: "rdp-nav_button", - nav_button_previous: "rdp-nav_button_previous", - nav_button_next: "rdp-nav_button_next", - nav_icon: "rdp-nav_icon", - row: "rdp-row", - weeknumber: "rdp-weeknumber", - cell: "rdp-cell", - day: "rdp-day", - day_outside: "rdp-day_outside" -}; -function formatCaption(month, options) { - return format(month, "LLLL y", options); -} -function formatDay(day, options) { - return format(day, "d", options); -} -function formatMonthCaption(month, options) { - return format(month, "LLLL", options); -} -function formatWeekNumber(weekNumber) { - return "" + weekNumber; -} -function formatWeekdayName(weekday, options) { - return format(weekday, "cccccc", options); -} -function formatYearCaption(year, options) { - return format(year, "yyyy", options); -} -var formatters = /* @__PURE__ */ Object.freeze({ - __proto__: null, - [Symbol.toStringTag]: "Module", - formatCaption, - formatDay, - formatMonthCaption, - formatWeekNumber, - formatWeekdayName, - formatYearCaption -}); -var labelDay = function(day, modifers, options) { - return format(day, "do MMMM (EEEE)", options); }; -var labelMonthDropdown = function() { - return "Month: "; -}; -var labelNext = function() { - return "Go to next month"; +const createDeleteMemoInFile = async (file, fileContent, memoContent, deleteDate) => { + const { vault } = appStore.getState().dailyNotesState.app; + let newContent; + if (fileContent === "") { + newContent = memoContent + " deletedAt: " + deleteDate; + } else { + newContent = fileContent + "\n" + memoContent + " deletedAt: " + deleteDate; + } + await vault.modify(file, newContent); + return true; }; -var labelPrevious = function() { - return "Go to previous month"; +const createdeleteFile = async (path) => { + const { vault } = appStore.getState().dailyNotesState.app; + try { + const createdFile = await vault.create(path, ""); + return createdFile; + } catch (err) { + console.error(`Failed to create file: '${path}'`, err); + new require$$0.Notice("Unable to create new file."); + } }; -var labelWeekday = function(day, options) { - return format(day, "cccc", options); +const getAllLinesFromFile$4 = (cache) => cache.split(/\r?\n/); +const extractIDfromText = (line) => { + var _a; + return (_a = /^- (\d{14})(\d+)\s(.+)\s(deletedAt: )(.+)$/.exec(line)) == null ? void 0 : _a[1]; }; -var labelWeekNumber = function(n2) { - return "Week n. " + n2; +const extractContentfromText$1 = (line) => { + var _a; + return (_a = /^- (\d+)\s(.+)\s(deletedAt: )(.+)$/.exec(line)) == null ? void 0 : _a[2]; }; -var labelYearDropdown = function() { - return "Year: "; +const extractDeleteDatefromText = (line) => { + var _a; + return (_a = /^- (\d+)\s(.+)\s(deletedAt: )(.+)$/.exec(line)) == null ? void 0 : _a[4]; }; -var labels = /* @__PURE__ */ Object.freeze({ - __proto__: null, - [Symbol.toStringTag]: "Module", - labelDay, - labelMonthDropdown, - labelNext, - labelPrevious, - labelWeekday, - labelWeekNumber, - labelYearDropdown -}); -function parseFromToProps(props) { - var fromYear = props.fromYear, toYear = props.toYear, fromMonth = props.fromMonth, toMonth = props.toMonth; - var fromDate = props.fromDate, toDate2 = props.toDate; - if (fromMonth) { - fromDate = startOfMonth(fromMonth); - } else if (fromYear) { - fromDate = new Date(fromYear, 0, 1); - } - if (toMonth) { - toDate2 = startOfMonth(toMonth); - } else if (toYear) { - toDate2 = new Date(toYear, 11, 31); +async function obHideMemo(memoid) { + const { dailyNotes } = dailyNotesService.getState(); + if (/\d{14,}/.test(memoid)) { + const { vault } = appStore.getState().dailyNotesState.app; + const timeString = memoid.slice(0, 13); + const idString = parseInt(memoid.slice(14)); + const changeDate = require$$0.moment(timeString, "YYYYMMDDHHmmSS"); + const dailyNote = getDailyNote_1(changeDate, dailyNotes); + const fileContent = await vault.read(dailyNote); + const fileLines = getAllLinesFromFile$3(fileContent); + const content = extractContentfromText(fileLines[idString]); + const originalLine = "- " + memoid + " " + content; + const newLine = fileLines[idString]; + const newFileContent = fileContent.replace(newLine, ""); + await vault.modify(dailyNote, newFileContent); + const deleteDate = await sendMemoToDelete(originalLine); + return deleteDate; } - return { - fromDate: fromDate ? startOfDay(fromDate) : void 0, - toDate: toDate2 ? startOfDay(toDate2) : void 0 - }; -} -var DayPickerContext = React$1.createContext(void 0); -function DayPickerProvider(props) { - var _a, _b, _c, _d, _e, _f, _g; - var children = props.children, initialProps = props.initialProps; - var locale2 = (_a = initialProps.locale) !== null && _a !== void 0 ? _a : enUS; - var numberOfMonths = (_b = initialProps.numberOfMonths) !== null && _b !== void 0 ? _b : 1; - var today = (_c = initialProps.today) !== null && _c !== void 0 ? _c : new Date(); - var _h = parseFromToProps(initialProps), fromDate = _h.fromDate, toDate2 = _h.toDate; - var captionLayout = (_d = initialProps.captionLayout) !== null && _d !== void 0 ? _d : "buttons"; - if (!fromDate && !toDate2) - captionLayout = "buttons"; - initialProps.toYear; - initialProps.fromYear; - initialProps.toMonth; - initialProps.fromMonth; - var contextProps = __rest(initialProps, ["toYear", "fromYear", "toMonth", "fromMonth"]); - var context = __assign(__assign({}, contextProps), { - captionLayout, - fromDate, - toDate: toDate2, - today, - locale: locale2, - modifierClassNames: (_e = initialProps.modifierClassNames) !== null && _e !== void 0 ? _e : {}, - modifierPrefix: "rdp-day_", - modifiers: (_f = initialProps.modifiers) !== null && _f !== void 0 ? _f : {}, - numberOfMonths, - styles: (_g = initialProps.styles) !== null && _g !== void 0 ? _g : {}, - classNames: __assign(__assign({}, defaultClassNames), initialProps.classNames), - formatters: __assign(__assign({}, formatters), initialProps.formatters), - labels: __assign(__assign({}, labels), initialProps.labels), - components: __assign({ Caption, CaptionLabel, Day, DayContent, Dropdown, Footer, Head, IconDropdown, IconRight, IconLeft, Row, WeekNumber }, initialProps.components) - }); - return React$1.createElement(DayPickerContext.Provider, { value: context }, children); } -function useDayPicker() { - var context = React$1.useContext(DayPickerContext); - if (!context) { - throw new Error("Context is not defined. useDayPicker must be used within a DayPickerProvider with a valid values."); - } - return context; -} -function getOutsideEndDays(month, options) { - var days = []; - var lastDayOfWeek = endOfWeek(month, options); - var endDiff = differenceInCalendarDays(lastDayOfWeek, month); - for (var i = 1; i <= endDiff; i++) { - var dayDate = addDays(month, i); - days.push(dayDate); - } - return days; -} -function getOutsideStartDays(month, options) { - var days = []; - var firstDayOfWeek = startOfWeek(month, options); - var startDiff = differenceInCalendarDays(month, firstDayOfWeek); - for (var i = 0; i < startDiff; i++) { - var newDay = addDays(firstDayOfWeek, i); - days.push(newDay); - } - return days; -} -function getWeeks(month, _a) { - var locale2 = _a.locale, fixedWeeks = _a.fixedWeeks; - var monthStart = startOfMonth(month); - var monthEnd = endOfMonth(month); - var diff = differenceInCalendarDays(monthEnd, monthStart); - var weeks = []; - var lastWeek = { weekNumber: 0, dates: [] }; - for (var i = 0; i <= diff; i++) { - var date = addDays(monthStart, i); - var week = getWeek(date, { locale: locale2 }); - if (lastWeek.weekNumber !== week) { - var startDays = getOutsideStartDays(date, { locale: locale2 }); - lastWeek = { weekNumber: week, dates: startDays }; - weeks.push(lastWeek); - } - lastWeek.dates.push(date); - } - var lastDay = lastWeek.dates[lastWeek.dates.length - 1]; - var endDays = getOutsideEndDays(lastDay, { locale: locale2 }); - lastWeek.dates = lastWeek.dates.concat(endDays); - if (fixedWeeks) { - var lastWeekDate = lastWeek.dates[lastWeek.dates.length - 1]; - var weeksInMonth = getWeeksInMonth(month, { locale: locale2 }); - if (weeksInMonth < 6) { - var diffDays = differenceInCalendarDays(addWeeks(lastWeekDate, 6 - weeksInMonth), lastWeekDate); - for (var i = 0; i < diffDays; i++) { - var date = addDays(lastWeekDate, i + 1); - var week = getWeek(date, { locale: locale2 }); - if (lastWeek.weekNumber !== week) { - lastWeek = { weekNumber: week, dates: [] }; - weeks.push(lastWeek); +const getAllLinesFromFile$3 = (cache) => cache.split(/\r?\n/); +const extractContentfromText = (line) => { + var _a; + let regexMatch; + if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) { + regexMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?" + DefaultMemoComposition.replace(/{TIME}/g, "(\\)?((\\d{1,2})\\:(\\d{2}))?(\\<\\/time\\>)?").replace(/{CONTENT}/g, "(.*)$"); + } else { + regexMatch = "^\\s*[\\-\\*]\\s(\\[(.{1})\\]\\s?)?(\\)?((\\d{1,2})\\:(\\d{2}))?(\\<\\/time\\>)?\\s?(.*)$"; + } + const regexMatchRe = new RegExp(regexMatch, ""); + return (_a = regexMatchRe.exec(line)) == null ? void 0 : _a[8]; +}; +async function deleteQueryForever(queryID) { + const { vault, metadataCache } = appStore.getState().dailyNotesState.app; + if (/\d{14,}/.test(queryID)) { + const filePath = getDailyNotePath(); + const absolutePath = filePath + "/" + QueryFileName + ".md"; + const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath); + if (queryFile instanceof require$$0.TFile) { + let fileContents = await vault.read(queryFile); + let fileLines = getAllLinesFromFile$2(fileContents); + if (fileLines.length === 0) { + return; + } else { + const lineNum = parseInt(queryID.slice(14)); + const line = fileLines[lineNum - 1]; + if (/^\d{14,}(.+)$/.test(line)) { + const newFileContent = fileContents.replace(line, ""); + await vault.modify(queryFile, newFileContent); } - lastWeek.dates.push(date); } + fileLines = null; + fileContents = null; } } - return weeks; } -function Table(props) { - var _a = useDayPicker(), locale2 = _a.locale, classNames = _a.classNames, styles = _a.styles, hideHead = _a.hideHead, fixedWeeks = _a.fixedWeeks, _b = _a.components, Head2 = _b.Head, Row2 = _b.Row, Footer2 = _b.Footer; - var weeks = getWeeks(props.displayMonth, { locale: locale2, fixedWeeks }); - return React$1.createElement("table", { className: classNames.table, style: styles.table, role: "grid", "aria-labelledby": props["aria-labelledby"] }, !hideHead && React$1.createElement(Head2, null), React$1.createElement("tbody", { className: classNames.tbody, style: styles.tbody }, weeks.map(function(week) { - return React$1.createElement(Row2, { displayMonth: props.displayMonth, key: week.weekNumber, dates: week.dates, weekNumber: week.weekNumber }); - })), React$1.createElement(Footer2, null)); -} -function Month(props) { +const getAllLinesFromFile$2 = (cache) => cache.split(/\r?\n/); +const pinQueryInFile = async (queryID) => { + const { metadataCache, vault } = appStore.getState().dailyNotesState.app; + if (/\d{14,}/.test(queryID)) { + const filePath = getDailyNotePath(); + const absolutePath = filePath + "/" + QueryFileName + ".md"; + const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath); + if (!(queryFile instanceof require$$0.TFile)) { + return; + } + const fileContents = await vault.read(queryFile); + const fileLines = getAllLinesFromFile$1(fileContents); + const date = require$$0.moment(); + const originalLineNum = parseInt(queryID.slice(14)); + const originalContent = fileLines[originalLineNum - 1]; + const pinnedAtDate = date.format("YYYY/MM/DD HH:mm:ss"); + let lineNum; + if (fileLines.length === 1 && fileLines[0] === "") { + lineNum = 1; + } else { + lineNum = fileLines.length + 1; + } + const pinnedAtDateID = date.format("YYYYMMDDHHmmss") + lineNum; + const newQuery = originalContent + " pinnedAt: " + pinnedAtDateID; + const newContent = fileContents.replace(originalContent, newQuery); + await vault.modify(queryFile, newContent); + return pinnedAtDate; + } +}; +const unpinQueryInFile = async (queryID) => { + const { metadataCache, vault } = appStore.getState().dailyNotesState.app; + const filePath = getDailyNotePath(); + const absolutePath = filePath + "/" + QueryFileName + ".md"; + const queryFile = metadataCache.getFirstLinkpathDest("", absolutePath); + if (!(queryFile instanceof require$$0.TFile)) { + return; + } + const fileContents = await vault.read(queryFile); + const fileLines = getAllLinesFromFile$1(fileContents); + const originalLineNum = parseInt(queryID.slice(14)); + const originalContent = fileLines[originalLineNum - 1]; + const pinnedAtString = extractPinnedAtfromText(originalContent); + const newFileContents = fileContents.replace(pinnedAtString, ""); + await vault.modify(queryFile, newFileContents); + return; +}; +const getAllLinesFromFile$1 = (cache) => cache.split(/\r?\n/); +const extractPinnedAtfromText = (line) => { var _a; - var _b = useDayPicker(), dir = _b.dir, classNames = _b.classNames, styles = _b.styles, Caption2 = _b.components.Caption; - var displayMonths = useNavigation().displayMonths; - var captionId = useId(); - var className = [classNames.month]; - var style = styles.month; - var isStart = props.displayIndex === 0; - var isEnd = props.displayIndex === displayMonths.length - 1; - var isCenter = !isStart && !isEnd; - if (dir === "rtl") { - _a = [isStart, isEnd], isEnd = _a[0], isStart = _a[1]; - } - if (isStart) { - className.push(classNames.caption_start); - style = __assign(__assign({}, style), styles.caption_start); - } - if (isEnd) { - className.push(classNames.caption_end); - style = __assign(__assign({}, style), styles.caption_end); - } - if (isCenter) { - className.push(classNames.caption_between); - style = __assign(__assign({}, style), styles.caption_between); - } - return React$1.createElement("div", { key: props.displayIndex, className: className.join(" "), style }, React$1.createElement(Caption2, { id: captionId, displayMonth: props.displayMonth }), React$1.createElement(Table, { "aria-labelledby": captionId, displayMonth: props.displayMonth })); -} -function Root() { - var _a = useDayPicker(), dir = _a.dir, className = _a.className, classNames = _a.classNames, style = _a.style, styles = _a.styles, numberOfMonths = _a.numberOfMonths, showWeekNumber = _a.showWeekNumber, initialFocus = _a.initialFocus; - var _b = useFocus(), focusTarget = _b.focusTarget, focus = _b.focus; - var _c = React$1.useState(false), hasInitialFocus = _c[0], setHasInitialFocus = _c[1]; - var displayMonths = useNavigation().displayMonths; - var rootClassNames = [className !== null && className !== void 0 ? className : classNames.root]; - if (numberOfMonths > 1) { - rootClassNames.push(classNames.multiple_months); - } - if (showWeekNumber) { - rootClassNames.push(classNames.with_weeknumber); - } - React$1.useEffect(function() { - if (initialFocus && !hasInitialFocus && focusTarget) { - focus(focusTarget); - setHasInitialFocus(true); - } - }, [initialFocus, hasInitialFocus, focus, focusTarget]); - return React$1.createElement("div", { className: rootClassNames.join(" "), style: __assign(__assign({}, styles.root), style), dir }, React$1.createElement("div", { className: classNames.months, style: styles.months }, displayMonths.map(function(month, i) { - return React$1.createElement(Month, { key: i, displayIndex: i, displayMonth: month }); - }))); -} -function RootProvider(props) { - var children = props.children, initialProps = __rest(props, ["children"]); - return React$1.createElement(DayPickerProvider, { initialProps }, React$1.createElement(NavigationProvider, null, React$1.createElement(SelectSingleProvider, { initialProps }, React$1.createElement(SelectMultipleProvider, { initialProps }, React$1.createElement(SelectRangeProvider, { initialProps }, React$1.createElement(ModifiersProvider, null, React$1.createElement(FocusProvider, null, children))))))); -} -function DayPicker(props) { - return React$1.createElement(RootProvider, __assign({}, props), React$1.createElement(Root, null)); -} -var fromEntries = function fromEntries2(entries) { - return entries.reduce(function(acc, _ref) { - var key = _ref[0], value = _ref[1]; - acc[key] = value; - return acc; - }, {}); + return (_a = /^(\d{14})(\d{1,})\s(.+)\s(\[(.+)\])(\spinnedAt: (\d{14,}))$/.exec(line)) == null ? void 0 : _a[6]; }; -var useIsomorphicLayoutEffect = typeof window !== "undefined" && window.document && window.document.createElement ? _react_17_0_2_react.exports.useLayoutEffect : _react_17_0_2_react.exports.useEffect; -var top = "top"; -var bottom = "bottom"; -var right = "right"; -var left = "left"; -var auto = "auto"; -var basePlacements = [top, bottom, right, left]; -var start = "start"; -var end = "end"; -var clippingParents = "clippingParents"; -var viewport = "viewport"; -var popper = "popper"; -var reference = "reference"; -var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) { - return acc.concat([placement + "-" + start, placement + "-" + end]); -}, []); -var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) { - return acc.concat([placement, placement + "-" + start, placement + "-" + end]); -}, []); -var beforeRead = "beforeRead"; -var read = "read"; -var afterRead = "afterRead"; -var beforeMain = "beforeMain"; -var main = "main"; -var afterMain = "afterMain"; -var beforeWrite = "beforeWrite"; -var write = "write"; -var afterWrite = "afterWrite"; -var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; -function getNodeName(element) { - return element ? (element.nodeName || "").toLowerCase() : null; -} -function getWindow(node) { - if (node == null) { - return window; +var api; +((api2) => { + function getUserInfo() { } - if (node.toString() !== "[object Window]") { - var ownerDocument = node.ownerDocument; - return ownerDocument ? ownerDocument.defaultView || window : window; + api2.getUserInfo = getUserInfo; + function checkUsernameUsable(username) { } - return node; -} -function isElement(node) { - var OwnElement = getWindow(node).Element; - return node instanceof OwnElement || node instanceof Element; -} -function isHTMLElement(node) { - var OwnElement = getWindow(node).HTMLElement; - return node instanceof OwnElement || node instanceof HTMLElement; -} -function isShadowRoot(node) { - if (typeof ShadowRoot === "undefined") { - return false; + api2.checkUsernameUsable = checkUsernameUsable; + function checkPasswordValid(password) { } - var OwnElement = getWindow(node).ShadowRoot; - return node instanceof OwnElement || node instanceof ShadowRoot; -} -function applyStyles(_ref) { - var state = _ref.state; - Object.keys(state.elements).forEach(function(name) { - var style = state.styles[name] || {}; - var attributes = state.attributes[name] || {}; - var element = state.elements[name]; - if (!isHTMLElement(element) || !getNodeName(element)) { - return; - } - Object.assign(element.style, style); - Object.keys(attributes).forEach(function(name2) { - var value = attributes[name2]; - if (value === false) { - element.removeAttribute(name2); - } else { - element.setAttribute(name2, value === true ? "" : value); - } - }); - }); -} -function effect$2(_ref2) { - var state = _ref2.state; - var initialStyles = { - popper: { - position: state.options.strategy, - left: "0", - top: "0", - margin: "0" - }, - arrow: { - position: "absolute" - }, - reference: {} - }; - Object.assign(state.elements.popper.style, initialStyles.popper); - state.styles = initialStyles; - if (state.elements.arrow) { - Object.assign(state.elements.arrow.style, initialStyles.arrow); + api2.checkPasswordValid = checkPasswordValid; + function updateUserinfo(userinfo) { } - return function() { - Object.keys(state.elements).forEach(function(name) { - var element = state.elements[name]; - var attributes = state.attributes[name] || {}; - var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); - var style = styleProperties.reduce(function(style2, property) { - style2[property] = ""; - return style2; - }, {}); - if (!isHTMLElement(element) || !getNodeName(element)) { - return; - } - Object.assign(element.style, style); - Object.keys(attributes).forEach(function(attribute) { - element.removeAttribute(attribute); - }); - }); - }; -} -var applyStyles$1 = { - name: "applyStyles", - enabled: true, - phase: "write", - fn: applyStyles, - effect: effect$2, - requires: ["computeStyles"] -}; -function getBasePlacement(placement) { - return placement.split("-")[0]; -} -var max = Math.max; -var min = Math.min; -var round = Math.round; -function getBoundingClientRect(element, includeScale) { - if (includeScale === void 0) { - includeScale = false; + api2.updateUserinfo = updateUserinfo; + async function getMyMemos() { + return await getMemos(); } - var rect = element.getBoundingClientRect(); - var scaleX = 1; - var scaleY = 1; - if (isHTMLElement(element) && includeScale) { - var offsetHeight = element.offsetHeight; - var offsetWidth = element.offsetWidth; - if (offsetWidth > 0) { - scaleX = round(rect.width) / offsetWidth || 1; - } - if (offsetHeight > 0) { - scaleY = round(rect.height) / offsetHeight || 1; - } + api2.getMyMemos = getMyMemos; + function getMyDeletedMemos() { + return getDeletedMemos(); } - return { - width: rect.width / scaleX, - height: rect.height / scaleY, - top: rect.top / scaleY, - right: rect.right / scaleX, - bottom: rect.bottom / scaleY, - left: rect.left / scaleX, - x: rect.left / scaleX, - y: rect.top / scaleY - }; -} -function getLayoutRect(element) { - var clientRect = getBoundingClientRect(element); - var width = element.offsetWidth; - var height = element.offsetHeight; - if (Math.abs(clientRect.width - width) <= 1) { - width = clientRect.width; + api2.getMyDeletedMemos = getMyDeletedMemos; + function hideMemo(memoId) { + return obHideMemo(memoId); + } + api2.hideMemo = hideMemo; + function restoreMemo(memoId) { + return restoreDeletedMemo(memoId); + } + api2.restoreMemo = restoreMemo; + function deleteMemo(memoId) { + return deleteForever(memoId); + } + api2.deleteMemo = deleteMemo; + function getMyQueries() { + return findQuery(); + } + api2.getMyQueries = getMyQueries; + function createQuery(title, querystring) { + return createObsidianQuery(title, querystring); + } + api2.createQuery = createQuery; + function updateQuery(queryId, title, querystring) { + return updateObsidianQuery(queryId, title, querystring); + } + api2.updateQuery = updateQuery; + function deleteQueryById(queryId) { + return deleteQueryForever(queryId); + } + api2.deleteQueryById = deleteQueryById; + function pinQuery(queryId) { + return pinQueryInFile(queryId); + } + api2.pinQuery = pinQuery; + function unpinQuery(queryId) { + return unpinQueryInFile(queryId); + } + api2.unpinQuery = unpinQuery; +})(api || (api = {})); +var api$1 = api; +async function changeMemo(memoid, originalContent, content, memoType, path) { + const { dailyNotes } = dailyNotesService.getState(); + const { vault, metadataCache } = appStore.getState().dailyNotesState.app; + const timeString = memoid.slice(0, 14); + const idString = parseInt(memoid.slice(14)); + let changeDate; + if (/^\d{14}/g.test(content)) { + changeDate = require$$0.moment(content.slice(0, 14), "YYYYMMDDHHmmss"); + } else { + changeDate = require$$0.moment(timeString, "YYYYMMDDHHmmss"); } - if (Math.abs(clientRect.height - height) <= 1) { - height = clientRect.height; + let file; + if (path !== void 0) { + file = metadataCache.getFirstLinkpathDest("", path); + } else { + file = getDailyNote_1(changeDate, dailyNotes); } + const fileContent = await vault.read(file); + const fileLines = getAllLinesFromFile(fileContent); + const removeEnter = content.replace(/\n/g, "
"); + const originalLine = fileLines[idString]; + const newLine = fileLines[idString].replace(originalContent, removeEnter); + const newFileContent = fileContent.replace(originalLine, newLine); + await vault.modify(file, newFileContent); return { - x: element.offsetLeft, - y: element.offsetTop, - width, - height + id: memoid, + content: removeEnter, + deletedAt: "", + createdAt: changeDate.format("YYYY/MM/DD HH:mm:ss"), + updatedAt: changeDate.format("YYYY/MM/DD HH:mm:ss"), + memoType, + path: file.path }; } -function contains(parent, child) { - var rootNode = child.getRootNode && child.getRootNode(); - if (parent.contains(child)) { - return true; - } else if (rootNode && isShadowRoot(rootNode)) { - var next = child; - do { - if (next && parent.isSameNode(next)) { - return true; - } - next = next.parentNode || next.host; - } while (next); - } - return false; -} -function getComputedStyle$1(element) { - return getWindow(element).getComputedStyle(element); -} -function isTableElement(element) { - return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0; -} -function getDocumentElement(element) { - return ((isElement(element) ? element.ownerDocument : element.document) || window.document).documentElement; -} -function getParentNode(element) { - if (getNodeName(element) === "html") { - return element; - } - return element.assignedSlot || element.parentNode || (isShadowRoot(element) ? element.host : null) || getDocumentElement(element); -} -function getTrueOffsetParent(element) { - if (!isHTMLElement(element) || getComputedStyle$1(element).position === "fixed") { - return null; +const getAllLinesFromFile = (cache) => cache.split(/\r?\n/); +async function commentMemo(MemoContent, isList2, path, oriID, hasID) { + var _a, _b; + const { vault, metadataCache } = appStore.getState().dailyNotesState.app === void 0 ? app : appStore.getState().dailyNotesState.app; + const removeEnter = MemoContent.replace(/\n/g, "
"); + if (path === void 0) { + return; } - return element.offsetParent; -} -function getContainingBlock(element) { - var isFirefox = navigator.userAgent.toLowerCase().indexOf("firefox") !== -1; - var isIE = navigator.userAgent.indexOf("Trident") !== -1; - if (isIE && isHTMLElement(element)) { - var elementCss = getComputedStyle$1(element); - if (elementCss.position === "fixed") { - return null; + const file = metadataCache.getFirstLinkpathDest("", path); + const time = require$$0.moment(); + const formatTime = time.format("YYYYMMDDHHmmss"); + const ID = oriID.slice(14); + const indent = " "; + const newContent = formatTime + " " + removeEnter.trim(); + const newLineContent = indent + "- " + formatTime + " " + removeEnter.trim(); + if (file) { + let underComments; + if (CommentOnMemos && CommentsInOriginalNotes) { + const dataviewAPI = getAPI_1(); + if (dataviewAPI !== void 0) { + try { + underComments = (_b = (_a = dataviewAPI.page(file.path)) == null ? void 0 : _a.file.lists.values) == null ? void 0 : _b.filter((item) => item.line === parseInt(ID)); + } catch (e) { + console.error(e); + } + } } - } - var currentNode = getParentNode(element); - while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) { - var css = getComputedStyle$1(currentNode); - if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") { - return currentNode; + const fileContents = await vault.read(file); + let endLine = 0; + if (underComments[0].children.values.length > 0) { + endLine = underComments[0].children.values[underComments[0].children.values.length - 1].line; } else { - currentNode = currentNode.parentNode; + endLine = underComments[0].line; + } + const newFileContent = await insertTextAfterPositionInBody(newLineContent, fileContents, endLine); + await vault.modify(file, newFileContent.content); + if (isList2) { + return { + id: formatTime + (endLine + 1), + content: newContent, + deletedAt: "", + createdAt: time.format("YYYY/MM/DD HH:mm:ss"), + updatedAt: time.format("YYYY/MM/DD HH:mm:ss"), + memoType: "JOURNAL", + path: file.path, + hasId: "", + linkId: hasID + }; } } - return null; } -function getOffsetParent(element) { - var window2 = getWindow(element); - var offsetParent = getTrueOffsetParent(element); - while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === "static") { - offsetParent = getTrueOffsetParent(offsetParent); +async function insertTextAfterPositionInBody(text, body, pos) { + if (pos === -1) { + return { + content: `${body} +${text}`, + posNum: -1 + }; } - if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle$1(offsetParent).position === "static")) { - return window2; + const splitContent = body.split("\n"); + const pre = splitContent.slice(0, pos + 1).join("\n"); + const post = splitContent.slice(pos + 1).join("\n"); + if (/^\s*$/g.test(splitContent[pos + 1])) { + return { + content: `${pre} +${text} +${post}`, + posNum: pos + }; } - return offsetParent || getContainingBlock(element) || window2; -} -function getMainAxisFromPlacement(placement) { - return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y"; -} -function within(min$1, value, max$1) { - return max(min$1, min(value, max$1)); -} -function withinMaxClamp(min2, value, max2) { - var v2 = within(min2, value, max2); - return v2 > max2 ? max2 : v2; -} -function getFreshSideObject() { return { - top: 0, - right: 0, - bottom: 0, - left: 0 + content: `${pre} +${text} +${post}`, + posNum: pos }; } -function mergePaddingObject(paddingObject) { - return Object.assign({}, getFreshSideObject(), paddingObject); -} -function expandToHashMap(value, keys) { - return keys.reduce(function(hashMap, key) { - hashMap[key] = value; - return hashMap; - }, {}); -} -var toPaddingObject = function toPaddingObject2(padding, state) { - padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, { - placement: state.placement - })) : padding; - return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); -}; -function arrow(_ref) { - var _state$modifiersData$; - var state = _ref.state, name = _ref.name, options = _ref.options; - var arrowElement = state.elements.arrow; - var popperOffsets2 = state.modifiersData.popperOffsets; - var basePlacement = getBasePlacement(state.placement); - var axis = getMainAxisFromPlacement(basePlacement); - var isVertical = [left, right].indexOf(basePlacement) >= 0; - var len = isVertical ? "height" : "width"; - if (!arrowElement || !popperOffsets2) { - return; +class MemoService { + constructor() { + __publicField(this, "initialized", false); } - var paddingObject = toPaddingObject(options.padding, state); - var arrowRect = getLayoutRect(arrowElement); - var minProp = axis === "y" ? top : left; - var maxProp = axis === "y" ? bottom : right; - var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len]; - var startDiff = popperOffsets2[axis] - state.rects.reference[axis]; - var arrowOffsetParent = getOffsetParent(arrowElement); - var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; - var centerToReference = endDiff / 2 - startDiff / 2; - var min2 = paddingObject[minProp]; - var max2 = clientSize - arrowRect[len] - paddingObject[maxProp]; - var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; - var offset2 = within(min2, center, max2); - var axisProp = axis; - state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$); -} -function effect$1(_ref2) { - var state = _ref2.state, options = _ref2.options; - var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element; - if (arrowElement == null) { - return; + getState() { + return appStore.getState().memoState; } - if (typeof arrowElement === "string") { - arrowElement = state.elements.popper.querySelector(arrowElement); - if (!arrowElement) { - return; + async fetchAllMemos() { + const data = await api$1.getMyMemos(); + const memos = []; + const commentMemos = []; + for (const m2 of data.memos) { + memos.push(m2); } + for (const m2 of data.commentMemos) { + commentMemos.push(m2); + } + appStore.dispatch({ + type: "SET_MEMOS", + payload: { + memos + } + }); + appStore.dispatch({ + type: "SET_COMMENT_MEMOS", + payload: { + commentMemos + } + }); + if (!this.initialized) { + this.initialized = true; + } + return memos; } - if (!contains(state.elements.popper, arrowElement)) { - return; - } - state.elements.arrow = arrowElement; -} -var arrow$1 = { - name: "arrow", - enabled: true, - phase: "main", - fn: arrow, - effect: effect$1, - requires: ["popperOffsets"], - requiresIfExists: ["preventOverflow"] -}; -function getVariation(placement) { - return placement.split("-")[1]; -} -var unsetSides = { - top: "auto", - right: "auto", - bottom: "auto", - left: "auto" -}; -function roundOffsetsByDPR(_ref) { - var x2 = _ref.x, y2 = _ref.y; - var win = window; - var dpr = win.devicePixelRatio || 1; - return { - x: round(x2 * dpr) / dpr || 0, - y: round(y2 * dpr) / dpr || 0 - }; -} -function mapToStyles(_ref2) { - var _Object$assign2; - var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed; - var _offsets$x = offsets.x, x2 = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y2 = _offsets$y === void 0 ? 0 : _offsets$y; - var _ref3 = typeof roundOffsets === "function" ? roundOffsets({ - x: x2, - y: y2 - }) : { - x: x2, - y: y2 - }; - x2 = _ref3.x; - y2 = _ref3.y; - var hasX = offsets.hasOwnProperty("x"); - var hasY = offsets.hasOwnProperty("y"); - var sideX = left; - var sideY = top; - var win = window; - if (adaptive) { - var offsetParent = getOffsetParent(popper2); - var heightProp = "clientHeight"; - var widthProp = "clientWidth"; - if (offsetParent === getWindow(popper2)) { - offsetParent = getDocumentElement(popper2); - if (getComputedStyle$1(offsetParent).position !== "static" && position === "absolute") { - heightProp = "scrollHeight"; - widthProp = "scrollWidth"; + async fetchDeletedMemos() { + const data = await api$1.getMyDeletedMemos(); + data.sort((a, b) => utils$1.getTimeStampByDate(b.deletedAt) - utils$1.getTimeStampByDate(a.deletedAt)); + return data; + } + pushMemo(memo2) { + appStore.dispatch({ + type: "INSERT_MEMO", + payload: { + memo: __spreadValues({}, memo2) + } + }); + } + pushCommentMemo(memo2) { + appStore.dispatch({ + type: "INSERT_COMMENT_MEMO", + payload: { + memo: __spreadValues({}, memo2) + } + }); + } + getMemoById(id2) { + for (const m2 of this.getState().memos) { + if (m2.id === id2) { + return m2; } } - offsetParent = offsetParent; - if (placement === top || (placement === left || placement === right) && variation === end) { - sideY = bottom; - var offsetY = isFixed && win.visualViewport ? win.visualViewport.height : offsetParent[heightProp]; - y2 -= offsetY - popperRect.height; - y2 *= gpuAcceleration ? 1 : -1; - } - if (placement === left || (placement === top || placement === bottom) && variation === end) { - sideX = right; - var offsetX = isFixed && win.visualViewport ? win.visualViewport.width : offsetParent[widthProp]; - x2 -= offsetX - popperRect.width; - x2 *= gpuAcceleration ? 1 : -1; + return null; + } + getCommentMemoById(id2) { + for (const m2 of this.getState().commentMemos) { + if (m2.id === id2) { + return m2; + } } + return null; } - var commonStyles = Object.assign({ - position - }, adaptive && unsetSides); - var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ - x: x2, - y: y2 - }) : { - x: x2, - y: y2 - }; - x2 = _ref4.x; - y2 = _ref4.y; - if (gpuAcceleration) { - var _Object$assign; - return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x2 + "px, " + y2 + "px)" : "translate3d(" + x2 + "px, " + y2 + "px, 0)", _Object$assign)); + async hideMemoById(id2) { + await api$1.hideMemo(id2); + appStore.dispatch({ + type: "DELETE_MEMO_BY_ID", + payload: { + id: id2 + } + }); } - return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y2 + "px" : "", _Object$assign2[sideX] = hasX ? x2 + "px" : "", _Object$assign2.transform = "", _Object$assign2)); -} -function computeStyles(_ref5) { - var state = _ref5.state, options = _ref5.options; - var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; - var commonStyles = { - placement: getBasePlacement(state.placement), - variation: getVariation(state.placement), - popper: state.elements.popper, - popperRect: state.rects.popper, - gpuAcceleration, - isFixed: state.options.strategy === "fixed" - }; - if (state.modifiersData.popperOffsets != null) { - state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { - offsets: state.modifiersData.popperOffsets, - position: state.options.strategy, - adaptive, - roundOffsets - }))); + async restoreMemoById(id2) { + await api$1.restoreMemo(id2); } - if (state.modifiersData.arrow != null) { - state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { - offsets: state.modifiersData.arrow, - position: "absolute", - adaptive: false, - roundOffsets - }))); + async deleteMemoById(id2) { + await api$1.deleteMemo(id2); } - state.attributes.popper = Object.assign({}, state.attributes.popper, { - "data-popper-placement": state.placement - }); -} -var computeStyles$1 = { - name: "computeStyles", - enabled: true, - phase: "beforeWrite", - fn: computeStyles, - data: {} -}; -var passive = { - passive: true -}; -function effect(_ref) { - var state = _ref.state, instance = _ref.instance, options = _ref.options; - var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize; - var window2 = getWindow(state.elements.popper); - var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); - if (scroll) { - scrollParents.forEach(function(scrollParent) { - scrollParent.addEventListener("scroll", instance.update, passive); + editMemo(memo2) { + appStore.dispatch({ + type: "EDIT_MEMO", + payload: memo2 }); } - if (resize) { - window2.addEventListener("resize", instance.update, passive); + editCommentMemo(memo2) { + appStore.dispatch({ + type: "EDIT_COMMENT_MEMO", + payload: memo2 + }); } - return function() { - if (scroll) { - scrollParents.forEach(function(scrollParent) { - scrollParent.removeEventListener("scroll", instance.update, passive); + updateTagsState() { + var _a, _b, _c; + const { memos } = this.getState(); + const tagsSet = /* @__PURE__ */ new Set(); + const tempTags = /* @__PURE__ */ new Set(); + const tags = []; + for (const m2 of memos) { + for (const t2 of Array.from((_a = m2.content.match(TAG_REG)) != null ? _a : [])) { + tagsSet.add(t2.replace(TAG_REG, "$1").trim()); + tempTags.add(t2.replace(TAG_REG, "$1").trim()); + } + for (const t2 of Array.from((_b = m2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) { + tagsSet.add(t2.replace(NOP_FIRST_TAG_REG, "$1").trim()); + tempTags.add(t2.replace(NOP_FIRST_TAG_REG, "$1").trim()); + } + for (const t2 of Array.from((_c = m2.content.match(FIRST_TAG_REG)) != null ? _c : [])) { + tagsSet.add(t2.replace(FIRST_TAG_REG, "$2").trim()); + tempTags.add(t2.replace(FIRST_TAG_REG, "$2").trim()); + } + Array.from(tempTags).forEach((t2) => { + tags.push(t2); }); + tempTags.clear(); } - if (resize) { - window2.removeEventListener("resize", instance.update, passive); - } - }; -} -var eventListeners = { - name: "eventListeners", - enabled: true, - phase: "write", - fn: function fn() { - }, - effect, - data: {} -}; -var hash$1 = { - left: "right", - right: "left", - bottom: "top", - top: "bottom" -}; -function getOppositePlacement(placement) { - return placement.replace(/left|right|bottom|top/g, function(matched) { - return hash$1[matched]; - }); -} -var hash = { - start: "end", - end: "start" -}; -function getOppositeVariationPlacement(placement) { - return placement.replace(/start|end/g, function(matched) { - return hash[matched]; - }); -} -function getWindowScroll(node) { - var win = getWindow(node); - var scrollLeft = win.pageXOffset; - var scrollTop = win.pageYOffset; - return { - scrollLeft, - scrollTop - }; -} -function getWindowScrollBarX(element) { - return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; + const counts = {}; + tags.forEach(function(x2) { + counts[x2] = (counts[x2] || 0) + 1; + }); + appStore.dispatch({ + type: "SET_TAGS", + payload: { + tags: Array.from(tagsSet), + tagsNum: counts + } + }); + } + clearMemos() { + appStore.dispatch({ + type: "SET_MEMOS", + payload: { + memos: [] + } + }); + } + async getLinkedMemos(memoId) { + const { memos } = this.getState(); + return memos.filter((m2) => m2.content.includes(memoId)); + } + async getCommentMemos(memoId) { + const { memos } = this.getState(); + return memos.filter((m2) => m2.content.includes("comment: " + memoId)); + } + async createMemo(text, isTASK) { + const memo2 = await waitForInsert(text, isTASK); + return memo2; + } + async createCommentMemo(text, isList2, path, ID, hasID) { + const memo2 = await commentMemo(text, isList2, path, ID, hasID); + return memo2; + } + async importMemos(text, isList2, date) { + const memo2 = await waitForInsert(text, isList2, date); + return memo2; + } + async updateMemo(memoId, originalText, text, type, path) { + const memo2 = await changeMemo(memoId, originalText, text, type, path); + return memo2; + } } -function getViewportRect(element) { - var win = getWindow(element); - var html = getDocumentElement(element); - var visualViewport = win.visualViewport; - var width = html.clientWidth; - var height = html.clientHeight; - var x2 = 0; - var y2 = 0; - if (visualViewport) { - width = visualViewport.width; - height = visualViewport.height; - if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { - x2 = visualViewport.offsetLeft; - y2 = visualViewport.offsetTop; +const memoService = new MemoService(); +class QueryService { + getState() { + return appStore.getState().queryState; + } + async getMyAllQueries() { + const data = await api$1.getMyQueries(); + appStore.dispatch({ + type: "SET_QUERIES", + payload: { + queries: data + } + }); + return data; + } + getQueryById(id2) { + for (const q2 of this.getState().queries) { + if (q2.id === id2) { + return q2; + } } } - return { - width, - height, - x: x2 + getWindowScrollBarX(element), - y: y2 - }; -} -function getDocumentRect(element) { - var _element$ownerDocumen; - var html = getDocumentElement(element); - var winScroll = getWindowScroll(element); - var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; - var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); - var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); - var x2 = -winScroll.scrollLeft + getWindowScrollBarX(element); - var y2 = -winScroll.scrollTop; - if (getComputedStyle$1(body || html).direction === "rtl") { - x2 += max(html.clientWidth, body ? body.clientWidth : 0) - width; + pushQuery(query) { + appStore.dispatch({ + type: "INSERT_QUERY", + payload: { + query: __spreadValues({}, query) + } + }); + } + editQuery(query) { + appStore.dispatch({ + type: "UPDATE_QUERY", + payload: query + }); } - return { - width, - height, - x: x2, - y: y2 - }; -} -function isScrollParent(element) { - var _getComputedStyle = getComputedStyle$1(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY; - return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); -} -function getScrollParent(node) { - if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) { - return node.ownerDocument.body; + async deleteQuery(queryId) { + await api$1.deleteQueryById(queryId); + appStore.dispatch({ + type: "DELETE_QUERY_BY_ID", + payload: { + id: queryId + } + }); } - if (isHTMLElement(node) && isScrollParent(node)) { - return node; + async createQuery(title, querystring) { + const data = await api$1.createQuery(title, querystring); + return data; } - return getScrollParent(getParentNode(node)); -} -function listScrollParents(element, list) { - var _element$ownerDocumen; - if (list === void 0) { - list = []; + async updateQuery(queryId, title, querystring) { + const data = await api$1.updateQuery(queryId, title, querystring); + return data; } - var scrollParent = getScrollParent(element); - var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); - var win = getWindow(scrollParent); - var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; - var updatedList = list.concat(target); - return isBody ? updatedList : updatedList.concat(listScrollParents(getParentNode(target))); -} -function rectToClientRect(rect) { - return Object.assign({}, rect, { - left: rect.x, - top: rect.y, - right: rect.x + rect.width, - bottom: rect.y + rect.height - }); -} -function getInnerBoundingClientRect(element) { - var rect = getBoundingClientRect(element); - rect.top = rect.top + element.clientTop; - rect.left = rect.left + element.clientLeft; - rect.bottom = rect.top + element.clientHeight; - rect.right = rect.left + element.clientWidth; - rect.width = element.clientWidth; - rect.height = element.clientHeight; - rect.x = rect.left; - rect.y = rect.top; - return rect; -} -function getClientRectFromMixedType(element, clippingParent) { - return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element))); -} -function getClippingParents(element) { - var clippingParents2 = listScrollParents(getParentNode(element)); - var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle$1(element).position) >= 0; - var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; - if (!isElement(clipperElement)) { - return []; + async pinQuery(queryId) { + await api$1.pinQuery(queryId); + } + async unpinQuery(queryId) { + await api$1.unpinQuery(queryId); } - return clippingParents2.filter(function(clippingParent) { - return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body"; - }); -} -function getClippingRect(element, boundary, rootBoundary) { - var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary); - var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]); - var firstClippingParent = clippingParents2[0]; - var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) { - var rect = getClientRectFromMixedType(element, clippingParent); - accRect.top = max(rect.top, accRect.top); - accRect.right = min(rect.right, accRect.right); - accRect.bottom = min(rect.bottom, accRect.bottom); - accRect.left = max(rect.left, accRect.left); - return accRect; - }, getClientRectFromMixedType(element, firstClippingParent)); - clippingRect.width = clippingRect.right - clippingRect.left; - clippingRect.height = clippingRect.bottom - clippingRect.top; - clippingRect.x = clippingRect.left; - clippingRect.y = clippingRect.top; - return clippingRect; } -function computeOffsets(_ref) { - var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement; - var basePlacement = placement ? getBasePlacement(placement) : null; - var variation = placement ? getVariation(placement) : null; - var commonX = reference2.x + reference2.width / 2 - element.width / 2; - var commonY = reference2.y + reference2.height / 2 - element.height / 2; - var offsets; - switch (basePlacement) { - case top: - offsets = { - x: commonX, - y: reference2.y - element.height - }; - break; - case bottom: - offsets = { - x: commonX, - y: reference2.y + reference2.height - }; - break; - case right: - offsets = { - x: reference2.x + reference2.width, - y: commonY - }; - break; - case left: - offsets = { - x: reference2.x - element.width, - y: commonY - }; - break; - default: - offsets = { - x: reference2.x, - y: reference2.y - }; +const queryService = new QueryService(); +class ResourceService { + async upload(file) { + const { vault, fileManager } = appStore.getState().dailyNotesState.app; + const fileArray = await file.arrayBuffer(); + const ext = getExt(file.type); + const dailyNotes = getAllDailyNotes_1(); + const date = require$$0.moment(); + const existingFile = getDailyNote_1(date, dailyNotes); + let newFile; + if (!existingFile) { + const dailyFile = await createDailyNote_1(date); + newFile = await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, dailyFile), fileArray); + } else if (existingFile instanceof require$$0.TFile) { + newFile = await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, existingFile), fileArray); + } + return fileManager.generateMarkdownLink(newFile, newFile.path, "", ""); } - var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; - if (mainAxis != null) { - var len = mainAxis === "y" ? "height" : "width"; - switch (variation) { - case start: - offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2); - break; - case end: - offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2); - break; + async parseHtml(html) { + const output = await html.text(); + const el = document.createElement("html"); + el.innerHTML = output; + const elementsByClassName = el.getElementsByClassName("memo"); + for (let i = 0; i < elementsByClassName.length; i++) { + const source = elementsByClassName[i].getElementsByClassName("content")[0].innerHTML.replace(/\s{16}?

<\/p>/g, "").replace(/\s{16}?

/g, "").replace(/<\/p>/g, "").replace(//g, "**").replace(/<\/strong>/g, "**").replace(/^\s{16}/g, ""); + const importedMemo = await memoService.importMemos(source, true, require$$0.moment(elementsByClassName[i].getElementsByClassName("time")[0].innerHTML)); + memoService.pushMemo(importedMemo); } } - return offsets; } -function detectOverflow(state, options) { - if (options === void 0) { - options = {}; - } - var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding; - var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); - var altContext = elementContext === popper ? reference : popper; - var popperRect = state.rects.popper; - var element = state.elements[altBoundary ? altContext : elementContext]; - var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary); - var referenceClientRect = getBoundingClientRect(state.elements.reference); - var popperOffsets2 = computeOffsets({ - reference: referenceClientRect, - element: popperRect, - strategy: "absolute", - placement +const getExt = (line) => { + var _a; + return (_a = /^image\/(.+)$/.exec(line)) == null ? void 0 : _a[1]; +}; +const resourceService = new ResourceService(); +var dialog = ""; +const BaseDialog = (props) => { + const { + children, + className, + clickSpaceDestroy, + destroy + } = props; + const handleSpaceClicked = () => { + if (clickSpaceDestroy) { + destroy(); + } + }; + const handleEscClicked = (e) => { + const { + key + } = e; + if (key === "Escape") { + destroy(); + } + }; + return /* @__PURE__ */ jsx("div", { + className: `dialog-wrapper ${className}`, + onClick: handleSpaceClicked, + onKeyPress: handleEscClicked, + children: /* @__PURE__ */ jsx("div", { + className: "dialog-container", + onClick: (e) => e.stopPropagation(), + children + }) }); - var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2)); - var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; - var overflowOffsets = { - top: clippingClientRect.top - elementClientRect.top + paddingObject.top, - bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, - left: clippingClientRect.left - elementClientRect.left + paddingObject.left, - right: elementClientRect.right - clippingClientRect.right + paddingObject.right +}; +function showDialog(config, DialogComponent, props) { + const tempDiv = document.createElement("div"); + document.body.append(tempDiv); + setTimeout(() => { + var _a; + (_a = tempDiv.firstElementChild) == null ? void 0 : _a.classList.add("showup"); + }, 0); + const cbs = { + destroy: () => { + var _a, _b; + (_a = tempDiv.firstElementChild) == null ? void 0 : _a.classList.remove("showup"); + (_b = tempDiv.firstElementChild) == null ? void 0 : _b.classList.add("showoff"); + setTimeout(() => { + tempDiv.remove(); + ReactDOM.unmountComponentAtNode(tempDiv); + }, ANIMATION_DURATION); + } }; - var offsetData = state.modifiersData.offset; - if (elementContext === popper && offsetData) { - var offset2 = offsetData[placement]; - Object.keys(overflowOffsets).forEach(function(key) { - var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; - var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x"; - overflowOffsets[key] += offset2[axis] * multiply; + const dialogProps = __spreadProps(__spreadValues({}, props), { + destroy: cbs.destroy + }); + let Fragment2 = /* @__PURE__ */ jsx(BaseDialog, __spreadProps(__spreadValues({ + destroy: cbs.destroy, + clickSpaceDestroy: true + }, config), { + children: /* @__PURE__ */ jsx(DialogComponent, __spreadValues({}, dialogProps)) + })); + if (config.useAppContext) { + Fragment2 = /* @__PURE__ */ jsx(Provider, { + store: appStore, + context: appContext, + children: Fragment2 }); } - return overflowOffsets; + ReactDOM.render(Fragment2, tempDiv); + return cbs; } -function computeAutoPlacement(state, options) { - if (options === void 0) { - options = {}; - } - var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; - var variation = getVariation(placement); - var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) { - return getVariation(placement2) === variation; - }) : basePlacements; - var allowedPlacements = placements$1.filter(function(placement2) { - return allowedAutoPlacements.indexOf(placement2) >= 0; +var aboutSiteDialog = ""; +function SvgClose(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + xmlns: "http://www.w3.org/2000/svg", + height: "24px", + viewBox: "0 0 24 24", + width: "24px", + fill: "#37352f" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M0 0h24v24H0V0z", + fill: "none" + }), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z" + })); +} +const AboutSiteDialog = ({ + destroy +}) => { + const handleCloseBtnClick = () => { + destroy(); + }; + return /* @__PURE__ */ jsxs(Fragment, { + children: [/* @__PURE__ */ jsxs("div", { + className: "dialog-header-container", + children: [/* @__PURE__ */ jsxs("p", { + className: "title-text", + children: [/* @__PURE__ */ jsx("span", { + className: "icon-text", + children: "\u{1F920}" + }), "About ", /* @__PURE__ */ jsx("b", { + children: "Obsidian-Memos" + })] + }), /* @__PURE__ */ jsx("button", { + className: "btn close-btn", + onClick: handleCloseBtnClick, + children: /* @__PURE__ */ jsx(SvgClose, { + className: "icon-img" + }) + })] + }), /* @__PURE__ */ jsxs("div", { + className: "dialog-content-container", + children: ["Hi, I am Quorafind(Boninall), if you are interested in this project, please support my work and enthusiasm by buying me a coffee on ", /* @__PURE__ */ jsx("a", { + href: "https://www.buymeacoffee.com/boninall", + children: "https://www.buymeacoffee.com/boninall" + }), /* @__PURE__ */ jsx("a", { + href: "https://www.buymeacoffee.com/boninall", + children: /* @__PURE__ */ jsx("img", { + src: `https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=&slug=boninall&button_colour=6495ED&font_colour=ffffff&font_family=Lato&outline_colour=000000&coffee_colour=FFDD00` + }) + }), /* @__PURE__ */ jsx("br", {}), /* @__PURE__ */ jsxs("p", { + children: ["\u57FA\u4E8E ", /* @__PURE__ */ jsx("a", { + href: "https://github.com/justmemos/memos", + children: "memos" + }), " \u5F00\u6E90\u9879\u76EE\u6240\u6784\u5EFA\u7684\u9879\u76EE\u3002 NOTE: Based on", " ", /* @__PURE__ */ jsx("a", { + href: "https://github.com/justmemos/memos", + children: "memos" + }), " project to build."] + }), /* @__PURE__ */ jsx("br", {}), /* @__PURE__ */ jsxs("p", { + children: ["\u{1F3D7} This project is working in progress, ", /* @__PURE__ */ jsx("br", {}), " and very pleasure to welcome your", " ", /* @__PURE__ */ jsx("a", { + href: "https://github.com/Quorafind/obsidian-memos/issues", + children: "issues" + }), " and", " ", /* @__PURE__ */ jsx("a", { + href: "https://github.com/Quorafind/obsidian-memos/pulls", + children: "Pull Request" + }), "."] + }), /* @__PURE__ */ jsx("hr", {}), /* @__PURE__ */ jsxs("p", { + className: "normal-text", + children: ["Last updated on ", /* @__PURE__ */ jsx("span", { + className: "pre-text", + children: "2022/01/04 22:55:15" + }), " \u{1F389}"] + })] + })] }); - if (allowedPlacements.length === 0) { - allowedPlacements = placements$1; +}; +function showAboutSiteDialog() { + showDialog({ + className: "about-site-dialog" + }, AboutSiteDialog); +} +var menuBtnsPopup = ""; +const MenuBtnsPopup = (props) => { + const { + shownStatus, + setShownStatus + } = props; + const { + app: app2 + } = dailyNotesService.getState(); + const popupElRef = _react_17_0_2_react.exports.useRef(null); + _react_17_0_2_react.exports.useEffect(() => { + if (shownStatus) { + const handleClickOutside = (event) => { + var _a; + if (!((_a = popupElRef.current) == null ? void 0 : _a.contains(event.target))) { + event.stopPropagation(); + } + setShownStatus(false); + }; + window.addEventListener("click", handleClickOutside, { + capture: true, + once: true + }); + } + }, [shownStatus]); + const handleUploadFile = _react_17_0_2_react.exports.useCallback(async (file) => { + const { + type + } = file; + if (!type.startsWith("text")) { + return; + } + try { + const image2 = await resourceService.parseHtml(file); + return `${image2}`; + } catch (error) { + new require$$0.Notice(error); + } + }, []); + const handleImportBtnClick = _react_17_0_2_react.exports.useCallback(() => { + const inputEl = document.createElement("input"); + document.body.appendChild(inputEl); + inputEl.type = "file"; + inputEl.multiple = false; + inputEl.accept = "text/html"; + inputEl.onchange = async () => { + if (!inputEl.files || inputEl.files.length === 0) { + return; + } + const file = inputEl.files[0]; + await handleUploadFile(file); + document.body.removeChild(inputEl); + }; + inputEl.click(); + }, []); + const handleMyAccountBtnClick = () => { + app2.setting.open(); + app2.setting.openTabById("obsidian-memos"); + }; + const handleMemosTrashBtnClick = () => { + locationService.pushHistory("/recycle"); + }; + const handleAboutBtnClick = () => { + showAboutSiteDialog(); + }; + return /* @__PURE__ */ jsxs("div", { + className: `menu-btns-popup ${shownStatus ? "" : "hidden"}`, + ref: popupElRef, + children: [/* @__PURE__ */ jsxs("button", { + className: "btn action-btn", + onClick: handleMyAccountBtnClick, + children: [/* @__PURE__ */ jsx("span", { + className: "icon", + children: "\u{1F464}" + }), " ", t$1("Settings")] + }), /* @__PURE__ */ jsxs("button", { + className: "btn action-btn", + onClick: handleMemosTrashBtnClick, + children: [/* @__PURE__ */ jsx("span", { + className: "icon", + children: "\u{1F5D1}\uFE0F" + }), " ", t$1("Recycle bin")] + }), /* @__PURE__ */ jsxs("button", { + className: "btn action-btn", + onClick: handleImportBtnClick, + children: [/* @__PURE__ */ jsx("span", { + className: "icon", + children: "\u{1F4C2}" + }), " ", t$1("Import")] + }), /* @__PURE__ */ jsxs("button", { + className: "btn action-btn", + onClick: handleAboutBtnClick, + children: [/* @__PURE__ */ jsx("span", { + className: "icon", + children: "\u{1F920}" + }), " ", t$1("About Me")] + })] + }); +}; +const cachedResourceMap = /* @__PURE__ */ new Map(); +const convertResourceToDataURL = async (url, useCache = true) => { + const { vault } = dailyNotesService.getState().app; + if (useCache && cachedResourceMap.has(url)) { + return Promise.resolve(cachedResourceMap.get(url)); } - var overflows = allowedPlacements.reduce(function(acc, placement2) { - acc[placement2] = detectOverflow(state, { - placement: placement2, - boundary, - rootBoundary, - padding - })[getBasePlacement(placement2)]; - return acc; - }, {}); - return Object.keys(overflows).sort(function(a, b) { - return overflows[a] - overflows[b]; + if (!/(http|https)/g.test(url)) { + if (await vault.adapter.exists(url)) { + const buffer = await vault.adapter.readBinary(url); + const arr = new Uint8Array(buffer); + const blob = new Blob([arr], { type: "image/png" }); + return new Promise((resolve) => { + const reader = new FileReader(); + reader.onloadend = () => { + const base64Url = reader.result; + cachedResourceMap.set(url, base64Url); + resolve(base64Url); + }; + reader.readAsDataURL(blob); + }); + } + } else { + try { + const buffer = (await downloadFile(url)).buffer; + const blob = new Blob([buffer], { type: "image/png" }); + return new Promise((resolve) => { + const reader = new FileReader(); + reader.onloadend = () => { + const base64Url = reader.result; + cachedResourceMap.set(url, base64Url); + resolve(base64Url); + }; + reader.readAsDataURL(blob); + }); + } catch (error) { + console.log("error in grabReleaseFileFromRepository", URL, error); + } + } +}; +const downloadFile = async (url) => { + const response = await fetch(url, { + mode: "no-cors" }); -} -function getExpandedFallbackPlacements(placement) { - if (getBasePlacement(placement) === auto) { - return []; + if (response.status !== 200) { + return { + ok: false, + msg: response.statusText + }; } - var oppositePlacement = getOppositePlacement(placement); - return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; -} -function flip(_ref) { - var state = _ref.state, options = _ref.options, name = _ref.name; - if (state.modifiersData[name]._skip) { - return; + const buffer = await response.arrayBuffer(); + try { + return { + ok: true, + msg: "ok", + buffer + }; + } catch (err) { + return { + ok: false, + msg: err + }; } - var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements; - var preferredPlacement = state.options.placement; - var basePlacement = getBasePlacement(preferredPlacement); - var isBasePlacement = basePlacement === preferredPlacement; - var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); - var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) { - return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, { - placement: placement2, - boundary, - rootBoundary, - padding, - flipVariations, - allowedAutoPlacements - }) : placement2); - }, []); - var referenceRect = state.rects.reference; - var popperRect = state.rects.popper; - var checksMap = new Map(); - var makeFallbackChecks = true; - var firstFittingPlacement = placements2[0]; - for (var i = 0; i < placements2.length; i++) { - var placement = placements2[i]; - var _basePlacement = getBasePlacement(placement); - var isStartVariation = getVariation(placement) === start; - var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; - var len = isVertical ? "width" : "height"; - var overflow = detectOverflow(state, { - placement, - boundary, - rootBoundary, - altBoundary, - padding - }); - var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; - if (referenceRect[len] > popperRect[len]) { - mainVariationSide = getOppositePlacement(mainVariationSide); +}; +const getCloneStyledElement = async (element) => { + const clonedElementContainer = document.createElement(element.tagName); + clonedElementContainer.innerHTML = element.innerHTML; + const applyStyles2 = async (sourceElement, clonedElement) => { + var _a; + if (!sourceElement || !clonedElement) { + return; } - var altVariationSide = getOppositePlacement(mainVariationSide); - var checks = []; - if (checkMainAxis) { - checks.push(overflow[_basePlacement] <= 0); + const sourceStyles = window.getComputedStyle(sourceElement); + if (sourceElement.tagName === "IMG") { + try { + const url = await convertResourceToDataURL((_a = sourceElement.getAttribute("path")) != null ? _a : sourceElement.getAttribute("src")); + clonedElement.src = url; + } catch (error) { + } + } else if (sourceElement.className === "property-image") { + try { + const imageUrl = sourceElement.style.backgroundImage; + const url = await convertResourceToDataURL(imageUrl); + clonedElement.style.backgroundImage = url; + } catch (error) { + } } - if (checkAltAxis) { - checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); + for (const item of sourceStyles) { + clonedElement.style.setProperty(item, sourceStyles.getPropertyValue(item), sourceStyles.getPropertyPriority(item)); } - if (checks.every(function(check) { - return check; - })) { - firstFittingPlacement = placement; - makeFallbackChecks = false; - break; + for (let i = 0; i < clonedElement.childElementCount; i++) { + await applyStyles2(sourceElement.children[i], clonedElement.children[i]); } - checksMap.set(placement, checks); - } - if (makeFallbackChecks) { - var numberOfChecks = flipVariations ? 3 : 1; - var _loop = function _loop2(_i2) { - var fittingPlacement = placements2.find(function(placement2) { - var checks2 = checksMap.get(placement2); - if (checks2) { - return checks2.slice(0, _i2).every(function(check) { - return check; - }); - } - }); - if (fittingPlacement) { - firstFittingPlacement = fittingPlacement; - return "break"; + }; + await applyStyles2(element, clonedElementContainer); + return clonedElementContainer; +}; +const getFontsStyleElement = async (element) => { + const styleSheets = element.ownerDocument.styleSheets; + const fontFamilyStyles = []; + for (const sheet of styleSheets) { + for (const rule of sheet.cssRules) { + if (rule.constructor.name === "CSSFontFaceRule") { + fontFamilyStyles.push(rule.style); } - }; - for (var _i = numberOfChecks; _i > 0; _i--) { - var _ret = _loop(_i); - if (_ret === "break") - break; } } - if (state.placement !== firstFittingPlacement) { - state.modifiersData[name]._skip = true; - state.placement = firstFittingPlacement; - state.reset = true; - } -} -var flip$1 = { - name: "flip", - enabled: true, - phase: "main", - fn: flip, - requiresIfExists: ["offset"], - data: { - _skip: false - } + const styleElement = document.createElement("style"); + return styleElement; }; -function getSideOffsets(overflow, rect, preventedOffsets) { - if (preventedOffsets === void 0) { - preventedOffsets = { - x: 0, - y: 0 - }; - } +const getElementSize = (element) => { + const { width, height } = window.getComputedStyle(element); return { - top: overflow.top - rect.height - preventedOffsets.y, - right: overflow.right - rect.width + preventedOffsets.x, - bottom: overflow.bottom - rect.height + preventedOffsets.y, - left: overflow.left - rect.width - preventedOffsets.x - }; -} -function isAnySideFullyClipped(overflow) { - return [top, right, bottom, left].some(function(side) { - return overflow[side] >= 0; - }); -} -function hide(_ref) { - var state = _ref.state, name = _ref.name; - var referenceRect = state.rects.reference; - var popperRect = state.rects.popper; - var preventedOffsets = state.modifiersData.preventOverflow; - var referenceOverflow = detectOverflow(state, { - elementContext: "reference" - }); - var popperAltOverflow = detectOverflow(state, { - altBoundary: true - }); - var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); - var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); - var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); - var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); - state.modifiersData[name] = { - referenceClippingOffsets, - popperEscapeOffsets, - isReferenceHidden, - hasPopperEscaped + width: parseInt(width.replace("px", "")), + height: parseInt(height.replace("px", "")) }; - state.attributes.popper = Object.assign({}, state.attributes.popper, { - "data-popper-reference-hidden": isReferenceHidden, - "data-popper-escaped": hasPopperEscaped - }); -} -var hide$1 = { - name: "hide", - enabled: true, - phase: "main", - requiresIfExists: ["preventOverflow"], - fn: hide }; -function distanceAndSkiddingToXY(placement, rects, offset2) { - var basePlacement = getBasePlacement(placement); - var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; - var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, { - placement - })) : offset2, skidding = _ref[0], distance = _ref[1]; - skidding = skidding || 0; - distance = (distance || 0) * invertDistance; - return [left, right].indexOf(basePlacement) >= 0 ? { - x: distance, - y: skidding - } : { - x: skidding, - y: distance - }; -} -function offset(_ref2) { - var state = _ref2.state, options = _ref2.options, name = _ref2.name; - var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset; - var data = placements.reduce(function(acc, placement) { - acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2); - return acc; - }, {}); - var _data$state$placement = data[state.placement], x2 = _data$state$placement.x, y2 = _data$state$placement.y; - if (state.modifiersData.popperOffsets != null) { - state.modifiersData.popperOffsets.x += x2; - state.modifiersData.popperOffsets.y += y2; - } - state.modifiersData[name] = data; -} -var offset$1 = { - name: "offset", - enabled: true, - phase: "main", - requires: ["popperOffsets"], - fn: offset +const convertSVGToDataURL = (svg) => { + const xml = new XMLSerializer().serializeToString(svg); + const url = encodeURIComponent(xml); + return `data:image/svg+xml;charset=utf-8,${url}`; +}; +const generateSVGElement = (width, height, element) => { + const xmlNS = "http://www.w3.org/2000/svg"; + const svgElement = document.createElementNS(xmlNS, "svg"); + svgElement.setAttribute("width", `${width}`); + svgElement.setAttribute("height", `${height}`); + svgElement.setAttribute("viewBox", `0 0 ${width} ${height}`); + const foreignObject = document.createElementNS(xmlNS, "foreignObject"); + foreignObject.setAttribute("width", "100%"); + foreignObject.setAttribute("height", "100%"); + foreignObject.setAttribute("x", "0"); + foreignObject.setAttribute("y", "0"); + foreignObject.setAttribute("externalResourcesRequired", "true"); + foreignObject.appendChild(element); + svgElement.appendChild(foreignObject); + return svgElement; +}; +const toSVG = async (element, options) => { + const { width, height } = getElementSize(element); + const clonedElement = await getCloneStyledElement(element); + if (options == null ? void 0 : options.backgroundColor) { + clonedElement.style.backgroundColor = options.backgroundColor; + } + const svg = generateSVGElement(width, height, clonedElement); + svg.prepend(await getFontsStyleElement(element)); + const url = convertSVGToDataURL(svg); + return url; }; -function popperOffsets(_ref) { - var state = _ref.state, name = _ref.name; - state.modifiersData[name] = computeOffsets({ - reference: state.rects.reference, - element: state.rects.popper, - strategy: "absolute", - placement: state.placement +const toCanvas = async (element, options) => { + const url = await toSVG(element, options); + const imageEl = new Image(); + imageEl.src = url; + const ratio = (options == null ? void 0 : options.pixelRatio) || 1; + const { width, height } = getElementSize(element); + const canvas = document.createElement("canvas"); + const context = canvas.getContext("2d"); + if (!context) { + return Promise.reject("Canvas error"); + } + canvas.width = width * ratio; + canvas.height = height * ratio; + canvas.style.width = `${width}`; + canvas.style.height = `${height}`; + if ((options == null ? void 0 : options.backgroundColor) || document.body.className.contains("theme-dark")) { + context.fillStyle = options.backgroundColor || "#1f1f1f"; + context.fillRect(0, 0, canvas.width, canvas.height); + } + return new Promise((resolve) => { + imageEl.onload = () => { + context.drawImage(imageEl, 0, 0, canvas.width, canvas.height); + resolve(canvas); + }; }); -} -var popperOffsets$1 = { - name: "popperOffsets", - enabled: true, - phase: "read", - fn: popperOffsets, - data: {} }; -function getAltAxis(axis) { - return axis === "x" ? "y" : "x"; +const toImage = async (element, options) => { + const canvas = await toCanvas(element, options); + return canvas.toDataURL(); +}; +function useToggle(initialState = false) { + const [state, setState] = _react_17_0_2_react.exports.useState(initialState); + const toggle = _react_17_0_2_react.exports.useCallback((nextState) => { + if (nextState !== void 0) { + setState(nextState); + } else { + setState((state2) => !state2); + } + }, []); + return [state, toggle]; } -function preventOverflow(_ref) { - var state = _ref.state, options = _ref.options, name = _ref.name; - var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; - var overflow = detectOverflow(state, { - boundary, - rootBoundary, - padding, - altBoundary +function useLoading(initialState = true) { + const [state, setState] = _react_17_0_2_react.exports.useState({ isLoading: initialState, isFailed: false, isSucceed: false }); + return __spreadProps(__spreadValues({}, state), { + setLoading: () => { + setState(__spreadProps(__spreadValues({}, state), { + isLoading: true, + isFailed: false, + isSucceed: false + })); + }, + setFinish: () => { + setState(__spreadProps(__spreadValues({}, state), { + isLoading: false, + isFailed: false, + isSucceed: true + })); + }, + setError: () => { + setState(__spreadProps(__spreadValues({}, state), { + isLoading: false, + isFailed: true, + isSucceed: false + })); + } }); - var basePlacement = getBasePlacement(state.placement); - var variation = getVariation(state.placement); - var isBasePlacement = !variation; - var mainAxis = getMainAxisFromPlacement(basePlacement); - var altAxis = getAltAxis(mainAxis); - var popperOffsets2 = state.modifiersData.popperOffsets; - var referenceRect = state.rects.reference; - var popperRect = state.rects.popper; - var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, { - placement: state.placement - })) : tetherOffset; - var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? { - mainAxis: tetherOffsetValue, - altAxis: tetherOffsetValue - } : Object.assign({ - mainAxis: 0, - altAxis: 0 - }, tetherOffsetValue); - var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; - var data = { - x: 0, - y: 0 - }; - if (!popperOffsets2) { - return; - } - if (checkMainAxis) { - var _offsetModifierState$; - var mainSide = mainAxis === "y" ? top : left; - var altSide = mainAxis === "y" ? bottom : right; - var len = mainAxis === "y" ? "height" : "width"; - var offset2 = popperOffsets2[mainAxis]; - var min$1 = offset2 + overflow[mainSide]; - var max$1 = offset2 - overflow[altSide]; - var additive = tether ? -popperRect[len] / 2 : 0; - var minLen = variation === start ? referenceRect[len] : popperRect[len]; - var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; - var arrowElement = state.elements.arrow; - var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { - width: 0, - height: 0 - }; - var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject(); - var arrowPaddingMin = arrowPaddingObject[mainSide]; - var arrowPaddingMax = arrowPaddingObject[altSide]; - var arrowLen = within(0, referenceRect[len], arrowRect[len]); - var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; - var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; - var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); - var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; - var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; - var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset; - var tetherMax = offset2 + maxOffset - offsetModifierValue; - var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset2, tether ? max(max$1, tetherMax) : max$1); - popperOffsets2[mainAxis] = preventedOffset; - data[mainAxis] = preventedOffset - offset2; - } - if (checkAltAxis) { - var _offsetModifierState$2; - var _mainSide = mainAxis === "x" ? top : left; - var _altSide = mainAxis === "x" ? bottom : right; - var _offset = popperOffsets2[altAxis]; - var _len = altAxis === "y" ? "height" : "width"; - var _min = _offset + overflow[_mainSide]; - var _max = _offset - overflow[_altSide]; - var isOriginSide = [top, left].indexOf(basePlacement) !== -1; - var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; - var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; - var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; - var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); - popperOffsets2[altAxis] = _preventedOffset; - data[altAxis] = _preventedOffset - _offset; - } - state.modifiersData[name] = data; } -var preventOverflow$1 = { - name: "preventOverflow", - enabled: true, - phase: "main", - fn: preventOverflow, - requiresIfExists: ["offset"] +var previewImageDialog = ""; +const PreviewImageDialog = ({ + destroy, + imgUrl, + filepath +}) => { + const imgRef = _react_17_0_2_react.exports.useRef(null); + const [imgWidth, setImgWidth] = _react_17_0_2_react.exports.useState(-1); + const { + vault + } = appStore.getState().dailyNotesState.app; + _react_17_0_2_react.exports.useEffect(() => { + utils$1.getImageSize(imgUrl).then(({ + width + }) => { + if (width !== 0) { + setImgWidth(80); + } else { + setImgWidth(0); + } + }); + }, []); + const handleCloseBtnClick = () => { + destroy(); + }; + const handleDecreaseImageSize = () => { + if (imgWidth > 30) { + setImgWidth(imgWidth - 10); + } + }; + const handleIncreaseImageSize = () => { + setImgWidth(imgWidth + 10); + }; + const convertBase64ToBlob = (base64, type) => { + var bytes = window.atob(base64); + var ab2 = new ArrayBuffer(bytes.length); + var ia2 = new Uint8Array(ab2); + for (var i = 0; i < bytes.length; i++) { + ia2[i] = bytes.charCodeAt(i); + } + return new Blob([ab2], { + type + }); + }; + const copyImageToClipboard = async () => { + if ((filepath === null || filepath === void 0) && imgUrl !== null) { + const myBase64 = imgUrl.split("base64,")[1]; + const blobInput = convertBase64ToBlob(myBase64, "image/png"); + const clipboardItemInput = new ClipboardItem({ + "image/png": blobInput + }); + window.navigator["clipboard"].write([clipboardItemInput]); + new require$$0.Notice("Send to clipboard successfully"); + } else { + const buffer = await vault.adapter.readBinary(filepath); + const arr = new Uint8Array(buffer); + const blob = new Blob([arr], { + type: "image/png" + }); + const item = new ClipboardItem({ + "image/png": blob + }); + window.navigator["clipboard"].write([item]); + } + }; + return /* @__PURE__ */ jsxs(Fragment, { + children: [/* @__PURE__ */ jsx("button", { + className: "btn close-btn", + onClick: handleCloseBtnClick, + children: /* @__PURE__ */ jsx(SvgClose, { + className: "icon-img" + }) + }), /* @__PURE__ */ jsxs("div", { + className: "img-container internal-embed image-embed is-loaded", + children: [/* @__PURE__ */ jsx("img", { + className: imgWidth <= 0 ? "hidden" : "", + ref: imgRef, + width: imgWidth + "%", + src: imgUrl + }), /* @__PURE__ */ jsx("span", { + className: "loading-text " + (imgWidth === -1 ? "" : "hidden"), + children: t$1("Image is loading...") + }), /* @__PURE__ */ jsx("span", { + className: "loading-text " + (imgWidth === 0 ? "" : "hidden"), + children: t$1("\u{1F61F} Cannot load image, image link maybe broken") + })] + }), /* @__PURE__ */ jsxs("div", { + className: "action-btns-container", + children: [/* @__PURE__ */ jsx("button", { + className: "btn", + onClick: handleDecreaseImageSize, + children: "\u2796" + }), /* @__PURE__ */ jsx("button", { + className: "btn", + onClick: handleIncreaseImageSize, + children: "\u2795" + }), /* @__PURE__ */ jsx("button", { + className: "btn", + onClick: () => setImgWidth(80), + children: "\u2B55" + }), /* @__PURE__ */ jsx("button", { + className: "btn", + onClick: copyImageToClipboard, + children: "\u{1F4C4}" + })] + })] + }); }; -function getHTMLElementScroll(element) { - return { - scrollLeft: element.scrollLeft, - scrollTop: element.scrollTop - }; -} -function getNodeScroll(node) { - if (node === getWindow(node) || !isHTMLElement(node)) { - return getWindowScroll(node); +function showPreviewImageDialog(imgUrl, filepath) { + if (filepath) { + showDialog({ + className: "preview-image-dialog" + }, PreviewImageDialog, { + imgUrl, + filepath + }); } else { - return getHTMLElementScroll(node); + showDialog({ + className: "preview-image-dialog" + }, PreviewImageDialog, { + imgUrl + }); } } -function isElementScaled(element) { - var rect = element.getBoundingClientRect(); - var scaleX = round(rect.width) / element.offsetWidth || 1; - var scaleY = round(rect.height) / element.offsetHeight || 1; - return scaleX !== 1 || scaleY !== 1; -} -function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { - if (isFixed === void 0) { - isFixed = false; - } - var isOffsetParentAnElement = isHTMLElement(offsetParent); - var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); - var documentElement = getDocumentElement(offsetParent); - var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled); - var scroll = { - scrollLeft: 0, - scrollTop: 0 - }; - var offsets = { - x: 0, - y: 0 - }; - if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { - if (getNodeName(offsetParent) !== "body" || isScrollParent(documentElement)) { - scroll = getNodeScroll(offsetParent); - } - if (isHTMLElement(offsetParent)) { - offsets = getBoundingClientRect(offsetParent, true); - offsets.x += offsetParent.clientLeft; - offsets.y += offsetParent.clientTop; - } else if (documentElement) { - offsets.x = getWindowScrollBarX(documentElement); +var react_1 = _react_17_0_2_react.exports; +var isFunction = function(setStateAction) { + return typeof setStateAction === "function"; +}; +var useStateRef = function(initialState) { + var _a = react_1.useState(initialState), state = _a[0], setState = _a[1]; + var ref = react_1.useRef(state); + var dispatch = react_1.useCallback(function(setStateAction) { + ref.current = isFunction(setStateAction) ? setStateAction(ref.current) : setStateAction; + setState(ref.current); + }, []); + return [state, dispatch, ref]; +}; +var dist = useStateRef; +const CODE_BLOCK_REG = /```([\s\S]*?)```/g; +const BOLD_TEXT_REG = /\*\*(.+?)\*\*/g; +const EM_TEXT_REG = /\*(.+?)\*/g; +const TODO_BLOCK_REG = /\[ \] /g; +const DONE_BLOCK_REG = /\[.{1}\] /g; +const DOT_LI_REG = /^[*-]/g; +const NUM_LI_REG = /(\d+)\. /g; +const INTERNAL_MD_REG = /\[\[([^\]]+)\]\]/g; +const EXRERNAL_MD_REG = /\[([^\]]+)\]\((([^\]]+).md)\)/g; +const parseMarkedToHtml = (markedStr, memoid) => { + const htmlText = markedStr.replace(CODE_BLOCK_REG, "

$1
").replace(DOT_LI_REG, "\u2022").replace(NUM_LI_REG, "$1.").replace(TODO_BLOCK_REG, "\u2B1C").replace(DONE_BLOCK_REG, "\u2705").replace(BOLD_TEXT_REG, "$1").replace(EM_TEXT_REG, "$1").replace(/<br>/g, "

").replace(/&/g, "&"); + let newHtmlText = htmlText; + if (memoid) { + if (INTERNAL_MD_REG.test(htmlText)) { + const internalMD = htmlText.match(INTERNAL_MD_REG); + for (let i = 0; i < internalMD.length; i++) { + if (!/(jpeg|jpg|gif|png|svg|bmp|wepg)/g.test(internalMD[i])) { + const internalContent = getContentFromInternalLink(internalMD[i]); + if (/\|/g.test(internalContent)) { + const [link, label] = internalContent.split("|"); + const replaceMent = replaceMd(link, label); + newHtmlText = htmlText.replace(internalMD[i], replaceMent); + } else { + const link = internalContent; + const label = ""; + const replaceMent = replaceMd(link, label); + newHtmlText = newHtmlText.replace(internalMD[i], replaceMent); + } + } + } } - } - return { - x: rect.left + scroll.scrollLeft - offsets.x, - y: rect.top + scroll.scrollTop - offsets.y, - width: rect.width, - height: rect.height - }; -} -function order(modifiers) { - var map = new Map(); - var visited = new Set(); - var result = []; - modifiers.forEach(function(modifier) { - map.set(modifier.name, modifier); - }); - function sort(modifier) { - visited.add(modifier.name); - var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); - requires.forEach(function(dep) { - if (!visited.has(dep)) { - var depModifier = map.get(dep); - if (depModifier) { - sort(depModifier); + if (EXRERNAL_MD_REG.test(htmlText)) { + const externalMD = htmlText.match(EXRERNAL_MD_REG); + for (let i = 0; i < externalMD.length; i++) { + if (!/(jpeg|jpg|gif|png|svg|bmp|wepg)/g.test(externalMD[i])) { + const link = getContentFromExternalLink(externalMD[i]); + const label = getLabelFromExternalLink(externalMD[i]); + const replaceMent = replaceMd(link, label); + newHtmlText = htmlText.replace(externalMD[i], replaceMent); } } - }); - result.push(modifier); + } } - modifiers.forEach(function(modifier) { - if (!visited.has(modifier.name)) { - sort(modifier); + return newHtmlText; +}; +const replaceMd = (internalLink, label) => { + const { metadataCache } = appStore.getState().dailyNotesState.app; + const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalLink), ""); + if (file instanceof require$$0.TFile) { + if (label) { + return `${label}`; + } else { + return `${internalLink}`; } - }); - return result; -} -function orderModifiers(modifiers) { - var orderedModifiers = order(modifiers); - return modifierPhases.reduce(function(acc, phase) { - return acc.concat(orderedModifiers.filter(function(modifier) { - return modifier.phase === phase; - })); - }, []); + } else if (label) { + return `${label}`; + } else { + return `${internalLink}`; + } +}; +const getContentFromInternalLink = (line) => { + var _a; + return (_a = /\[\[([^\]]+)\]\]/g.exec(line)) == null ? void 0 : _a[1]; +}; +const getLabelFromExternalLink = (line) => { + var _a; + return (_a = EXRERNAL_MD_REG.exec(line)) == null ? void 0 : _a[1]; +}; +const getContentFromExternalLink = (line) => { + var _a; + return (_a = /\[([^\]]+)\]\((([^\]]+).md)\)/g.exec(line)) == null ? void 0 : _a[3]; +}; +const parseHtmlToRawText = (htmlStr) => { + const tempEl = document.createElement("div"); + tempEl.className = "memo-content-text"; + tempEl.innerHTML = htmlStr; + const text = tempEl.innerText; + return text; +}; +const parseRawTextToHtml = (rawTextStr) => { + const htmlText = rawTextStr.replace(/\n/g, "
"); + return htmlText; +}; +const encodeHtml = (htmlStr) => { + const t2 = document.createElement("div"); + t2.textContent = htmlStr; + return t2.innerHTML; +}; +var memoCardDialog = ""; +function SvgEdit(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + xmlns: "http://www.w3.org/2000/svg", + height: "20px", + viewBox: "0 0 24 24", + width: "20px", + fill: "#37352f" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M0 0h24v24H0V0z", + fill: "none" + }), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M14.06 9.02l.92.92L5.92 19H5v-.92l9.06-9.06M17.66 3c-.25 0-.51.1-.7.29l-1.83 1.83 3.75 3.75 1.83-1.83c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.2-.2-.45-.29-.71-.29zm-3.6 3.19L3 17.25V21h3.75L17.81 9.94l-3.75-3.75z" + })); } -function debounce(fn2) { - var pending; - return function() { - if (!pending) { - pending = new Promise(function(resolve) { - Promise.resolve().then(function() { - pending = void 0; - resolve(fn2()); - }); - }); +const OnlyWhen = (props) => { + const { + children, + when + } = props; + return when ? /* @__PURE__ */ jsx(Fragment, { + children + }) : null; +}; +const Only = OnlyWhen; +var image = ""; +const Image$1 = (props) => { + const { + className, + imgUrl, + alt, + referrerPolicy, + filepath + } = props; + const handleImageClick = () => { + if (filepath) { + showPreviewImageDialog(imgUrl, filepath); + } else { + showPreviewImageDialog(imgUrl); } - return pending; }; -} -function mergeByName(modifiers) { - var merged = modifiers.reduce(function(merged2, current) { - var existing = merged2[current.name]; - merged2[current.name] = existing ? Object.assign({}, existing, current, { - options: Object.assign({}, existing.options, current.options), - data: Object.assign({}, existing.data, current.data) - }) : current; - return merged2; - }, {}); - return Object.keys(merged).map(function(key) { - return merged[key]; + return /* @__PURE__ */ jsx("div", { + className: "image-container " + className, + onClick: handleImageClick, + referrerPolicy, + children: /* @__PURE__ */ jsx("img", { + src: imgUrl, + alt, + decoding: "async", + loading: "lazy" + }) }); -} -var DEFAULT_OPTIONS = { - placement: "bottom", - modifiers: [], - strategy: "absolute" }; -function areValidElements() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - return !args.some(function(element) { - return !(element && typeof element.getBoundingClientRect === "function"); - }); -} -function popperGenerator(generatorOptions) { - if (generatorOptions === void 0) { - generatorOptions = {}; - } - var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers2 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; - return function createPopper2(reference2, popper2, options) { - if (options === void 0) { - options = defaultOptions; +const MemoImage = (props) => { + var _a; + const { + memo: memo2 + } = props; + const getPathOfImage2 = (vault, image2) => { + return vault.getResourcePath(image2); + }; + const detectWikiInternalLink2 = (lineText) => { + var _a2, _b; + const { + metadataCache, + vault + } = appStore.getState().dailyNotesState.app; + const internalFileName = (_a2 = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a2[1]; + const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5]; + const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); + if (file === null) { + return { + linkText: internalFileName, + altText: internalAltName, + path: "", + filepath: "" + }; + } else { + const imagePath = getPathOfImage2(vault, file); + const filePath = file.path; + if (internalAltName) { + return { + linkText: internalFileName, + altText: internalAltName, + path: imagePath, + filepath: filePath + }; + } else { + return { + linkText: internalFileName, + altText: "", + path: imagePath, + filepath: filePath + }; + } } - var state = { - placement: "bottom", - orderedModifiers: [], - options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), - modifiersData: {}, - elements: { - reference: reference2, - popper: popper2 - }, - attributes: {}, - styles: {} - }; - var effectCleanupFns = []; - var isDestroyed = false; - var instance = { - state, - setOptions: function setOptions(setOptionsAction) { - var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction; - cleanupModifierEffects(); - state.options = Object.assign({}, defaultOptions, state.options, options2); - state.scrollParents = { - reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [], - popper: listScrollParents(popper2) + }; + const detectMDInternalLink2 = (lineText) => { + var _a2, _b; + const { + metadataCache, + vault + } = appStore.getState().dailyNotesState.app; + const internalFileName = (_a2 = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a2[5]; + const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2]; + const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); + if (file === null) { + return { + linkText: internalFileName, + altText: internalAltName, + path: "", + filepath: "" + }; + } else { + const imagePath = getPathOfImage2(vault, file); + const filePath = file.path; + if (internalAltName) { + return { + linkText: internalFileName, + altText: internalAltName, + path: imagePath, + filepath: filePath }; - var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers2, state.options.modifiers))); - state.orderedModifiers = orderedModifiers.filter(function(m2) { - return m2.enabled; - }); - runModifierEffects(); - return instance.update(); - }, - forceUpdate: function forceUpdate() { - if (isDestroyed) { - return; - } - var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper; - if (!areValidElements(reference3, popper3)) { - return; - } - state.rects = { - reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"), - popper: getLayoutRect(popper3) + } else { + return { + linkText: internalFileName, + altText: "", + path: imagePath, + filepath: filePath }; - state.reset = false; - state.placement = state.options.placement; - state.orderedModifiers.forEach(function(modifier) { - return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); - }); - for (var index = 0; index < state.orderedModifiers.length; index++) { - if (state.reset === true) { - state.reset = false; - index = -1; - continue; - } - var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name; - if (typeof fn2 === "function") { - state = fn2({ - state, - options: _options, - name, - instance - }) || state; + } + } + }; + let externalImageUrls = []; + const internalImageUrls = []; + let allMarkdownLink = []; + let allInternalLink = []; + if (IMAGE_URL_REG.test(memo2)) { + let allExternalImageUrls = []; + const anotherExternalImageUrls = []; + if (MARKDOWN_URL_REG.test(memo2)) { + allMarkdownLink = Array.from(memo2.match(MARKDOWN_URL_REG)); + } + if (WIKI_IMAGE_URL_REG.test(memo2)) { + allInternalLink = Array.from(memo2.match(WIKI_IMAGE_URL_REG)); + } + if (MARKDOWN_WEB_URL_REG.test(memo2)) { + allExternalImageUrls = Array.from(memo2.match(MARKDOWN_WEB_URL_REG)); + } + if (allInternalLink.length) { + for (let i = 0; i < allInternalLink.length; i++) { + const allInternalLinkElement = allInternalLink[i]; + internalImageUrls.push(detectWikiInternalLink2(allInternalLinkElement)); + } + } + if (allMarkdownLink.length) { + for (let i = 0; i < allMarkdownLink.length; i++) { + const allMarkdownLinkElement = allMarkdownLink[i]; + if (/(.*)http[s]?(.*)/.test(allMarkdownLinkElement)) { + anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(allMarkdownLinkElement)) == null ? void 0 : _a[5]); + } else { + internalImageUrls.push(detectMDInternalLink2(allMarkdownLinkElement)); + } + } + } + externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls); + } + return /* @__PURE__ */ jsxs(Fragment, { + children: [/* @__PURE__ */ jsx(Only, { + when: externalImageUrls.length > 0, + children: /* @__PURE__ */ jsx("div", { + className: "images-wrapper", + children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, { + alt: "", + className: "memo-img", + imgUrl, + referrerPolicy: "no-referrer" + }, idx)) + }) + }), /* @__PURE__ */ jsx(Only, { + when: internalImageUrls.length > 0, + children: /* @__PURE__ */ jsx("div", { + className: "images-wrapper internal-embed image-embed is-loaded", + children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, { + className: "memo-img", + imgUrl: imgUrl.path, + alt: imgUrl.altText, + filepath: imgUrl.filepath + }, idx)) + }) + })] + }); +}; +const MemoCardDialog = (props) => { + const [memo2, setMemo] = _react_17_0_2_react.exports.useState(__spreadProps(__spreadValues({}, props.memo), { + createdAtStr: utils$1.getDateTimeString(props.memo.createdAt) + })); + const [linkMemos, setLinkMemos] = _react_17_0_2_react.exports.useState([]); + const [linkedMemos, setLinkedMemos] = _react_17_0_2_react.exports.useState([]); + _react_17_0_2_react.exports.useEffect(() => { + const fetchLinkedMemos = async () => { + try { + const linkMemos2 = []; + const matchedArr = [...memo2.content.matchAll(MEMO_LINK_REG)]; + for (const matchRes of matchedArr) { + if (matchRes && matchRes.length === 3) { + const id2 = matchRes[2]; + const memoTemp = memoService.getMemoById(id2); + if (memoTemp) { + linkMemos2.push(__spreadProps(__spreadValues({}, memoTemp), { + createdAtStr: utils$1.getDateTimeString(memoTemp.createdAt), + dateStr: utils$1.getDateString(memoTemp.createdAt) + })); + } } } - }, - update: debounce(function() { - return new Promise(function(resolve) { - instance.forceUpdate(); - resolve(state); - }); - }), - destroy: function destroy() { - cleanupModifierEffects(); - isDestroyed = true; + setLinkMemos([...linkMemos2]); + const linkedMemos2 = await memoService.getLinkedMemos(memo2.id); + setLinkedMemos(linkedMemos2.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)).map((m2) => __spreadProps(__spreadValues({}, m2), { + createdAtStr: utils$1.getDateTimeString(m2.createdAt), + dateStr: utils$1.getDateString(m2.createdAt) + }))); + } catch (error) { } }; - if (!areValidElements(reference2, popper2)) { - return instance; - } - instance.setOptions(options).then(function(state2) { - if (!isDestroyed && options.onFirstUpdate) { - options.onFirstUpdate(state2); + fetchLinkedMemos(); + }, [memo2.id]); + const handleMemoContentClick = _react_17_0_2_react.exports.useCallback(async (e) => { + var _a; + const targetEl = e.target; + if (targetEl.className === "memo-link-text") { + const nextMemoId = (_a = targetEl.dataset) == null ? void 0 : _a.value; + const memoTemp = memoService.getMemoById(nextMemoId != null ? nextMemoId : ""); + if (memoTemp) { + const nextMemo = __spreadProps(__spreadValues({}, memoTemp), { + createdAtStr: utils$1.getDateTimeString(memoTemp.createdAt) + }); + setLinkMemos([]); + setLinkedMemos([]); + setMemo(nextMemo); + } else { + new require$$0.Notice("MEMO Not Found"); + targetEl.classList.remove("memo-link-text"); } - }); - function runModifierEffects() { - state.orderedModifiers.forEach(function(_ref3) { - var name = _ref3.name, _ref3$options = _ref3.options, options2 = _ref3$options === void 0 ? {} : _ref3$options, effect2 = _ref3.effect; - if (typeof effect2 === "function") { - var cleanupFn = effect2({ - state, - name, - instance, - options: options2 - }); - var noopFn = function noopFn2() { - }; - effectCleanupFns.push(cleanupFn || noopFn); + } + }, []); + const handleLinkedMemoClick = _react_17_0_2_react.exports.useCallback((memo22) => { + setLinkMemos([]); + setLinkedMemos([]); + setMemo(memo22); + }, []); + const handleEditMemoBtnClick = _react_17_0_2_react.exports.useCallback(() => { + props.destroy(); + globalStateService.setEditMemoId(memo2.id); + }, [memo2.id]); + return /* @__PURE__ */ jsxs(Fragment, { + children: [/* @__PURE__ */ jsxs("div", { + className: "memo-card-container", + children: [/* @__PURE__ */ jsxs("div", { + className: "header-container", + children: [/* @__PURE__ */ jsx("p", { + className: "time-text", + children: memo2.createdAtStr + }), /* @__PURE__ */ jsxs("div", { + className: "btns-container", + children: [/* @__PURE__ */ jsx("button", { + className: "btn edit-btn", + onClick: handleEditMemoBtnClick, + children: /* @__PURE__ */ jsx(SvgEdit, { + className: "icon-img" + }) + }), /* @__PURE__ */ jsx("button", { + className: "btn close-btn", + onClick: props.destroy, + children: /* @__PURE__ */ jsx(SvgClose, { + className: "icon-img" + }) + })] + })] + }), /* @__PURE__ */ jsxs("div", { + className: "memo-container", + children: [/* @__PURE__ */ jsx("div", { + className: "memo-content-text", + onClick: handleMemoContentClick, + dangerouslySetInnerHTML: { + __html: formatMemoContent(memo2.content) + } + }), /* @__PURE__ */ jsx(MemoImage, { + memo: memo2.content + })] + }), /* @__PURE__ */ jsx("div", { + className: "layer-container" + }), linkMemos.map((_, idx) => { + if (idx < 4) { + return /* @__PURE__ */ jsx("div", { + className: "background-layer-container", + style: { + bottom: (idx + 1) * -3 + "px", + left: (idx + 1) * 5 + "px", + width: `calc(100% - ${(idx + 1) * 10}px)`, + zIndex: -idx - 1 + } + }, idx); + } else { + return null; } - }); - } - function cleanupModifierEffects() { - effectCleanupFns.forEach(function(fn2) { - return fn2(); - }); - effectCleanupFns = []; - } - return instance; - }; + })] + }), linkMemos.length > 0 ? /* @__PURE__ */ jsxs("div", { + className: "linked-memos-wrapper", + children: [/* @__PURE__ */ jsxs("p", { + className: "normal-text", + children: [t$1("LINKED"), " ", linkMemos.length, " MEMO", " "] + }), linkMemos.map((m2) => { + const rawtext = parseHtmlToRawText(formatMemoContent(m2.content)).replaceAll("\n", " "); + return /* @__PURE__ */ jsxs("div", { + className: "linked-memo-container", + onClick: () => handleLinkedMemoClick(m2), + children: [/* @__PURE__ */ jsxs("span", { + className: "time-text", + children: [m2.dateStr, " "] + }), rawtext] + }, m2.id); + })] + }) : null, linkedMemos.length > 0 ? /* @__PURE__ */ jsxs("div", { + className: "linked-memos-wrapper", + children: [/* @__PURE__ */ jsxs("p", { + className: "normal-text", + children: [linkedMemos.length, " MEMO ", t$1("LINK TO THE"), " MEMO"] + }), linkedMemos.map((m2) => { + const rawtext = parseHtmlToRawText(formatMemoContent(m2.content)).replaceAll("\n", " "); + return /* @__PURE__ */ jsxs("div", { + className: "linked-memo-container", + onClick: () => handleLinkedMemoClick(m2), + children: [/* @__PURE__ */ jsxs("span", { + className: "time-text", + children: [m2.dateStr, " "] + }), rawtext] + }, m2.id); + })] + }) : null] + }); +}; +function showMemoCardDialog(memo2) { + showDialog({ + className: "memo-card-dialog" + }, MemoCardDialog, { + memo: memo2 + }); } -var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1]; -var createPopper = /* @__PURE__ */ popperGenerator({ - defaultModifiers -}); -var hasElementType = typeof Element !== "undefined"; -var hasMap = typeof Map === "function"; -var hasSet = typeof Set === "function"; -var hasArrayBuffer = typeof ArrayBuffer === "function" && !!ArrayBuffer.isView; -function equal(a, b) { - if (a === b) - return true; - if (a && b && typeof a == "object" && typeof b == "object") { - if (a.constructor !== b.constructor) - return false; - var length, i, keys; - if (Array.isArray(a)) { - length = a.length; - if (length != b.length) - return false; - for (i = length; i-- !== 0; ) - if (!equal(a[i], b[i])) - return false; - return true; - } - var it2; - if (hasMap && a instanceof Map && b instanceof Map) { - if (a.size !== b.size) - return false; - it2 = a.entries(); - while (!(i = it2.next()).done) - if (!b.has(i.value[0])) - return false; - it2 = a.entries(); - while (!(i = it2.next()).done) - if (!equal(i.value[1], b.get(i.value[0]))) - return false; - return true; - } - if (hasSet && a instanceof Set && b instanceof Set) { - if (a.size !== b.size) - return false; - it2 = a.entries(); - while (!(i = it2.next()).done) - if (!b.has(i.value[0])) - return false; - return true; +var shareMemoImageDialog = ""; +var lightBackground = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGRhdGEtbmFtZT0iTGF5ZXIgMSIgd2lkdGg9IjExNDYuMzE4MjgiIGhlaWdodD0iODAxLjAwMzYxIiB2aWV3Qm94PSIwIDAgMTE0Ni4zMTgyOCA4MDEuMDAzNjEiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48cGF0aCBkPSJNMTA1MC42OTkxOCw1MTQuNTA4MmE0NTYuMjQ5MTMsNDU2LjI0OTEzLDAsMCwxLTM3LjM4MDEzLTI2MS44N2MzLjYwMDEtMjMuMSw5LjQ0MDA2LTQ2Ljg1LDI0LjQzMDE4LTY0Ljc5LDE0LjM4OTg5LTE3LjIzLDM5LjM0OTg1LTI3LjM3LDYwLjAyOTktMTkuMjktMTMuNTY5OTQtMjkuNjEtNDcuNzYtNDYuNS04MC41OS00Ny4zMy0zNC4wOS0uODYtNjYuOTIsMTIuNS05Ny4yNSwyOC4xLTMwLjMzLDE1LjYtNTkuNjUsMzMuODEwMDYtOTIuMjEsNDMuOTktNTMuNSwxNi43Mi0xMTEuOTEsMTAuMzQtMTY1LjUtNi4wOS01My41OC0xNi40NC0xMDMuNjItNDIuNDctMTU0LjYyLTY1LjcxLTUxLjAxLTIzLjI0LTEwNC4xNy00NC4wMy0xNjAuMDEtNDguOTEtNTUuODQtNC44Ny0xMTUuMjUsNy44OS0xNTcuMjQsNDUuMDFzLTYxLjg3LDEwMS4yOC0zOC4yNywxNTIuMTFjMTQuMjUsMzAuNyw0Mi4yMiw1NC4zMiw1Mi4wNCw4Ni43LDEyLjMyLDQwLjY1LTcuMDgsODMuOTYtMzAuNDEsMTE5LjQ1LTIzLjM0LDM1LjQ5LTUxLjgsNjkuNTgtNjAuNDcsMTExLjE2LTguMDEsMzguMzgsMi43Miw3OC4wMiwyNC4wNSwxMTEuMzhhMTk3LjM0NDY4LDE5Ny4zNDQ2OCwwLDAsMCwzNS43NCw0MS42MWM0My4wOSwzNy45MSw5OC43Nyw1OC4xNSwxNTQuMTcsNzMuMTMsMjAwLjI3LDU0LjE3LDQxNi4xMyw0OS4yOSw2MTMuNzUtMTMuODgsMzQuOTktMTEuMTgsNjkuOTUtMjQuNDMsOTkuMzItNDYuNDgsMTkuMTYtMTQuMzgsMzUuODMtMzMuMDIsNDYuMzktNTQuMzVhMTE0LjEwNTc0LDExNC4xMDU3NCwwLDAsMCwxMS4xMy0zNi4xODAwNUMxMTA0LjQzOTE3LDYxMC4xNzgxOSwxMDcyLjk2OTIsNTYyLjA1ODE5LDEwNTAuNjk5MTgsNTE0LjUwODJaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzZjNjNmZiIvPjxnIG9wYWNpdHk9IjAuMTciPjxwYXRoIGQ9Ik04OTAuNzUwMzIsMjQ2LjQ1MTQ1YzkuNjQxNzEtNC4yMDM5NC05LjkxMTYzLTYuNjUxMTktMzIuMDk1ODUtNy40NTU4MnMtNDkuMDIwNjEtLjc2MDExLTYzLjE5NzU2LTMuMDQ4NzVjLTEzLjcxMTE0LTIuMjEzNDMtMTIuNzAwOS02LjE0OTA3LTEzLjg1NDI3LTkuNzE0ODlzLTYuNDI0NDYtNy4yMjItMjcuODE5MjgtOC4wMTQ3Yy0yNi42NjA3LS45ODc3NC03MC42MjU4MSwyLjgxNDM0LTkwLjc1MTcxLjUzMTczLTE4Ljc4MTIxLTIuMTMwMTEtNy42MTcyMy04LjgxMTgyLTM1LjAwMzQ0LTkuMDY3NTUtMTUuNjM4MzctLjE0Ni0zNS43ODQ5LDIuMDU2ODItNTMuMTg1NzcsMi41ODg0NC0xNi4zMzY0Ny40OTkwOS0yOC40MjIxNi0uNTM0NDEtMzYuOTAzNTctMS45MjRzLTE0LjM4ODc1LTMuMTUxMjYtMjMuOTM0MTMtNC4zNzg2NGMtMjUuMDYwNjgtMy4yMjI0LTc0LjA5MTMzLTIuMTM5MjUtMTE3Ljg1MywxLjk5MDcxcy04MS4yNzM0NCwxMC44OTgxNi0xMDIuNDI4ODksMTcuNjAxNzUtMjcuMDAwMjksMTMuMzAzNzYtMjIuMDcyMzksMTguOTAwNzFjMy4xNDY3NCwzLjU3NCwxMS4xOTkxNSw2LjkxNTg1LDMwLjczMjM1LDguMzUyLDM2LjUzNTU1LDIuNjg2MjEsMTAxLjU4Mzg3LTEuOTM3NSwxMzkuMzM3MTMuNTA2NDUsMjEuMDQxNSwxLjM2MjEzLDMwLjM3NjQsNC43MzkyNCw0OC44MzgxMiw2LjU4NzE2LDE5LjgzNDA3LDEuOTg1MjgsNDguODY5MzUsMi4wOTA1MSw3Ny4zOTY1NiwyLjA0MzQxLDU5LjM5NzIxLS4wOTgwNywxMjAuMzEzNy0uNzA4MjksMTgyLjQyOTk0LTEuODI3NDcsMjUuOTQ0ODYtLjQ2NzQ1LDUzLjEzLTEuMDc1Miw4MC43Mzc2MS0zLjMwMjg5czU1Ljc2NjIzLTYuNTI1OTEsNjEuNTkwNzYtMTAuNTU1MyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiNmZmYiLz48L2c+PHBhdGggZD0iTTEwOTkuMjU5MTEsMTcyLjA0ODE4Yy0uNDYtMS4xOC0uOTYtMi4zNS0xLjQ4LTMuNDkuODQuMzMsMS42ODAwNi42OSwyLjUxLDEuMDhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzZjNjNmZiIvPjxwYXRoIGQ9Ik02NDguNzQ0ODIsMzE0LjU4NDNjLTcuNjY5MzUtMTIuNjg0NDUtMTYuNzU3MjEtMjYuMjI3NjctMzAuOTg5NTUtMzAuMzY5NTMtMTYuNDgyLTQuNzk2NS0zMy40MTMxOSw0LjczMTkzLTQ3Ljc3NDczLDE0LjEzNDUzYTEzOTIuMTU2OTIsMTM5Mi4xNTY5MiwwLDAsMC0xMjMuODkzMzgsOTEuMjgzMTFsLjA0MzMxLjQ5MjM5cTQ2LjIyNTU2LTMuMTg3ODEsOTIuNDUxLTYuMzc1NTVjMjIuMjY1MzItMS41MzU0Niw0NS4yOTU1Ny0zLjI4MjcsNjQuOTcxOTUtMTMuODE1Niw3LjQ2NjUyLTMuOTk2ODMsMTQuNzQ0NzUtOS4zMzU3OSwyMy4yMDU1NS05LjcwNzgyLDEwLjUxMTc1LS40NjIxNywxOS42NzczMyw2Ljg3OTIzLDI2Ljg4MDIsMTQuNTQ5MzEsNDIuNjA3MzIsNDUuMzcxLDU0LjkzNywxMTQuNzU0MSwxMDIuNzM4MTcsMTU0LjYxNTkyQTE1MTYuOTk0NTgsMTUxNi45OTQ1OCwwLDAsMCw2NDguNzQ0ODIsMzE0LjU4NDNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2YyZjJmMiIvPjxwYXRoIGQ9Ik05MTAuNjQ1NzYsNjk5LjQxMjdjLTQuNzExNjgtNS45NDk1OC02LjYzNjkxLTcuMzQzLTExLjI4NDU3LTEzLjM0NzYxUTg0Mi41OTY4LDYxMi42NDg3Miw3OTIuNjUzMjcsNTM0LjI3MjcycS0zMy45MjM1My01My4yMzAwNS02NC40ODI3NS0xMDguNTA0MzktMTQuNTQ4NjMtMjYuMjc4MDgtMjguMjk5NjEtNTIuOTY4NzItMTAuNjcwNDMtMjAuNjk1Mi0yMC44NjQ2LTQxLjYzNzkzYy0xLjk0MzU3LTMuOTg3ODEtMy44MzIwOS03Ljk5MzkzLTUuNzExMjItMTIuMDA5MjItNC40Mjc4OC05LjQ0MjMyLTguNzczNC0xOC45MzA0Ny0xMy40Mzk0Mi0yOC4yNDQ0OS01LjMxNjg3LTEwLjYxNTcxLTExLjc4OTA1LTIxLjc0NDg1LTIxLjU1MjU5LTI4Ljg3N2EyOS40MDQ5LDI5LjQwNDksMCwwLDAtMTUuMzE4NTUtNS44OTQ1N2MtNy45NDgtLjUxMzM3LTE1LjI4MTg1LDIuNzY4NTQtMjIuMTc1NjksNi4zNTI5NC01MC40Mzg1OCwyNi4zMDEtOTcuNjU5MjEsNTkuMjc1ODktMTQwLjM2OTU5LDk2Ljc5NzcxQTczMC43Nzc4MSw3MzAuNzc3ODEsMCwwLDAsMzQ2LjM5NzQ4LDQ4NS44Nzg0M2MtMS4wMDgsMS40MzkyNy0zLjM5MTYzLjA2NDE4LTIuMzc0MTktMS4zODQyMnE2LjAwOTM1LTguNDk4MTgsMTIuMjU2ODEtMTYuODEyODhBNzM0LjgxNzQyLDczNC44MTc0MiwwLDAsMSw1NDMuODc5NzIsMjkyLjY5NTZxMTguMjQ4MjUtMTEuODI1NzksMzcuMTgyNjktMjIuNTQyNDVjNi4zNjIwNi0zLjYwMjc1LDEyLjc1MTg4LTcuMTU5NjcsMTkuMjUxMzYtMTAuNDk2NTMsNi4zNzE0Ny0zLjI3Mjc0LDEzLjEzNjg0LTYuMjE1NDcsMjAuNDE1NjMtNi4zMjU0NywyNC43NzAxMS0uMzg1LDM3LjU5NTQsMjcuNjY3LDQ2LjQwNTA2LDQ2LjU0MjQ4cTQuMTUyODMsOC45MTA2LDguNDA2MzYsMTcuNzY2MjYsMTYuMDc0ODEsMzMuNjIxMDYsMzMuMzg3MjksNjYuNjI4LDEwLjY4NDUzLDIwLjM3OSwyMS44MzY4Myw0MC41MTk1NSwzNC43MDcxLDYyLjcxODE2LDczLjc3ODU0LDEyMi44OTdjMzQuNTA1OSw1My4xNDI5LDY4LjczNjUxLDEwMC4wODg3NCwxMDguMDQ1ODYsMTQ5Ljc4NDczQzkxMy42NzEyNCw2OTguODQ0MzMsOTExLjczNzA2LDcwMC44MDYxNSw5MTAuNjQ1NzYsNjk5LjQxMjdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2U0ZTRlNCIvPjxwYXRoIGQ9Ik00NTcuOTkxMiwzNDUuNDM1MmMtMS40MzkxMS0xLjYwNDI4LTIuODY5MjYtMy4yMDg1Ni00LjMxNzc3LTQuODEyODQtMTEuNDIyNDQtMTIuNjMyNTktMjMuNjc4OC0yNS4xMTg0Ny0zOS4zNjQ0LTMyLjM2MDY3YTU3LjExMDIxLDU3LjExMDIxLDAsMCwwLTIzLjkyNjc4LTUuNTQ2MjJjLTguNTYyMTMuMDI3NTMtMTYuOTMxNzgsMi4yNzM0OC0yNC44NDMwNyw1LjQxNzkyLTMuNzQwMzQsMS40OTQyOC03LjM5ODMxLDMuMTkwMjEtMTEuMDAwNzgsNC45OTYxNC00LjExNjM0LDIuMDcxODItOC4xNTkyNyw0LjI4MTE4LTEyLjE4MzQsNi41MDg4M3EtMTEuMzMxMTIsNi4yNzA0NC0yMi4zNjgxNiwxMy4wOTA5LTIxLjk2MDYsMTMuNTcyMi00Mi41NDU2NSwyOS4yMTYyMy0xMC42NzExMSw4LjExMzExLTIwLjkwMTc1LDE2Ljc1Nzg4LTkuNTE1NTcsOC4wMzA1Mi0xOC42NDYxOCwxNi40OTJjLTEuMzAxNjgsMS4yMDA5MS0zLjI0NTI2LS43NDI1NS0xLjk0MzU4LTEuOTQzNDcsMS42MDQyOC0xLjQ5NDI4LDMuMjI2OTItMi45NzkzOCw0Ljg0OTU1LTQuNDQ2MTJxNi44NzU0OS02LjIxNTQ3LDEzLjk3MTItMTIuMTkyNTgsMTIuOTM5MjEtMTAuOTE4MjcsMjYuNTQ4NTEtMjAuOTkzMTIsMjEuMTYyOTUtMTUuNjc2MTQsNDMuNzgyODktMjkuMjI1NCwxMS4zMDM2LTYuNzY1NDcsMjIuOTE4MjktMTIuOTYyNmMyLjMzNzkzLTEuMjQ2NzQsNC43MDMxNy0yLjQ2Niw3LjA5NTcxLTMuNjIxMWExMTMuMTE0MzUsMTEzLjExNDM1LDAsMCwxLDE2Ljg2Nzc4LTYuODY2MzEsNjAuMDA2MjYsNjAuMDA2MjYsMCwwLDEsMjUuNDc2LTIuNTAyNjYsNjYuMzI3MjUsNjYuMzI3MjUsMCwwLDEsMjMuNTA1MTIsOC4xMzE0YzE1LjQwMDkxLDguNjA4MTIsMjcuMzQ1NzMsMjEuOTE5LDM4Ljk3MDA1LDM0LjkwOTE2QzQ2MS4xMDg0NCwzNDQuODAyNjUsNDU5LjE3MzgyLDM0Ni43NTUyOSw0NTcuOTkxMiwzNDUuNDM1MloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjZTRlNGU0Ii8+PHBhdGggZD0iTTc3My41NTE2Niw0NzYuMzQyMTZsMzYuOTA0NjItMTMuNDk4LDE4LjMyMzI3LTYuNzAxODJjNS45Njc1OC0yLjE4MjY3LDExLjkyMDgyLTQuNjY3NDcsMTguMDg5ODktNi4yMzAzN2EyOC41Mzg2OCwyOC41Mzg2OCwwLDAsMSwxNi4zNzM1NS4yMDg2MiwzNy43MzczMSwzNy43MzczMSwwLDAsMSwxMi43NzEsNy45MTY2NywxMDMuNjM4NzEsMTAzLjYzODcxLDAsMCwxLDEwLjQ3NDg4LDExLjE4NjQyYzMuOTg5MzIsNC43OTQyNiw3LjkxOTcsOS42Mzg3OCwxMS44Njc3MiwxNC40NjcwNnEyNC40NDEzNSwyOS44OTA5Myw0OC41NjMwNiw2MC4wNDEzNCwyNC4xMjExOCwzMC4xNDk5MSw0Ny45MTk4MSw2MC41NTYsMjMuODU2ODEsMzAuNDgwNDIsNDcuMzg1NDgsNjEuMjE1NzMsMi44ODIzLDMuNzY1MTksNS43NTk2Nyw3LjUzNDE1YzEuMDU5OCwxLjM4ODA5LDMuNDQ5NDguMDE5NjIsMi4zNzQ3MS0xLjM4ODA3cS0yMy43MDIyNS0zMS4wNDQ0MS00Ny43MzQ5MS02MS44MzQ2NC0yNC4wOTE3Ny0zMC44NjM4My00OC41MTY0Ni02MS40NjU4Ni0yNC40MjQyMy0zMC42MDE0Mi00OS4xNzg1NC02MC45Mzc0NC02LjE2Ny03LjU1NzYtMTIuMzU0NDQtMTUuMDk4NThjLTMuNDc5NTQtNC4yNDA3Mi02LjkxOTg0LTguNTI3MTgtMTAuNzM2MjktMTIuNDc0MjYtNy4wMDUzOC03LjI0NTE2LTE1Ljc1NzcyLTEzLjY0Nzk0LTI2LjIzNDM3LTEzLjgyMTY3LTYuMTU5NzItLjEwMjE0LTEyLjEyMSwxLjg1MjQ4LTE3Ljg0NCwzLjkyMjg4LTYuMTY5NjcsMi4yMzItMTIuMzI0NTUsNC41MDU3MS0xOC40ODYzMiw2Ljc1OTRMNzgyLjExMTIzLDQ3MC4yOTIxbC05LjI5MDY4LDMuMzk4MTFjLTEuNjQ4NzQuNjAzLS45MzY1LDMuMjYxODkuNzMxMTEsMi42NTE5NVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjZTRlNGU0Ii8+PHBhdGggZD0iTTQwOS40NTI0OCwzMjQuMTU3MzNjLTE4Ljc1NDExLTkuNjM4NjYtNDIuNzcxMzctNy43NTA4Ny02MC4wMDUwNyw0LjI5MTE5QTg1NS44NDUzMiw4NTUuODQ1MzIsMCwwLDEsNDQ2LjgxOCwzNTEuMTc0MzRDNDMzLjUzNTM3LDM0My4zOTA0LDQyMy4xNDUyMSwzMzEuMTk0NzUsNDA5LjQ1MjQ4LDMyNC4xNTczM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjZjJmMmYyIi8+PHBhdGggZD0iTTM0OS4yNjI4MiwzMjguNDE1MzQsMzQ1LjY1MjQsMzMxLjM1YzEuMjIxMjMtMS4wMjcxMywyLjQ5MDgtMS45OTAxMywzLjc5NS0yLjkwMTQ0QzM0OS4zODU4LDMyOC40Mzc4OSwzNDkuMzI0NDIsMzI4LjQyNiwzNDkuMjYyODIsMzI4LjQxNTM0WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiNmMmYyZjIiLz48cGF0aCBkPSJNODc0LjYyNDM2LDQ3Ni40NzdjLTMuNjMyNzktNC40MjIwNi03LjU2MDQ2LTkuMDUyMjItMTIuOTk0MjEtMTAuODQ4MzZsLTUuMDczMDguMjAwMDlhNTc1LjQzNjI5LDU3NS40MzYyOSwwLDAsMCwxNTMuMjY3MjksMTc1LjIyMDU2UTk0Mi4yMjQzNyw1NTguNzYzMTcsODc0LjYyNDM2LDQ3Ni40NzdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2YyZjJmMiIvPjxwYXRoIGQ9Ik0xMDg2LjY2OTE1LDY5OC40NDgyYy0xMC41NjAwNiwyMS4zMy0yNy4yMywzOS45Ny00Ni4zOSw1NC4zNS0yOS4zNywyMi4wNS02NC4zMywzNS4zLTk5LjMyLDQ2LjQ4LTE5Ny42Miw2My4xNy00MTMuNDgsNjguMDUtNjEzLjc1LDEzLjg4LTU1LjQtMTQuOTgtMTExLjA4LTM1LjIyLTE1NC4xNy03My4xM2ExOTcuMzQ0NjgsMTk3LjM0NDY4LDAsMCwxLTM1Ljc0LTQxLjYxYzU3LjM1LTMxLjUyLDEyNi44Ni00My40LDE5My4xOS00MS45NSw5NS4wOSwyLjA4LDE4Ny45NiwyNy40NiwyODIuMTYsNDAuNTlhMTEwMi42NjksMTEwMi42NjksMCwwLDAsMzM0LjA0LTQuNmMzOC4zMTk5NC02LjQzLDc3Ljk4LTE0Ljg0LDExNS40OS00LjY2QTk1LjE0OTU0LDk1LjE0OTU0LDAsMCwxLDEwODYuNjY5MTUsNjk4LjQ0ODJaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzNmM2Q1NiIvPjxjaXJjbGUgY3g9IjE3OS4zMTgyOCIgY3k9IjUxIiByPSI1MSIgZmlsbD0iI2NjYyIvPjxwYXRoIGQ9Ik0zNjIuMzA4OTIsOTcuODQwNDJDMzQ4LjgxMTg1LDgzLjY4MTYsMzMzLjEzNjQzLDcwLjc2NSwzMTQuNTc5NjEsNjMuOTM5NDhhNzYuNzE1MjEsNzYuNzE1MjEsMCwwLDAtMTUuOTg2MzMtNC4wMTczNGMtLjA0Mzg4LS4wMDYtLjA4NTQ1LjAwMjg3LS4xMjkwOS0uMDAwNjdhMi4zNTU3NiwyLjM1NTc2LDAsMCwwLS4yNjk2NS0uMDUyOTIsNjEuNTM4OCw2MS41Mzg4LDAsMCwwLTIyLjg0MTMxLDEuMzc5LDYzLjEwNzM1LDYzLjEwNzM1LDAsMCwwLTEwLjYzNTE5LDMuNzA0OSw5My4wMDQ2Nyw5My4wMDQ2NywwLDAsMC05Ljk3OTQzLDUuNjU1NTdBNjQuOTA4MzIsNjQuOTA4MzIsMCwwLDEsMjMyLjY4NjMsNzguODM0OGE3NC4xODc3LDc0LjE4NzcsMCwwLDEtMTEuODQ0MDYsMS4xNjI0OGMtMy40NDcxNC4wNjkxNS02LjY5OC4xODg5LTkuOTY0LDEuNDM0MjZhMjMuOTE1NzMsMjMuOTE1NzMsMCwwLDAtMTQuNTY0OTQsMTUuNzcwNTEsMS41NTA3OCwxLjU1MDc4LDAsMCwwLC42ODkzMywxLjY5NGMuODgzNDkuNjMyNzUsMS43NDQ3NiwxLjM1MDY1LDIuNjczLDEuOTE0MzdhOC4zMzkyMiw4LjMzOTIyLDAsMCwwLDIuNjExLjcxMjA5cTIuMjEzNjYuNDY3MTEsNC40MzI5Mi45MDY5Myw4LjE3NTg0LDEuNjE5OTIsMTYuNDE5NjIsMi44Njc5MiwxNi42ODEsMi41MjUyLDMzLjU0MjE3LDMuNTU3NTVhMzczLjQ4MTMyLDM3My40ODEzMiwwLDAsMCw2Ny41MTAyNi0yLjAyOUEzNzQuNzcxNDQsMzc0Ljc3MTQ0LDAsMCwwLDM2MS42NDcsMTAwLjM0NzUsMS41MTM5LDEuNTEzOSwwLDAsMCwzNjIuMzA4OTIsOTcuODQwNDJaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2YwZjBmMCIvPjxwYXRoIGQ9Ik0yMDguNTc5NjEsMTMxLjkzOTQ4YTc2LjcxNTIxLDc2LjcxNTIxLDAsMCwwLTE1Ljk4NjMzLTQuMDE3MzRjLS4wNDM4OC0uMDA2LS4wODU0NS4wMDI4Ny0uMTI5MDktLjAwMDY3YTIuMzU1NzYsMi4zNTU3NiwwLDAsMC0uMjY5NjUtLjA1MjkyLDYxLjUzODgsNjEuNTM4OCwwLDAsMC0yMi44NDEzMSwxLjM3OSw2My4xMDczNSw2My4xMDczNSwwLDAsMC0xMC42MzUxOSwzLjcwNDksOTMuMDA0NjcsOTMuMDA0NjcsMCwwLDAtOS45Nzk0Myw1LjY1NTU3LDY0LjkwODMyLDY0LjkwODMyLDAsMCwxLTIyLjA1MjMxLDguMjI2ODEsNzQuMTg3Nyw3NC4xODc3LDAsMCwxLTExLjg0NDA2LDEuMTYyNDhjLTMuNDQ3MTQuMDY5MTUtNi42OTguMTg4OS05Ljk2NCwxLjQzNDI2YTIzLjkxNTczLDIzLjkxNTczLDAsMCwwLTE0LjU2NDk0LDE1Ljc3MDUxLDEuNTUwNzgsMS41NTA3OCwwLDAsMCwuNjg5MzMsMS42OTRjLjg4MzQ5LjYzMjc1LDEuNzQ0NzYsMS4zNTA2NSwyLjY3MywxLjkxNDM3YTguMzM5MjIsOC4zMzkyMiwwLDAsMCwyLjYxMS43MTIwOXEyLjIxMzY2LjQ2NzEyLDQuNDMyOTIuOTA2OTMsOC4xNzU4NCwxLjYxOTkyLDE2LjQxOTYyLDIuODY3OTIsMTYuNjgxLDIuNTI1MiwzMy41NDIxNywzLjU1NzU1YTM3My40ODEzMiwzNzMuNDgxMzIsMCwwLDAsNjcuNTEwMjYtMi4wMjlBMzc0Ljc3MTQ0LDM3NC43NzE0NCwwLDAsMCwyNTUuNjQ3LDE2OC4zNDc1YTEuNTEzOSwxLjUxMzksMCwwLDAsLjY2MTkzLTIuNTA3MDhDMjQyLjgxMTg1LDE1MS42ODE2LDIyNy4xMzY0MywxMzguNzY1LDIwOC41Nzk2MSwxMzEuOTM5NDhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2YwZjBmMCIvPjxwb2x5Z29uIHBvaW50cz0iMTA0Ny40MTEgNTg4LjE0MiAxMDc0LjU3NiA1NjcuNTE4IDEwODcuODE2IDU4MC43NTkgMTA0My41NjMgNjExLjA0MiAxMDQ3LjQxMSA1ODguMTQyIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTEwNDguOTE2MzUsNjk0LjQyNzgxSDk1NS45OTI2OWwzLjI1OTA3LTEwLjU1OTg3LDAsMGMyMC4xOTkzLTcuMzEyMjcsOC44NTMzMy0yMy4wMjk1NywyOC4wNjc1MS0zMi42MzY2Niw0Ni45OTY4LTIzLjQ5ODQsNjUuMTkxMTgtOTMuNjIwMDYsNTguMzA5MzItMTIxLjMzOTM1bDMwLjc5OC0xLjMwMjIxUzExMTguOTU4NzcsNjQ5LjM3NDc2LDEwNDguOTE2MzUsNjk0LjQyNzgxWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMyZjJlNDEiLz48cGF0aCBkPSJNMTEyOC4yNDY1Myw2NDQuNzg4ODhhMTUuNjE4OTMsMTUuNjE4OTMsMCwwLDEtMjAuMTgyNzIuMzc3NTlsLS4wNjA0LS4wNDk2MS0uMDAyMDctLjA3NzY3YTE0Ljk2NDgzLDE0Ljk2NDgzLDAsMCwwLS42LTMuODE5MzYsMTAuNjkwNzcsMTAuNjkwNzcsMCwwLDEtLjM4ODE4LDIuNjQzNjZsLS4wNzc4NC4yODk5MS0uMjA4NzMtLjIxNTQ5Yy0uMTgwMjctLjE4NTg5LS4zNTQ3NC0uMzc0NzItLjUxODU5LS41NjFhMTUuNzUwODgsMTUuNzUwODgsMCwwLDEtMi4zOTktMy42MzI2OSw0NS45MTYyMyw0NS45MTYyMywwLDAsMC0xMi43NC0xNS44Nzk3MiwyMi4yOTIzNywyMi4yOTIzNywwLDAsMS0yLjY3MjctMi41NzE3MiwyMi4wMzQxNSwyMi4wMzQxNSwwLDAsMSwyNy42Njk1NS0zMy41NjkxMWwuMTM3NjcuMDgwNi0uMDcxNDguMTQyNWExMS40Nzc1NiwxMS40Nzc1NiwwLDAsMS0yLjA0Nzg4LDIuOTU0LDE0Ljk2ODI5LDE0Ljk2ODI5LDAsMCwwLDMuMTUzOTUtMi4yNzg2NWwuMTAwMDYtLjA5NDM2LjExMzM3LjA3ODE4YTIyLjEyNzkzLDIyLjEyNzkzLDAsMCwxLDQuMDI5NCwzLjU4NjdsLjEyODQ0LjE0NzI2YTkuODM2NDMsOS44MzY0MywwLDAsMCw3LjI4Mzc1LDMuMzYxMjMsMTUuNjE0LDE1LjYxNCwwLDAsMSwxNS4xMTk0NywxOC4yOTI5MWwtLjAxNzY5LjEwMzE1LS4xMDAzNC4wMzA0YTEzLjM5ODY2LDEzLjM5ODY2LDAsMCwxLTUuNDU2OTQuNjgwODgsMTUuMjIyMDgsMTUuMjIyMDgsMCwwLDAsNC44NjA2MSwxLjIxNzRsLjIxNjU0LjAxNzE4LS4wNjg3NC4yMDYxOWExNS42MDM1LDE1LjYwMzUsMCwwLDEtNC41MDMzOSw2Ljc5bC0uMDU5MjguMDUxODctLjA2Mjk0LjA1NTA5YTE1LjMzMjksMTUuMzMyOSwwLDAsMC01LjI5NywxMC42NDI3MkExNS43MzM0NSwxNS43MzM0NSwwLDAsMSwxMTI4LjI0NjUzLDY0NC43ODg4OFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PHBhdGggZD0iTTExMzEuMDg5LDYzOS43NjkzNGExNS41NzQxOCwxNS41NzQxOCwwLDAsMS0uMTc1NiwxLjY3ODk0LDE1Ljc4NTIxLDE1Ljc4NTIxLDAsMCwwLDIuNTM3NzItNy44MjA0N2MuMDIwNzEtLjQyNjM3LjA2NTQ2LS44NTExLjEyNTQ5LTEuMjczOTNBMTQuODE0MSwxNC44MTQxLDAsMCwwLDExMzEuMDg5LDYzOS43NjkzNFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTExMzYuMDAzMzEsNjIwLjc4OWExNS4xOTgxNSwxNS4xOTgxNSwwLDAsMCwzLjg4NDE4LDEuMDk4MjIsMTUuNjMsMTUuNjMsMCwwLDAsMS40MjMyMi0xLjczNjQ3QTEzLjI0MzYzLDEzLjI0MzYzLDAsMCwxLDExMzYuMDAzMzEsNjIwLjc4OVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTExNDEuNzI3MzYsNjE1LjY2MDgyYTE1LjcwOTA3LDE1LjcwOTA3LDAsMCwxLS4xMTExMiw0LjA1MTk0LDE1LjUyOTA4LDE1LjUyOTA4LDAsMCwwLDEuNzU3NTgtMy42MjQ1NWwuMDY4NzQtLjIwNjItLjIxNjU1LS4wMTcxOEExNS4wOTQ3MiwxNS4wOTQ3MiwwLDAsMSwxMTQxLjcyNzM2LDYxNS42NjA4MloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTExNDAuMjgyNDEsNjAwLjgzOTY3YTE1LjY1MDc5LDE1LjY1MDc5LDAsMCwwLTExLjQ2MTQ5LTUuMjk5NTgsOS44MzY0OSw5LjgzNjQ5LDAsMCwxLTcuMjgzNzgtMy4zNjEyNGwtLjEyODQzLS4xNDcyNmEyMi4xMjc4NSwyMi4xMjc4NSwwLDAsMC00LjAyOTM5LTMuNTg2NjlsLS4xMTMzOC0uMDc4MTctLjEwMDA1LjA5NDM0YTE0Ljk2NzYsMTQuOTY3NiwwLDAsMS0zLjE1NCwyLjI3ODY1LDExLjQ3ODMyLDExLjQ3ODMyLDAsMCwwLDIuMDQ3OTQtMi45NTRsLjA3MTQ2LS4xNDI1LS4xMzc2Ni0uMDgwNTlhMjIuMDE3NzcsMjIuMDE3NzcsMCwwLDAtMzIuNjIxMTMsMTQuMjU0MiwyMi4wMjE4MiwyMi4wMjE4MiwwLDAsMSwzMC4yNTktOC4xMTI2OGwuMTM3NjUuMDgwNTktLjA3MTQ1LjE0MjVhMTEuNDc4MTQsMTEuNDc4MTQsMCwwLDEtMi4wNDc5NCwyLjk1NCwxNC45Njc1NCwxNC45Njc1NCwwLDAsMCwzLjE1NC0yLjI3ODY1bC4xMDAwNi0uMDk0MzQuMTEzMzguMDc4MTdhMjIuMTI4NTcsMjIuMTI4NTcsMCwwLDEsNC4wMjkzOSwzLjU4NjdsLjEyODQzLjE0NzI1YTkuODM2NDMsOS44MzY0MywwLDAsMCw3LjI4Mzc3LDMuMzYxMjQsMTUuNjE2NzUsMTUuNjE2NzUsMCwwLDEsMTUuMTAzNDcsMTIuODM0ODgsMTguOTI3MTQsMTguOTI3MTQsMCwwLDAsMi4yNjAwNS0uNTVsLjEwMDM0LS4wMzAzOS4wMTc3Ni0uMTAzMTRBMTUuNTU0LDE1LjU1NCwwLDAsMCwxMTQwLjI4MjQxLDYwMC44Mzk2N1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTExNzMuMTU5MTMsNTM2LjU0MDY1YTUwLjI5MTQxLDUwLjI5MTQxLDAsMCwxLTQyLjAwNyw0OS41OTk2NWwtLjI0ODQuMDQwNTMtLjE5MjE5LS4xNjAxNmE0OC4xODU2NSw0OC4xODU2NSwwLDAsMC0xMC41MTAwOC02LjY3MTU5LDM0LjQyMzE2LDM0LjQyMzE2LDAsMCwxLDUuNTY2Miw2LjU2MDQ3bC41MzUzNy44MDQ2OS0uOTY0ODUuMDQ2NDFjLS44MzI4LjA0MDUzLTEuNjYwMzguMDYwOC0yLjQ1OTE5LjA2MDhhNTAuNzE1NTQsNTAuNzE1NTQsMCwwLDEtMTMuODg0NDUtMS45MjUxM2MtMjAuNTE3NDgtNS44Mzc0OC00Mi41NTAyMi02LjgzNTY3LTY1LjQ4NTcxLTIuOTY3MTFhNzEuNzc4NTYsNzEuNzc4NTYsMCwwLDEtMTEuOTAxNDcuOTkzQTcwLjk0Nzg3LDcwLjk0Nzg3LDAsMCwxLDEwMDkuMjg3LDQ0NC42MzcyM2wuNDg3NjUtLjE2MTQ2LjE5MjUxLjQ3NTg5YTM2Ljk1NjU5LDM2Ljk1NjU5LDAsMCwxLDIuNzg3LDExLjIzMzA2LDQ4LjE5NjM1LDQ4LjE5NjM1LDAsMCwwLDEuMTk3ODktMTIuNDcxMTZsLS4wMTUzNi0uNDQyNTUuNDMwMTMtLjEwNzg2YTcxLjI0OTM5LDcxLjI0OTM5LDAsMCwxLDE3LjI0MDUxLTIuMTE0N2wuNjI5MTguMDAyNjJhMzEuNjcyMjgsMzEuNjcyMjgsMCwwLDAsMjMuNjE2LTEwLjQ2MjM3LDUwLjI3NTY4LDUwLjI3NTY4LDAsMCwxLDc2LjM4MDE2LDIuMzQ2MTFsLjIxMTguMjYyMTMtLjEzOTkuMzA3MjNjLTIuOTM3NjksNi40NzQ4NC02LjEzODE4LDExLjE5MTg5LTkuOTU4MzYsMTQuNjQxNDNhNDkuMDEzNDMsNDkuMDEzNDMsMCwwLDAsMTMuMjc5NzgtOS4xNjI4MmwuNTAyLS40ODcuMzUyMzQuNjA0NjZBNTAuMjQyMTQsNTAuMjQyMTQsMCwwLDEsMTE0My4zMiw0NjQuNDI3OGwtLjAwMDY1LjI1MzYzYy0uMDAwNjUuMDg5NTYtLjAwMDY1LjE3OTc3LS4wMDA2NS4yNjkzMiwwLDEzLjYxMzE3LDUuMjY0MTksMjYuNTE1NzcsMTQuNDY2ODksMzUuNDM5MzRBNTAuNjYwMjEsNTAuNjYwMjEsMCwwLDEsMTE3My4xNTkxMyw1MzYuNTQwNjVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzNmM2Q1NiIvPjxnIG9wYWNpdHk9IjAuMTUiPjxwYXRoIGQ9Ik0xMTExLjY4ODY4LDQxNy43MTcxM2EzNS41MTksMzUuNTE5LDAsMCwxLTYuMzM1MDksNy43NzE1OSw0OC44ODkyOSw0OC44ODkyOSwwLDAsMCw5Ljg5ODIzLTYuMTg2NVExMTEzLjUwMjI4LDQxOC40NDAzOCwxMTExLjY4ODY4LDQxNy43MTcxM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PHBhdGggZD0iTTExNDAuNzkyOTMsNDc3LjczMzIzYTUwLjQ4MTkxLDUwLjQ4MTkxLDAsMCwxLDcuMjI5ODEsOC44MDc3NSw1MS4zOTI4OCw1MS4zOTI4OCwwLDAsMS00LjcwNDA1LTIxLjU5MDIyYzAtLjA4OTU3LDAtLjE3OTc4LjAwMDY1LS4yNjkzMmwuMDAwNjQtLjI1MzY0YTUwLjI0MjQ1LDUwLjI0MjQ1LDAsMCwwLTYuODM5NTYtMjUuMzI3MzVsLS4zNTIzNS0uNjA0NjgtLjUwMjA3LjQ4N2E0OS4xMjYxNiw0OS4xMjYxNiwwLDAsMS05LjE3MDQzLDYuOTgzQTQ4Ljk3MTg1LDQ4Ljk3MTg1LDAsMCwwLDExNDAuNzkyOTMsNDc3LjczMzIzWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiLz48cGF0aCBkPSJNMTEyNi4zMjczMyw0NDEuNzcwOTNsLS4wMDA2NS4yNTM2NGMtLjAwMDY0LjA4OTU0LS4wMDA2NC4xNzk3NS0uMDAwNjQuMjY5MzEsMCwuNDkzNTUuMDA4OTQuOTg1ODUuMDIyNzIsMS40NzczOWE1Mi4zNjQ4LDUyLjM2NDgsMCwwLDAsNS45NTU4Ny0xMC4yNjcwOWwuMTM5ODUtLjMwNzI1LS4yMTE3Ni0uMjYyMTJhNTAuNjg4MTEsNTAuNjg4MTEsMCwwLDAtOS4wOTYtOC43OTczM0E1MC4zNTYyMSw1MC4zNTYyMSwwLDAsMSwxMTI2LjMyNzMzLDQ0MS43NzA5M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PHBhdGggZD0iTTExNTcuNzg1NTksNTAwLjM5MDFhNDUuNDU5MzQsNDUuNDU5MzQsMCwwLDEtNi40MDgzOC03Ljc5NjY2LDUwLjIyOTcsNTAuMjI5NywwLDAsMS0zNy4yMTc3Miw3MC44OWwtLjI0ODQxLjA0MDU0LS4xOTIxNy0uMTYwMTZhNDguMTg4LDQ4LjE4OCwwLDAsMC0xMC41MTAxLTYuNjcxNTksMzQuNDIyNjIsMzQuNDIyNjIsMCwwLDEsNS41NjYxNyw2LjU2MDQ2bC41MzU0LjgwNDcxLS45NjQ4Mi4wNDY0Yy0uODMyODYuMDQwNTQtMS42NjA0MS4wNjA4LTIuNDU5Mi4wNjA4YTUwLjcxNTQ5LDUwLjcxNTQ5LDAsMCwxLTEzLjg4NDQ4LTEuOTI1MTRjLTIwLjUxNzQ5LTUuODM3NDctNDIuNTUwMjItNi44MzU2Ni02NS40ODU3LTIuOTY3MWE3MS43NzkzLDcxLjc3OTMsMCwwLDEtMTEuOTAxNDUuOTkzLDcwLjYyMzg5LDcwLjYyMzg5LDAsMCwxLTQ3LjEyLTE3Ljk2OSw3MS4wMTExOCw3MS4wMTExOCwwLDAsMCw2NC4xMTI3LDQwLjYyNTksNzEuNzc5NDcsNzEuNzc5NDcsMCwwLDAsMTEuOTAxNDUtLjk5Mjk0YzIyLjkzNTQ3LTMuODY4NTcsNDQuOTY4MjEtMi44NzAzNyw2NS40ODU3LDIuOTY3MDlhNTAuNzE1NDMsNTAuNzE1NDMsMCwwLDAsMTMuODg0NDgsMS45MjUxNGMuNzk4NzgsMCwxLjYyNjM0LS4wMjAyNiwyLjQ1OTE5LS4wNjA4bC45NjQ4My0uMDQ2NC0uNTM1NC0uODA0NzFhMzQuNDIyNjMsMzQuNDIyNjMsMCwwLDAtNS41NjYxOC02LjU2MDQ1LDQ4LjE4Nzc0LDQ4LjE4Nzc0LDAsMCwxLDEwLjUxMDExLDYuNjcxNTlsLjE5MjE3LjE2MDE2LjI0ODQxLS4wNDA1NWE1MC4yNTM5Miw1MC4yNTM5MiwwLDAsMCwyNi42MzM0NC04NS43NTAxOVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PC9nPjxwb2x5Z29uIHBvaW50cz0iMTM0LjAzNSA1NjAuOTczIDk3LjIyMyA1MzMuMDI1IDc5LjI4IDU1MC45NjggMTM5LjI1IDU5Mi4wMDcgMTM0LjAzNSA1NjAuOTczIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTE5NS4yMSw2ODcuNDI3ODFoMTI1LjkyNjZMMzE2LjcyLDY3My4xMTc0N2wwLDBjLTI3LjM3MzMyLTkuOTA5My0xMS45OTc2OS0zMS4yMDg3OS0zOC4wMzYtNDQuMjI4LTYzLjY4ODI3LTMxLjg0NDE0LTg4LjM0NDYtMTI2Ljg3MDM1LTc5LjAxODU2LTE2NC40MzQ0N2wtNDEuNzM2MjUtMS43NjQ3MVMxMDAuMjkxMTMsNjI2LjM3MzY0LDE5NS4yMSw2ODcuNDI3ODFaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik04MC41NTM2NSw2MDUuMjUyMTlhMjAuNzc4NiwyMC43Nzg2LDAsMCwwLTcuMTc4MzMtMTQuNDIyNjFjLS4wMjgzLS4wMjQ4OS0uMDU2ODEtLjA1LS4wODUyOS0uMDc0NjVsLS4wODAzNC0uMDcwM2EyMS4xNDUzOSwyMS4xNDUzOSwwLDAsMS02LjEwMjgzLTkuMjAxNDhsLS4wOTMxNS0uMjc5NDIuMjkzNDUtLjAyMzI5YTIwLjYyODMsMjAuNjI4MywwLDAsMCw2LjU4NjkxLTEuNjQ5NzcsMTguMTU3MjYsMTguMTU3MjYsMCwwLDEtNy4zOTUtLjkyMjdsLS4xMzYtLjA0MTItLjAyNC0uMTM5NzlhMjEuMTU5NTMsMjEuMTU5NTMsMCwwLDEsMjAuNDg5MzItMjQuNzg5ODUsMTMuMzI5ODcsMTMuMzI5ODcsMCwwLDAsOS44NzA2Ni00LjU1NWwuMTc0MDYtLjE5OTU2YTI5Ljk4NjgsMjkuOTg2OCwwLDAsMSw1LjQ2MDQ5LTQuODYwNTVsLjE1MzY0LS4xMDYuMTM1NTkuMTI3ODZhMjAuMjg0NSwyMC4yODQ1LDAsMCwwLDQuMjc0MTEsMy4wODgsMTUuNTU0LDE1LjU1NCwwLDAsMS0yLjc3NTE5LTQuMDAzMTJsLS4wOTY4OC0uMTkzMTIuMTg2NTctLjEwOTIzQTI5Ljg1OTg0LDI5Ljg1OTg0LDAsMCwxLDE0MS43MDgxOCw1ODguMzE4YTMwLjIwOSwzMC4yMDksMCwwLDEtMy42MjE5NSwzLjQ4NTExLDYyLjIyNCw2Mi4yMjQsMCwwLDAtMTcuMjY0ODMsMjEuNTE5NTksMjEuMzQ0NDcsMjEuMzQ0NDcsMCwwLDEtMy4yNTEsNC45MjI4OWMtLjIyMi4yNTI0NC0uNDU4NDguNTA4MzQtLjcwMjc3Ljc2MDI2bC0uMjgyODYuMjkyLS4xMDU0OS0uMzkyODdhMTQuNDg3NDIsMTQuNDg3NDIsMCwwLDEtLjUyNi0zLjU4MjU5LDIwLjI3OTYxLDIwLjI3OTYxLDAsMCwwLS44MTMsNS4xNzU4NWwtLjAwMjgxLjEwNTI1LS4wODE4NS4wNjcyNGEyMS4xNTAzNywyMS4xNTAzNywwLDAsMS0zNC41MDE5Mi0xNS40MTg1M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PHBhdGggZD0iTTgzLjg1MjY2LDYxMy4zNTY3M2EyMS4xMDM3NCwyMS4xMDM3NCwwLDAsMCwuMjM4LDIuMjc1MjQsMjEuMzkxNTYsMjEuMzkxNTYsMCwwLDEtMy40MzktMTAuNTk4Yy0uMDI4MDYtLjU3NzgxLS4wODg3MS0xLjE1MzM5LS4xNzAwNi0xLjcyNjM5QTIwLjA3NTYyLDIwLjA3NTYyLDAsMCwxLDgzLjg1MjY2LDYxMy4zNTY3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTc3LjE5Myw1ODcuNjM1MjRhMjAuNTk2ODEsMjAuNTk2ODEsMCwwLDEtNS4yNjM3LDEuNDg4MjYsMjEuMTgwMjksMjEuMTgwMjksMCwwLDEtMS45Mjg2OC0yLjM1MzJBMTcuOTQ3MzEsMTcuOTQ3MzEsMCwwLDAsNzcuMTkzLDU4Ny42MzUyNFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTY5LjQzNiw1ODAuNjg1NzlhMjEuMjg4OTMsMjEuMjg4OTMsMCwwLDAsLjE1MDYsNS40OTEsMjEuMDQzODksMjEuMDQzODksMCwwLDEtMi4zODE4LTQuOTExODZsLS4wOTMxNi0uMjc5NDMuMjkzNDYtLjAyMzI5QTIwLjQ1MTcsMjAuNDUxNywwLDAsMCw2OS40MzYsNTgwLjY4NTc5WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIG9wYWNpdHk9IjAuMTUiLz48cGF0aCBkPSJNNzEuMzk0MTUsNTYwLjYwMDczYTIxLjIwOTMxLDIxLjIwOTMxLDAsMCwxLDE1LjUzMjE4LTcuMTgxNzksMTMuMzMsMTMuMzMsMCwwLDAsOS44NzA2OS00LjU1NWwuMTc0LS4xOTk1NWEyOS45ODcxNywyOS45ODcxNywwLDAsMSw1LjQ2MDQ4LTQuODYwNTZsLjE1MzY0LS4xMDU5My4xMzU1OS4xMjc4NWEyMC4yODM3NywyMC4yODM3NywwLDAsMCw0LjI3NDE1LDMuMDg3OTQsMTUuNTU0NzQsMTUuNTU0NzQsMCwwLDEtMi43NzUyOS00LjAwMzEybC0uMDk2ODMtLjE5MzEyLjE4NjU1LS4xMDkyMUEyOS44Mzc2NCwyOS44Mzc2NCwwLDAsMSwxNDguNTE2MjcsNTYxLjkyNWEyOS44NDMxNSwyOS44NDMxNSwwLDAsMC00MS4wMDU4NS0xMC45OTRsLS4xODY1NS4xMDkyMS4wOTY4My4xOTMxMWExNS41NTQ4LDE1LjU1NDgsMCwwLDAsMi43NzUyOSw0LjAwMzEzLDIwLjI4NDEyLDIwLjI4NDEyLDAsMCwxLTQuMjc0MTUtMy4wODc5NGwtLjEzNTU5LS4xMjc4Ni0uMTUzNjQuMTA1OTRhMjkuOTg3MTEsMjkuOTg3MTEsMCwwLDAtNS40NjA0OCw0Ljg2MDU1bC0uMTc0LjE5OTU2YTEzLjMzLDEzLjMzLDAsMCwxLTkuODcwNjksNC41NTVBMjEuMTYzMTYsMjEuMTYzMTYsMCwwLDAsNjkuNjU5NzUsNTc5LjEzNWEyNS42NDg0NSwyNS42NDg0NSwwLDAsMS0zLjA2MjczLS43NDUyOWwtLjEzNi0uMDQxMTgtLjAyNDA3LS4xMzk3OEEyMS4wNzgyNCwyMS4wNzgyNCwwLDAsMSw3MS4zOTQxNSw1NjAuNjAwNzNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgb3BhY2l0eT0iMC4xNSIvPjxwYXRoIGQ9Ik00Ny42NzQ1NCw0MjQuNDc1MjljMTIuNDcxMTQtMTIuMDkyODksMTkuNjA1LTI5LjU3OCwxOS42MDUtNDguMDI2LDAtLjEyMTM2LDAtLjI0MzYxLS4wMDA4OS0uMzY1bC0uMDAwODgtLjM0MzcyYTY4LjA4NjExLDY4LjA4NjExLDAsMCwxLDkuMjY4NzYtMzQuMzIyNjZsLjQ3NzQ4LS44MTk0Mi42ODAzNC42NmE2Ni40MjEyMiw2Ni40MjEyMiwwLDAsMCwxNy45OTYyNSwxMi40MTcxMWMtNS4xNzctNC42NzQ2OS05LjUxNDE0LTExLjA2NzA2LTEzLjQ5NTItMTkuODQxNWwtLjE4OTU3LS40MTYzNi4yODctLjM1NTIzYTY4LjEzMTY4LDY4LjEzMTY4LDAsMCwxLDEwMy41MDc0OS0zLjE3OTM1LDQyLjkyMTEsNDIuOTIxMSwwLDAsMCwzMi4wMDM0OCwxNC4xNzgybC44NTI2NC0uMDAzNTVhOTYuNTU0NjcsOTYuNTU0NjcsMCwwLDEsMjMuMzYzNjksMi44NjU3NmwuNTgyODkuMTQ2MTctLjAyMDgxLjU5OTczYTY1LjMxMzA3LDY1LjMxMzA3LDAsMCwwLDEuNjIzMzQsMTYuOTAwNDQsNTAuMDgyMjcsNTAuMDgyMjcsMCwwLDEsMy43NzY4Ni0xNS4yMjI2MmwuMjYwODktLjY0NDkxLjY2MDg1LjIxODgxYTk2LjE0NTg1LDk2LjE0NTg1LDAsMCwxLTMwLjI0NzcxLDE4Ny4zOTg0OEE5Ny4yNzE5Miw5Ny4yNzE5MiwwLDAsMSwyMDIuNTM4LDUzNC45NzRjLTMxLjA4MTMtNS4yNDI1My02MC45MzkyMy0zLjg4OTgyLTg4Ljc0Mzc0LDQuMDIwOTJhNjguNzI3ODcsNjguNzI3ODcsMCwwLDEtMTguODE1NjcsMi42MDg4NmMtMS4wODI1MiwwLTIuMjA0LS4wMjc0Ny0zLjMzMjYxLS4wODIzOWwtMS4zMDc1My0uMDYyOUw5MS4wNjQsNTQwLjM2OGE0Ni42NDk2OCw0Ni42NDk2OCwwLDAsMSw3LjU0MzEtOC44OTA1LDY1LjI5OTgxLDY1LjI5OTgxLDAsMCwwLTE0LjI0Mjg2LDkuMDQxMWwtLjI2MDQ1LjIxNy0uMzM2NjItLjA1NDkyQTY4LjEwMjE5LDY4LjEwMjE5LDAsMCwxLDQ3LjY3NDU0LDQyNC40NzUyOVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PGcgb3BhY2l0eT0iMC4xNSI+PHBhdGggZD0iTTExMC4xNDMyOCwzMTIuNDRhNDguMTM0MzgsNDguMTM0MzgsMCwwLDAsOC41ODUwOCwxMC41MzE3Niw2Ni4yNTI4Myw2Ni4yNTI4MywwLDAsMS0xMy40MTM3LTguMzgzNzFRMTA3LjY4NTU2LDMxMy40MjAxNiwxMTAuMTQzMjgsMzEyLjQ0WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiLz48cGF0aCBkPSJNNzAuNzAyMzEsMzkzLjc3MTU3YTY4LjQxMSw2OC40MTEsMCwwLDAtOS43OTc1NiwxMS45MzU5Miw2OS42NDU3Nyw2OS42NDU3NywwLDAsMCw2LjM3NDc1LTI5LjI1ODI1YzAtLjEyMTM3LDAtLjI0MzYyLS4wMDA4OC0uMzY1bC0uMDAwODctLjM0MzcyYTY4LjA4NjYxLDY4LjA4NjYxLDAsMCwxLDkuMjY4NzEtMzQuMzIyNjZsLjQ3NzUtLjgxOTQ0LjY4MDM5LjY2YTY2LjU3MzgsNjYuNTczOCwwLDAsMCwxMi40Mjc0MSw5LjQ2MzA1Qzg4Ljk3MTk0LDM2Ny4zMTA0OSw4Mi4wNDYsMzgyLjc3MTg5LDcwLjcwMjMxLDM5My43NzE1N1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PHBhdGggZD0iTTkwLjMwNTU1LDM0NS4wMzY4M2wuMDAwODcuMzQzNzJjLjAwMDg4LjEyMTM0LjAwMDg4LjI0MzU5LjAwMDg4LjM2NSwwLC42Njg4NC0uMDEyMTIsMS4zMzYtLjAzMDgsMi4wMDIxQTcwLjk2MjQsNzAuOTYyNCwwLDAsMSw4Mi4yMDUzNCwzMzMuODM0bC0uMTg5NTMtLjQxNjM3LjI4Ny0uMzU1MjJhNjguNjkwNDQsNjguNjkwNDQsMCwwLDEsMTIuMzI2NTktMTEuOTIxODFBNjguMjQwODYsNjguMjQwODYsMCwwLDAsOTAuMzA1NTUsMzQ1LjAzNjgzWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiLz48cGF0aCBkPSJNNDcuNjc0NTEsNDI0LjQ3NTNhNjEuNjA1MjUsNjEuNjA1MjUsMCwwLDAsOC42ODQ0LTEwLjU2NTc1LDY4LjA2OTM4LDY4LjA2OTM4LDAsMCwwLDUwLjQzNiw5Ni4wNjc0MWwuMzM2NjQuMDU0OTQuMjYwNDItLjIxN2E2NS4zMDI1Myw2NS4zMDI1MywwLDAsMSwxNC4yNDI4OS05LjA0MTA4LDQ2LjY0NzY3LDQ2LjY0NzY3LDAsMCwwLTcuNTQzMDYsOC44OTA0N2wtLjcyNTU2LDEuMDkwNTIsMS4zMDc1LjA2Mjg3YzEuMTI4NjUuMDU0OTQsMi4yNTAxMi4wODIzOSwzLjMzMjYxLjA4MjM5YTY4LjcyNzYyLDY4LjcyNzYyLDAsMCwwLDE4LjgxNTcyLTIuNjA4ODZjMjcuODA0NTEtNy45MTA3Miw1Ny42NjI0NC05LjI2MzQ0LDg4Ljc0MzcyLTQuMDIwOWE5Ny4yNzI2Miw5Ny4yNzI2MiwwLDAsMCwxNi4xMjgzOSwxLjM0NTYsOTUuNzA2OSw5NS43MDY5LDAsMCwwLDYzLjg1NTMtMjQuMzUwOTQsOTYuMjMxNjUsOTYuMjMxNjUsMCwwLDEtODYuODgzMDksNTUuMDU0NjdBOTcuMjcyNDUsOTcuMjcyNDUsMCwwLDEsMjAyLjUzOCw1MzQuOTc0Yy0zMS4wODEyOS01LjI0MjU0LTYwLjkzOTIyLTMuODg5ODItODguNzQzNzMsNC4wMjA5YTY4LjcyNzYzLDY4LjcyNzYzLDAsMCwxLTE4LjgxNTcyLDIuNjA4ODdjLTEuMDgyNDksMC0yLjIwNC0uMDI3NDYtMy4zMzI2MS0uMDgyNGwtMS4zMDc0OS0uMDYyODdMOTEuMDY0LDU0MC4zNjhhNDYuNjQ4MzQsNDYuNjQ4MzQsMCwwLDEsNy41NDMwNi04Ljg5MDQ3LDY1LjMwMjUzLDY1LjMwMjUzLDAsMCwwLTE0LjI0Mjg5LDkuMDQxMDhsLS4yNjA0Mi4yMTctLjMzNjYzLS4wNTQ5NEE2OC4xMDIxOSw2OC4xMDIxOSwwLDAsMSw0Ny42NzQ1MSw0MjQuNDc1M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PC9nPjxjaXJjbGUgY3g9IjQ2MC4zMTgyOCIgY3k9IjE4NSIgcj0iNSIgZmlsbD0iI2ZmZiIvPjxjaXJjbGUgY3g9IjgzNC4zMTgyOCIgY3k9IjMwNSIgcj0iMyIgZmlsbD0iI2ZmZiIvPjxjaXJjbGUgY3g9Ijg5Mi4zMTgyOCIgY3k9IjE3MCIgcj0iMyIgZmlsbD0iI2ZmZiIvPjxjaXJjbGUgY3g9IjM1NS4zMTgyOCIgY3k9IjgwIiByPSIzIiBmaWxsPSIjZmZmIi8+PGNpcmNsZSBjeD0iMzI1LjMxODI4IiBjeT0iMjAxIiByPSIzIiBmaWxsPSIjZmZmIi8+PGNpcmNsZSBjeD0iMTc5LjMxODI4IiBjeT0iMTcwIiByPSIzIiBmaWxsPSIjZmZmIi8+PGNpcmNsZSBjeD0iNjk2LjMxODI4IiBjeT0iMTk1IiByPSIzIiBmaWxsPSIjZmZmIi8+PGNpcmNsZSBjeD0iMTAwMy4zMTgyOCIgY3k9Ijk4IiByPSIzIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTMyOC45NTkyOSw0MTMuNTYzMjdjLTMuNzk5NTgtNy4wMzUtNC4zMy0xNi4yNTUzNy4zMzUzMS0yMi43NDg1OWEzNi44Mzg0MywzNi44Mzg0MywwLDAsMCwxNC42NzUwNywyMC41OTkzYzIuNzcxODEsMS44ODcxOSw2LjA1MTI0LDMuNjk3NTgsNi45OTk0Nyw2LjkxNGE4LjIzNDg4LDguMjM0ODgsMCwwLDEtLjg1ODY0LDYuMDQ0NDUsMjQuNDU3MSwyNC40NTcxLDAsMCwxLTMuNzk1MDUsNC45NTQ5NGwtLjEzNDMzLjUwMzI1QzMzOS4zMDI2OCw0MjUuNzU0NDMsMzMyLjc1ODg2LDQyMC41OTgyOSwzMjguOTU5MjksNDEzLjU2MzI3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMzZjNkNTYiLz48cGF0aCBkPSJNOTEwLjk1OTI5LDYxMi41NjMyN2MtMy43OTk1OC03LjAzNS00LjMzLTE2LjI1NTM3LjMzNTMxLTIyLjc0ODU5YTM2LjgzODQzLDM2LjgzODQzLDAsMCwwLDE0LjY3NTA3LDIwLjU5OTNjMi43NzE4MSwxLjg4NzE5LDYuMDUxMjQsMy42OTc1OCw2Ljk5OTQ3LDYuOTE0YTguMjM0ODgsOC4yMzQ4OCwwLDAsMS0uODU4NjQsNi4wNDQ0NSwyNC40NTcxLDI0LjQ1NzEsMCwwLDEtMy43OTUsNC45NTQ5NGwtLjEzNDMzLjUwMzI1QzkyMS4zMDI2OCw2MjQuNzU0NDMsOTE0Ljc1ODg2LDYxOS41OTgyOSw5MTAuOTU5MjksNjEyLjU2MzI3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMzZjNkNTYiLz48cGF0aCBkPSJNNTkxLjk1OTI5LDQ0OS41NjMyN2MtMy43OTk1OC03LjAzNS00LjMzLTE2LjI1NTM3LjMzNTMxLTIyLjc0ODU5YTM2LjgzODQzLDM2LjgzODQzLDAsMCwwLDE0LjY3NTA3LDIwLjU5OTNjMi43NzE4MSwxLjg4NzE5LDYuMDUxMjQsMy42OTc1OCw2Ljk5OTQ3LDYuOTE0YTguMjM0ODgsOC4yMzQ4OCwwLDAsMS0uODU4NjQsNi4wNDQ0NSwyNC40NTcxLDI0LjQ1NzEsMCwwLDEtMy43OTUsNC45NTQ5NGwtLjEzNDMzLjUwMzI1QzYwMi4zMDI2OCw0NjEuNzU0NDMsNTk1Ljc1ODg2LDQ1Ni41OTgyOSw1OTEuOTU5MjksNDQ5LjU2MzI3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMzZjNkNTYiLz48cGF0aCBkPSJNMjg3Ljk1OTI5LDU2NS41NjMyN2MtMy43OTk1OC03LjAzNS00LjMzLTE2LjI1NTM3LjMzNTMxLTIyLjc0ODU5YTM2LjgzODQzLDM2LjgzODQzLDAsMCwwLDE0LjY3NTA3LDIwLjU5OTNjMi43NzE4MSwxLjg4NzE5LDYuMDUxMjQsMy42OTc1OCw2Ljk5OTQ3LDYuOTE0YTguMjM0ODgsOC4yMzQ4OCwwLDAsMS0uODU4NjQsNi4wNDQ0NSwyNC40NTcxLDI0LjQ1NzEsMCwwLDEtMy43OTUwNSw0Ljk1NDk0bC0uMTM0MzMuNTAzMjVDMjk4LjMwMjY4LDU3Ny43NTQ0MywyOTEuNzU4ODYsNTcyLjU5ODI5LDI4Ny45NTkyOSw1NjUuNTYzMjdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzNmM2Q1NiIvPjxwYXRoIGQ9Ik0yNDkuOTU5MjksNjUxLjU2MzI3Yy0zLjc5OTU4LTcuMDM1LTQuMzMtMTYuMjU1MzcuMzM1MzEtMjIuNzQ4NTlhMzYuODM4NDMsMzYuODM4NDMsMCwwLDAsMTQuNjc1MDcsMjAuNTk5M2MyLjc3MTgxLDEuODg3MTksNi4wNTEyNCwzLjY5NzU4LDYuOTk5NDcsNi45MTRhOC4yMzQ4OCw4LjIzNDg4LDAsMCwxLS44NTg2NCw2LjA0NDQ1LDI0LjQ1NzEsMjQuNDU3MSwwLDAsMS0zLjc5NTA1LDQuOTU0OTRsLS4xMzQzMy41MDMyNUMyNjAuMzAyNjgsNjYzLjc1NDQzLDI1My43NTg4Niw2NTguNTk4MjksMjQ5Ljk1OTI5LDY1MS41NjMyN1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PHJlY3QgeD0iODQzLjMxODI4IiB5PSI2OCIgd2lkdGg9IjExIiBoZWlnaHQ9IjU4OSIgZmlsbD0iIzNmM2Q1NiIvPjxyZWN0IHg9IjgxMy4zMTgyOCIgeT0iMjAiIHdpZHRoPSI3MiIgaGVpZ2h0PSI3MiIgcng9IjM1Ljk5OTk2IiBmaWxsPSIjZmY2NTgyIi8+PHBhdGggZD0iTTQxOC42NDI2Myw0MjQuMTM4NWMwLDExLjQ3NzcxLDEyLjUxNTcyLDIxLjY3ODIzLDIzLjk5MzQ0LDIxLjY3ODIzczE3LjU3MS0xMC4yMDA1MiwxNy41NzEtMjEuNjc4MjNhMjAuNzgyMjQsMjAuNzgyMjQsMCwwLDAtNDEuNTY0NDgsMFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjMmYyZTQxIi8+PHBvbHlnb24gcG9pbnRzPSIzOTguNDcxIDQ4NC40ODkgNDM3LjA2NyA0ODMuMDA1IDQzOS4yOTQgNDQyLjkyNSAzOTQuNzYgNDQyLjkyNSAzOTguNDcxIDQ4NC40ODkiIGZpbGw9IiNmZmI4YjgiLz48cGF0aCBkPSJNNDAwLjgxMzY0LDU2MS40OTI4YTYuMTgyMzEsNi4xODIzMSwwLDAsMC0uMzY0OTQtOS40NzI4bDcuMDA3MzktMjAuODIyMzUtMTEuMDM3NzUsMi45MTctNC45NjIxMywxOS4zMjYwNWE2LjIxNTgxLDYuMjE1ODEsMCwwLDAsOS4zNTc0Myw4LjA1MjE1WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiNmZmI2YjYiLz48Y2lyY2xlIGN4PSI0MTUuNzU4MzUiIGN5PSIzODEuNjI0NzgiIHI9IjE0LjY5ODA0IiBmaWxsPSIjZmZiOGI4Ii8+PHBhdGggZD0iTTQ0Mi45NjA0Nyw0MjkuNjQzNzlsLTEwLjczMjUzLS4yODQyNmExLjUwNCwxLjUwNCwwLDAsMS0xLjI4MDE0LS43ODczOGwtMy41ODc4Ny02LjY1NTE0YTEuNDk3ODMsMS40OTc4MywwLDAsMSwuMzk1NjMtMS44OTEzOEw0NDEuNzk4MTgsNDA5LjA0N2ExLjQ5Njc5LDEuNDk2NzksMCwwLDEsMS4yNTYxOC0uMjgwMzdsMTEuMzQxODQsMi41ODQyMmExLjQ5OSwxLjQ5OSwwLDAsMSwxLjEwNjYsMS4wNDMxNGw0LjQ0MTMsMTUuMjk0OTJhMS40OTkzNSwxLjQ5OTM1LDAsMCwxLTEuNTEzODksMS45MTZsLTUuNTYwMi0uMjc3NzlhMS41MDcyNCwxLjUwNzI0LDAsMCwxLTEuMzQ3NDctMS4wMjc2bC0uMjMwNTItLjY5ODY3YS4xNzM0Mi4xNzM0MiwwLDAsMC0uMzM4LjA1NDM5LDEuNDk5NzQsMS40OTk3NCwwLDAsMS0xLjU3MzQ2LDEuNDk3N2wtMS44NDA4OC0uMDkxOTRhMS40OTU0LDEuNDk1NCwwLDAsMS0xLjM5Ni0xLjIwNWwtLjc5Mzg1LTMuOTkyNTZhLjE3MzIuMTczMiwwLDAsMC0uMzQxODguMDEzNTlsLS41MTg2Niw0LjQ0MmExLjQ5MiwxLjQ5MiwwLDAsMS0xLjQ4NzM0LDEuMzI1NDZaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik00MzIuMjUxNSw0NDkuNTgwNzlsMTkuMDAzMjMuMjUzMzEsNi4xODQ4MSw3Ljg1MzQ2LDkuOTU2ODQsMi4zNDgxLDIuNTg3OCwxNC45NTQyN2MxLjI5Mzc1LDcuNDc2MjQtLjA3OTc5LDEyLjIxMDg5LTMuODgwNzYsMTguNzc3NTFsMCwwLS40NTUyMiwxMi45MTc3MS41MDMuOTE0MjZhMi4wOTM2NCwyLjA5MzY0LDAsMCwxLS42MzExOSwyLjcyMjY3aDBhNC4yNzcyNiw0LjI3NzI2LDAsMCwxLC4xMTc1MiwyLjgxNDkxbC0uMjQ1MjguODEwNDZzLS43MDc4Myw1LjY2MjYxLTQwLjgzMjM5LS4yOTI5M2EzLjk1NjMyLDMuOTU2MzIsMCwwLDEtMy4zNDM0NS0zLjM5ODZoMGEyLjk1NDA2LDIuOTU0MDYsMCwwLDEtLjU0Ny0zLjQwMzhsLjA4MTc1LS4xNjM0OC0uNDEyLS40ODUyOWEzLjE3NywzLjE3NywwLDAsMS0uMTYwOC0zLjkwNjU5aDBsLTUuNzY2NTItNDEuMjUyMTcsMTEuOTExOTItMy43MVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTQxOS4xNjg2Miw0NjQuOTkyODhsLTQuNzU2ODQtMy45NDgyOHMtNC4yMjk1MiwxLjI1MDEzLTcuMTgzMzQsOS41ODA3Ny0xMy4wODk1Nyw3MS41MjY1Ni0xMy4wODk1Nyw3MS41MjY1NmwxMS44NzU1Ny01LjkzNzc4LDE2LjgzOTItNDYuNDMwODVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik01MjQuODE5NDYsNTMyLjI3NGE2LjE4MjI4LDYuMTgyMjgsMCwwLDEtNy4wOTExNi02LjI5MTQ3bC0yMC41NDE0Ny03Ljc5MjQyLDkuMjU3LTYuNjgyLDE4LjA4NzMzLDguNDI0MjRhNi4yMTU4MSw2LjIxNTgxLDAsMCwxLC4yODgzMSwxMi4zNDE2MloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjZmZiNmI2Ii8+PHBhdGggZD0iTTQ2MS44ODA2MSw0NjQuNjMyNTNsMy4yMjQ3MS01LjI3NDI1czQuNDA2NTUtLjE4NDU2LDkuODk1MjgsNi43NDM1M2MyLjgxMzczLDMuNTUxNjEsMjEuMDQ4NzQsMzQuMDE3MTksMjEuMDQ4NzQsMzQuMDE3MTlsMTYuODYzMTEsMTQuMDU1NDYtMTMuODA2MjgsNC45MzA4MS0xNi4yNzE2OS02LjkwMzE0LTE4LjI0NC0zMC4wNzhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwb2x5Z29uIHBvaW50cz0iNDM1LjU1NSA2NjYuODEgNDQ0LjczOSA2NjYuODEgNDQ5LjEwOCA2MzEuMzg1IDQzNS41NTMgNjMxLjM4NiA0MzUuNTU1IDY2Ni44MSIgZmlsbD0iI2ZmYjZiNiIvPjxwb2x5Z29uIHBvaW50cz0iMzU1LjE1NyA2NjEuMDk5IDM2NC4wNDQgNjYzLjQxNSAzNzcuMjA4IDYzMC4yMzggMzY0LjA5MSA2MjYuODE5IDM1NS4xNTcgNjYxLjA5OSIgZmlsbD0iI2ZmYjZiNiIvPjxwYXRoIGQ9Ik00NjAuMTE3ODcsNzExLjc3NzYzbDE0LjUxODI2LS44NjY1NXY2LjIyMDI2bDEzLjgwMjkzLDkuNTMyNzlhMy44ODU0MSwzLjg4NTQxLDAsMCwxLTIuMjA3ODIsNy4wODI3NEg0NjguOTQ2N2wtMi45NzkyNS02LjE1Mjc5LTEuMTYzMjUsNi4xNTI3OWgtNi41MTdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik0zODAuMTMxMTEsNzA1LjQyODU4bDE0LjI2NzQsMi44MjM1LTEuNTY5LDYuMDE5MTMsMTAuOTUyMTEsMTIuNzA2MTVhMy44ODU0MSwzLjg4NTQxLDAsMCwxLTMuOTIzLDYuMjk2ODNMMzgzLjEzMyw3MjguOTE0NDFsLTEuMzMxLTYuNzA1MzEtMi42Nzc1OSw1LjY2MDQzLTYuMzA2MjQtMS42NDM4MVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTM4My4xMjQ4LDY4OC4zMTkzMWwyNi45MjA4MS01NS4zMzAyMSwyLjExMzUzLTY1LjQ5MDkxQzQwNi4zMzIzMyw1NTYuNjc3LDQyMy40OTEsNTMyLjgwNSw0MjMuNDkxLDUzMi44MDV2LTkuMjQ0OTFsNDEuOTE4NTIsNy45MDgxMnYwYTIwMS4yMTQ4OSwyMDEuMjE0ODksMCwwLDEsMTIuMjYxNTEsNzMuMDYwMjZMNDc1Ljk4Miw2OTQuMDQ3MzRoLjUyOTg3YTMuMzE1MjcsMy4zMTUyNywwLDEsMSwwLDYuNjMwNTNINDU5LjkzNTVhMy4zMTUyNywzLjMxNTI3LDAsMSwxLDAtNi42MzA1M2guNDI3NEw0NDguNDYzMSw1ODAuMTYzNTFsLTEzLjgzNjU0LDU2LjE5ODgxTDQwMS4xODksNjg4LjEwNjZhMy4zMDY5LDMuMzA2OSwwLDAsMS0uMjY1MjQsNi42MDM3OUgzODQuMzQ3MzlhMy4zMTE4MiwzLjMxMTgyLDAsMCwxLTEuMjIyNTktNi4zOTEwOFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTM4Mi43NTg0MSw0MjYuMjk2NDdjNi4xOTM5NS02LjA1OTM1LDEwLjA5Mjc5LTE0LjAyNzczLDE1LjIyMjU1LTIxLjAxMTA4LDUuMTI5Ni02Ljk4MzI3LDEyLjM1NDcyLTEzLjM4MjQsMjEuMDEwODMtMTMuNzcwMjZhMTMuMDM3ODYsMTMuMDM3ODYsMCwwLDEsOC4xNjU3OSwyLjEyOSw4LjMwNTQxLDguMzA1NDEsMCwwLDEsMy42MDQ1NSw3LjM2NzQxYy45MTM4LTIuNTY2NzQsNC45OTcxOC0zLjE0NTMsNi41ODgtLjkzMzMxLDEuNTkwNjIsMi4yMTE5MS0uMjU3MjIsNS44OTg5My0yLjk4MTE1LDUuOTQ4MzhsLS4yNjcxLTEuMDU2NjZhMTguMjQ4NzcsMTguMjQ4NzcsMCwwLDEtMTEuODAxNDEsNy44MzYxMywyLjk3ODMsMi45NzgzLDAsMCwxLTMuMzU1MjYtMy44NTQyNUM0MDkuNTkwODcsNDEwLjgwNjY2LDQxMi41NjA1Miw0MjguMjUyMzQsNDA3LDQzNnMtMjEuNDUyNTksNi45OTU1MS0zMC44MjkwNyw4LjczNTNjLTkuMDU0NjYsMS42OC0xNy44NTg1Ny0zLjM0NzU2LTI1LjY5OTMxLTguMTc4QTM4LjI3MTUsMzguMjcxNSwwLDAsMCwzODIuNzU4NDEsNDI2LjI5NjQ3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMyZjJlNDEiLz48cGF0aCBkPSJNNzMyLjY4OTg5LDYzNi45MDM3Myw3MDQuNDcyNzUsNjI0LjQ1NVY2MTMuNzUyNjVsMTAuMDU2MS0uMDU2NTFhNy40NjkxOCw3LjQ2OTE4LDAsMCwwLDcuMDQ0LTUuMTA3MTRsNy4wNjQzNy0yMS4xOTMwNWE3LjQ2OTI0LDcuNDY5MjQsMCwwLDAtNy4wODYtOS44MzEyMkg3MDQuNDcyNzV2LTkuOTU5SDcyNS45MTNhNy40NjkyNSw3LjQ2OTI1LDAsMCwwLDcuMjc5MzctNS43OTU4NGw0Ljg2NS0yMS4xNjI4NmE3LjQ2OTIzLDcuNDY5MjMsMCwwLDAtNy4yNzkzNy05LjE0MjY1SDcwNC40NzI3NXYtMi40ODk3NWE0Ljk3OTQ5LDQuOTc5NDksMCwwLDAtOS45NTksMHYyLjQ4OTc1SDUxOC4xNTY2di0yLjQ4OTc1YTQuOTc5NSw0Ljk3OTUsMCwwLDAtOS45NTksMHYyLjQ4OTc1SDQ4Ny4yODY4YTcuNDY5MjMsNy40NjkyMywwLDAsMC03LjI3OTM3LDkuMTQyNjVsNC44NjUsMjEuMTYyODZhNy40NjkyNSw3LjQ2OTI1LDAsMCwwLDcuMjc5MzcsNS43OTU4NEg1MDguMTk3NnY5Ljk1OUg0OTYuNTEzMjhhNy40NjkyMyw3LjQ2OTIzLDAsMCwwLTcuMTA5MjcsOS43Nmw3LjIxMDQxLDIyLjM3NzExYTcuNDY5MjUsNy40NjkyNSwwLDAsMCw3LjE1MTIzLDUuMTc4MzdsNC40MzItLjAyNDlWNjI0LjQ1NWwtMjIuODIyNjksMTIuNDQ4NzRhNy40NjkyMiw3LjQ2OTIyLDAsMCwwLTcuNDY5MjQsNy40NjkyMnYwYTcuNDY5MjUsNy40NjkyNSwwLDAsMCw3LjQ2OTI0LDcuNDY5MjVINTA4LjE5NzZ2NTQuNzc0NDZhNC45Nzk1LDQuOTc5NSwwLDAsMCw5Ljk1OSwwVjY1MS44NDIyMkg2OTQuNTEzNzZ2NTQuNzc0NDZhNC45Nzk0OSw0Ljk3OTQ5LDAsMCwwLDkuOTU5LDBWNjUxLjg0MjIyaDI4LjIxNzE0YTcuNDY5MjUsNy40NjkyNSwwLDAsMCw3LjQ2OTI1LTcuNDY5MjV2MEE3LjQ2OTIyLDcuNDY5MjIsMCwwLDAsNzMyLjY4OTg5LDYzNi45MDM3M1ptLTIxNC41MzMyOS02OS4yOThINjk0LjUxMzc2djkuOTU5SDUxOC4xNTY2Wm0wLDU2Ljg0OTI1di05LjY1NTYzbDE3Ni4zNTcxNi0uOTkwNzZWNjI0LjQ1NVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PC9zdmc+"; +var darkBackground = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGRhdGEtbmFtZT0iTGF5ZXIgMSIgd2lkdGg9Ijg1NS45Mzk1OCIgaGVpZ2h0PSI2MzAuMDY2MDgiIHZpZXdCb3g9IjAgMCA4NTUuOTM5NTggNjMwLjA2NjA4IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PHBhdGggZD0iTTkzNS40MzIzNCw0NzIuNTU3NjdjLTMuNzMsNDMuMDgtMjIuNTEsODQuNzEtNDkuMywxMTkuMTRxLTEuNjgsMi4xNi0zLjQsNC4yOC0zLjg3LDQuNzctNy45NCw5LjM2LTQuOTgsNS42NTUtMTAuMjUsMTEuMDUwMDUtNC4yOSw0LjQzOTk0LTguNzgsOC42ODk5NC0zLjQ2NSwzLjMxNS03LjAxLDYuNWMtMjguNDMsMjUuNjktNjEuMDksNDYuODktOTQuNzQsNjUuNDMwMDUtNjUuNjcsMzYuMTctMTM3LjY1LDYzLjU2OTk1LTIxMi41Miw2Ny41Ni03NC44NiwzLjk4LTE1My4wMS0xNy40Ni0yMDcuOTEtNjguNTItNzMuOTktNjguODEtOTQuNjM5OTUtMTgzLjU4LTY0LjYtMjgwLjA1LDE5Ljk4LTY0LjE4LDYwLjc2LTEyMi4yNCwxMTYuMjYtMTYwLjE2LDU1LjAyLTM3LjU5LDEyNC40My01NC41MSwxOTAuMTItNDMuNDQ5OTUsNTIuNDQtMzEuODcwMDYsMTIxLjA5LTMyLjQ4LDE3OC4xLTguODksMzAuNDIsMTIuNTksNTcuNzIsMzEuMzEsODEuNjcsNTMuOTNhMzM5LjM0MzM3LDMzOS4zNDMzNywwLDAsMSwzMC43MiwzMy4yM3ExLjQ1NSwxLjc4NSwyLjg4LDMuNiw1Ljk3LDcuNTQ1LDExLjU1LDE1LjQsOC4wMSwxMS4yNjUsMTUuMjEsMjMuMDNjMS4zMiwyLjE2LDIuNjMsNC4zMywzLjkxLDYuNTIuODYsMS40NywxLjczLDIuOTUsMi41OCw0LjQ0YS4yOTc3Ni4yOTc3NiwwLDAsMSwuMDQuMWMxMy4zMSwyMy40MSwyNC4xOSw0OC4zOSwyOS44NjAwNSw3NC41LDEsNC42MiwxLjg0LDkuMjYsMi40OSwxMy45NHYuMDFxLjg1NSw1Ljk1NSwxLjI5LDExLjk3QTE3Ni45NzcxMSwxNzYuOTc3MTEsMCwwLDEsOTM1LjQzMjM0LDQ3Mi41NTc2N1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiMzZjNkNTYiLz48cGF0aCBkPSJNNzQwLjA3Mzg2LDUzNy42ODQxMiw1OTEuNjEyMzMsNDE0LjAwNjI3LDczNS44NDAyNyw1NDIuNjM4YTMuNDQxNjEsMy40NDE2MSwwLDEsMCw0LjIzMzU5LTQuOTUzODZaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjZjBmMGYwIiBvcGFjaXR5PSIwLjMiLz48Y2lyY2xlIGN4PSIyMjcuNTgyMTIiIGN5PSIyNTAuNzgwNzEiIHI9Ijg5IiBmaWxsPSIjZjJmMmYyIi8+PHBhdGggZD0iTTQ3OC42MTIzMywzNzkuNzQ3NjdhODAuOTkzNjksODAuOTkzNjksMCwwLDEtODEsODEsODEuNTcxNjEsODEuNTcxNjEsMCwwLDEtMjcuOC00LjksODEuMDU0ODksODEuMDU0ODksMCwxLDEsMTA4LjgtNzYuMVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiNmZmYiLz48Y2lyY2xlIGN4PSIyMTEuNTgyMTIiIGN5PSIyMTcuNzgwNzEiIHI9IjI1IiBmaWxsPSIjZTRlNGU0Ii8+PHBhdGggZD0iTTQ3NS40NTIzNiwzNTcuMjc3NjRhMjUuMDAxMTUsMjUuMDAxMTUsMCwwLDEtMjcuNi00MS4wOEE4MS4wNTI3OSw4MS4wNTI3OSwwLDAsMSw0NzUuNDUyMzYsMzU3LjI3NzY0WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE3Mi4wMzAyMSAtMTM0Ljk2Njk2KSIgZmlsbD0iI2YyZjJmMiIvPjxjaXJjbGUgY3g9IjI1Mi41ODIxMiIgY3k9IjI3MS43ODA3MSIgcj0iOSIgZmlsbD0iI2U0ZTRlNCIvPjxwYXRoIGQ9Ik0zODcuNjEyMzMsNDU3Ljc0NzY3YTkuMDQ1ODEsOS4wNDU4MSwwLDAsMS0uMzEsMi4zNCw3OS41Mjc3NCw3OS41Mjc3NCwwLDAsMS0xNy40OS00LjI0LDkuMDAxNTcsOS4wMDE1NywwLDAsMSwxNy44LDEuOVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiNmMmYyZjIiLz48cGF0aCBkPSJNMzM0LjYxMjMzLDM3NS43NDc2N2ExOC4wMDIsMTguMDAyLDAsMCwxLTE2LjgsMTcuOTYsODEuNTQ3NzMsODEuNTQ3NzMsMCwwLDEsMS43Ni0zNS43MUExOC4wMDAyNiwxOC4wMDAyNiwwLDAsMSwzMzQuNjEyMzMsMzc1Ljc0NzY3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE3Mi4wMzAyMSAtMTM0Ljk2Njk2KSIgZmlsbD0iI2YyZjJmMiIvPjxjaXJjbGUgY3g9IjYwNi40NTY1MyIgY3k9IjIwOC40ODMwNSIgcj0iMy43MDIzNCIgZmlsbD0iIzZjNjNmZiIvPjxjaXJjbGUgY3g9IjU3Mi4zMDIzMSIgY3k9IjExOS45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjIyNS4zMDIzMSIgY3k9IjU0My45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjU4NC41ODE0NCIgY3k9IjMzMS41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjMwNS40NTY1MyIgY3k9IjM1MC40ODMwNSIgcj0iMy43MDIzNCIgZmlsbD0iIzZjNjNmZiIvPjxjaXJjbGUgY3g9IjE3MS40NTY1MyIgY3k9IjQxNi40ODMwNSIgcj0iMTcuNDgzMDUiIGZpbGw9IiM2YzYzZmYiLz48Y2lyY2xlIGN4PSIyNjcuMzAyMzEiIGN5PSI0MzUuOTQ4NTEiIHI9IjIuMTYzMDciIGZpbGw9IiNmMGYwZjAiLz48Y2lyY2xlIGN4PSI0ODcuMzAyMzEiIGN5PSI5Ny45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjM1OC4zMDIzMSIgY3k9IjU1OC45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjMyNi4zMDIzMSIgY3k9IjExNy45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjM4Mi4zMDIzMSIgY3k9IjIyMi45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjI5Ni41ODE0NCIgY3k9IjQ4MC41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjU0OS41ODE0NCIgY3k9IjQ5NC41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjQzNy41ODE0NCIgY3k9IjM2OC41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjQ5NC41ODE0NCIgY3k9IjIyMi41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjU5OC4yMTIwNCIgY3k9IjI5Mi42NTQ3MyIgcj0iNC4yODg4OSIgZmlsbD0iI2ZmNjU4NCIvPjxjaXJjbGUgY3g9IjQyNC4yMTIwNCIgY3k9IjE1MC42NTQ3MyIgcj0iNC4yODg4OSIgZmlsbD0iI2ZmNjU4NCIvPjxjaXJjbGUgY3g9IjQyNC4yMTIwNCIgY3k9IjQ0NS42NTQ3MyIgcj0iNC4yODg4OSIgZmlsbD0iI2ZmNjU4NCIvPjxwYXRoIGQ9Ik04NjMuNDUyMzYsNjA1LjMzNzY0YTcuNjk0LDcuNjk0LDAsMCwwLTcuMzksNS41OCw3LjM4OTYsNy4zODk2LDAsMCwwLS4zLDIuMTJ2MTIuMDRxNC40ODUtNC4yNDQ5NCw4Ljc4LTguNjg5OTQsNS4yNjUtNS40MDAwNiwxMC4yNS0xMS4wNTAwNVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiM2YzYzZmYiLz48cGF0aCBkPSJNODkwLjY4MTE4LDY2Ny44OTgwNnEtMTkuMzY4MTYsMC00Mi40NTY1NC0xLjQ2Mzg2Yy03OS42MTM3Ny01LjA1NTY3LTE4Mi43Mzc4LTIyLjYzMjgyLTI5MC4zNzYtNDkuNDkyMTktMTA3LjYzNzctMjYuODU5MzgtMjA2LjkzMDE4LTU5Ljc5Mzk1LTI3OS41ODU0NS05Mi43MzQzOC0zNS4zOTI1OC0xNi4wNDY4Ny02Mi41NTYxNS0zMS4yMzYzMi04MC43MzUzNS00NS4xNDc0Ni0xOS4yNDcwNy0xNC43MjcwNS0yNy42NjYtMjcuNTY0LTI1LjAyMzkzLTM4LjE1MjgzLDUuMTQ4LTIwLjYyODkxLDUwLjczMS0yNS4xNDIwOSw4OC4wNjQtMjUuMjk1NDFsLjAxMjY5LDNjLTUxLjI2ODA2LjIxMDQ1LTgxLjUxMzY3LDguMzg2NzItODUuMTY1NTIsMjMuMDIyLTQuNjUxODYsMTguNjQwMTQsMzMuMjg2NjIsNDcuNzQwNzMsMTA0LjA4NjkxLDc5Ljg0MTMxLDcyLjQ5NTYxLDMyLjg2ODE3LDE3MS42MDU0Nyw2NS43MzkyNiwyNzkuMDczMjQsOTIuNTU2NjQsMTA3LjQ2NzI5LDI2LjgxNjQxLDIxMC40MDEzNyw0NC4zNjMyOCwyODkuODM5ODUsNDkuNDA4MjEsNzcuNTc4NjEsNC45Mjc3MywxMjQuNzQzMTYtMi45Mzc1LDEyOS4zOTQ1My0yMS41NzgxMywzLjg2MTgxLTE1LjQ3NjU2LTIxLjU5ODE1LTM4LjI3NTM5LTcxLjY4OTQ2LTY0LjE5ODI0bDEuMzc4OTEtMi42NjQwNmMzNi4zOTcsMTguODM1OTMsNzguNjQ1NTEsNDUuODUxNTYsNzMuMjIxNjgsNjcuNTg4ODYtMi42NDI1OCwxMC41ODg4Ny0xNi4xMDU0NywxNy45NjQ4NS00MC4wMTUxNCwyMS45MjI4NUM5MjcuMDc2Miw2NjYuNzY3Miw5MTAuMzM1NDgsNjY3Ljg5ODA2LDg5MC42ODExOCw2NjcuODk4MDZaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjNmM2M2ZmIi8+PGNpcmNsZSBjeD0iNzE0LjU4MjEyIiBjeT0iMjA4Ljc4MDcxIiByPSIxMDAuNSIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik04ODYuNjEyMzMsMjQxLjc0NzY3YTEwMiwxMDIsMCwxLDAsMTAyLDEwMkExMDEuNjM1LDEwMS42MzUsMCwwLDAsODg2LjYxMjMzLDI0MS43NDc2N1ptMCwyMDFhOTksOTksMCwxLDEsOTktOTlBOTguNjE3NjcsOTguNjE3NjcsMCwwLDEsODg2LjYxMjMzLDQ0Mi43NDc2N1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiMyZjJlNDEiLz48cGF0aCBkPSJNNzk4LjQxNywzNjcuODE4NDdhMi4wMDA3OCwyLjAwMDc4LDAsMCwxLTEuOTU3LTEuNTk3NjUsOTcuNjY5MjQsOTcuNjY5MjQsMCwwLDEsMjIuMzQwODItODMuMTM1MjYsMiwyLDAsMCwxLDIuOTg2MzMsMi42NjExNEE5My41OTY4Miw5My41OTY4MiwwLDAsMCw4MDAuMzc4LDM2NS40MTUxNWEyLjAwMjI4LDIuMDAyMjgsMCwwLDEtMS45NjA5NCwyLjQwMzMyWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE3Mi4wMzAyMSAtMTM0Ljk2Njk2KSIgZmlsbD0iIzJmMmU0MSIvPjxjaXJjbGUgY3g9IjcxNC41MTkyNCIgY3k9IjIzOC4yNzM3MyIgcj0iNjMuODc3MDIiIGZpbGw9IiM2YzYzZmYiLz48cGF0aCBkPSJNODY2LjI0ODA1LDM5Ny4zNTY2NmMtNC4xNDA2Mi0uMTE1LTkuMjkzODUtLjI1ODY5LTEzLjI2Mzg0LTMuMTU4NzRhMTAuMTg2MTgsMTAuMTg2MTgsMCwwLDEtNC4wMDgwNi03LjYwNjA3LDYuODUyMTMsNi44NTIxMywwLDAsMSwyLjMzMDA3LTUuNjI3NjNjMi4wNzM1Mi0xLjc1MjE2LDUuMTAxMzktMi4xNjMxMyw4LjM2NDQxLTEuMjA0MmwtMy4zODA3Ni0yNC43MDYxLDIuNDgxNzQtLjM0LDMuOTc0NDQsMjkuMDQ1MTgtMi4wNzI0NS0uOTUxYy0yLjQwMjctMS4xMDIwNS01LjcwMDg4LTEuNjYyODUtNy43NTA0LjA2OTExYTQuNDAyNjMsNC40MDI2MywwLDAsMC0xLjQ0Mzc1LDMuNjI2NTksNy42OTg4Nyw3LjY5ODg3LDAsMCwwLDIuOTgyNDYsNS42NzEwN2MzLjA4OTQ5LDIuMjU2NjgsNy4xOTcwOCwyLjU0Nzc5LDExLjg1NTg1LDIuNjc4WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE3Mi4wMzAyMSAtMTM0Ljk2Njk2KSIgZmlsbD0iIzJmMmU0MSIvPjxyZWN0IHg9IjY1OC40OTQ5MyIgeT0iMjIyLjIxNzY3IiB3aWR0aD0iMTMuNDkxMzMiIGhlaWdodD0iMi41MDQ5OCIgZmlsbD0iIzJmMmU0MSIvPjxyZWN0IHg9IjcwMS4wNzk2MSIgeT0iMjIyLjIxNzY1IiB3aWR0aD0iMTMuNDkxMzMiIGhlaWdodD0iMi41MDQ5OCIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik04ODkuMjMyMzMsNDUyLjkwNzY1aC01Ny45YTguMTQ3MTYsOC4xNDcxNiwwLDAsMC04LjEzOTk1LDguMTR2MTI4LjMzYTQ3LjY2OTU1LDQ3LjY2OTU1LDAsMCwwLDI1LjU2LDQyLjE5OTk1cTMuNTU1LTMuMTgsNy4wMS02LjUsNC40ODUtNC4yNDQ5NCw4Ljc4LTguNjg5OTQsNS4yNjUtNS40MDAwNiwxMC4yNS0xMS4wNTAwNSw0LjA4MDA2LTQuNTksNy45NC05LjM2LDEuNzI1LTIuMTE1LDMuNC00LjI4YzI2Ljc5LTM0LjQzLDQ1LjU3LTc2LjA2LDQ5LjMtMTE5LjE0QTY0LjA0ODU0LDY0LjA0ODU0LDAsMCwwLDg4OS4yMzIzMyw0NTIuOTA3NjVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTg5MS4zNDIzMSw0NzkuNjg3NjdhMTQuNjExMzYsMTQuNjExMzYsMCwwLDAtMTAuNDMtNC4xNywxNC40NjUsMTQuNDY1LDAsMCwwLTkuMTYsMy4zNjAwNSwxMy4xMjI2MywxMy4xMjI2MywwLDAsMC0xLjE3LDEuMDdsLTQ3LjM4OTk1LDQ4LjYtMzQuMzcsMzUuMjVhNi44MDA2MSw2LjgwMDYxLDAsMCwwLTEuMjgsMS44LDcuMjk1NzMsNy4yOTU3MywwLDAsMC0uNzcsMy4zMiw3LjE2NzUxLDcuMTY3NTEsMCwwLDAsMi4xODAwNiw1LjA3bDEuMzUsMS4zMiw5LjgsOS41NS4wMS0uMDFhNy4yOTA3Myw3LjI5MDczLDAsMCwwLDQuNjYsMS42Myw3LjE2Nyw3LjE2NywwLDAsMCw1LjA3LTIuMThsMS41OS0xLjYyLDExLjM4LTExLjY3LjM4LS4zOSw2OC40MS03MC4xNmExNC42OTEyOCwxNC42OTEyOCwwLDAsMC0uMjYtMjAuNzdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjNmM2M2ZmIi8+PHBhdGggZD0iTTg5MC44NjE1MiwzNDMuNDRjMi4xMTI0LTQuNDY2NTgtLjA1MzQ5LTkuMjM3NjEtMy43NjM3OC0xMi4wOTA3Mi00LjY3NTU3LTMuNTk1MzktMTAuNzIyMS0zLjAwMDg1LTE2LjA0MDA4LTEuMjk5MDUtNS44MjIzOCwxLjg2MzItMTEuNTEzNjYsNS4yMTYwOC0xNy44MDM4Myw1LjAyMzM3YTExLjEzMDU4LDExLjEzMDU4LDAsMCwxLTEwLjI0NDA3LTcuMjc3NjRjLTMuMzY4Ny04LjYzOS40MzU2MS0xOC4yOTQ4OCw2LjI5OTcxLTI0Ljg0NjgxYTM0LjI2NzY2LDM0LjI2NzY2LDAsMCwxLDI2LjU0NC0xMS41ODYsMzQuNjQ5ODksMzQuNjQ5ODksMCwwLDEsMjguMDY4LDE2LjkwMjYsMS41NDA3OSwxLjU0MDc5LDAsMCwwLDIuMDUyMjkuNTM4MTMsMzYuODgyMjUsMzYuODgyMjUsMCwwLDEsMjguMzkzNzctLjcxNDMyLDM2LjI4OTg0LDM2LjI4OTg0LDAsMCwxLDIyLjU4MDQyLDM0LjQ5MTg4Yy0uMDUsMS45MzEyMiwyLjk1MDA1LDEuOTMwMSwzLDBhMzkuODkxNTUsMzkuODkxNTUsMCwwLDAtMTAuNTk5MjgtMjcuODEyNDksMzguNzE4NzEsMzguNzE4NzEsMCwwLDAtMjcuNTY2ODEtMTIuMTY3NzIsMzkuMzM2NDEsMzkuMzM2NDEsMCwwLDAtMTcuMzIyMjYsMy42MTIyM2wyLjA1MjI5LjUzODEzYTM3LjY5ODg2LDM3LjY5ODg2LDAsMCwwLTI1LjA5ODgtMTcuNzI4LDM2LjQ4NTQyLDM2LjQ4NTQyLDAsMCwwLTI5LjQyMzg0LDcuMzI3NzJjLTcuNzAxNjUsNi4wMjcwNy0xMy41Mzg0OSwxNS4zODAxNi0xMy4xNzUxOSwyNS40MTA3MS4xNTcyMSw0LjM0MDQ3LDEuNDQ3MTMsOC43OTYsNC40NjA2LDEyLjAzMDUxLDMuODU5ODEsNC4xNDI4Nyw5LjYyMjI5LDQuODU5NDQsMTQuOTQ2MzEsMy43OTgsNy4wNzU1NC0xLjQxMDcxLDEzLjUzNTMzLTYuMDY0NDksMjAuOTExMzMtNS45MjExM2ExMC4yMTE2NCwxMC4yMTE2NCwwLDAsMSw3LjY0MTcsMy40NDUzYzEuNjI0NTUsMS44MzMzNSwyLjYwNDIsNC40NzA0MiwxLjQ5NzE2LDYuODExMjItLjgyMDk0LDEuNzM1ODUsMS43NjQ2MywzLjI2MDI2LDIuNTkwNDEsMS41MTQxNloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiMyZjJlNDEiLz48cGF0aCBkPSJNNDEyLjA5NDI2LDcwNC4zMjI4N2MtMzUuNTk5MTIuMDAxLTY4LjY5NDMzLTEuMjIwNzEtOTguMzIyMjYtMy42ODU1NS0zOC43MjY1Ni0zLjIyMjY2LTY5LjQxNDU1LTguNDAzMzItOTEuMjEwNDUtMTUuMzk2NDgtMjMuMDc2NjYtNy40MDUyOC0zNS4zMTkzNC0xNi42NjctMzYuMzg4MTgtMjcuNTI4MzItMi4wODMtMjEuMTU4MjEsMzkuMzM0LTQwLjcyNDYxLDc0LjQ0NTMxLTUzLjQxMzA5bDEuMDE5NTMsMi44MjIyN2MtNDguMjE2OCwxNy40MjM4Mi03My45NTcsMzUuMjg2MTMtNzIuNDc5NDksNTAuMjk3ODUsMS44ODE4MywxOS4xMTkxNCw0Ny4zOTIwOSwzMy43ODEyNSwxMjQuODYxODEsNDAuMjI3NTQsNzkuMzI1Miw2LjYwMDU4LDE4My43MTcyOSw0LjI2MTcyLDI5My45NDcyNy02LjU4OTg1LDExMC4yMy0xMC44NDg2MywyMTMuMDc1NjgtMjguOTA2MjUsMjg5LjU5MTMxLTUwLjg0NTcsNzQuNzI2MDctMjEuNDI1NzgsMTE2LjUwNDg4LTQ0LjY3OTY5LDExNC42MjMtNjMuNzk4ODMtMS41NjI1LTE1Ljg3NC0zMy4yMDI2NC0yOC43OTMtODkuMDkxOC0zNi4zNzg5bC40MDMzMi0yLjk3MjY2YzQwLjYwOTg2LDUuNTExNzIsODkuNDc5NDksMTYuNzYxNzIsOTEuNjczODMsMzkuMDU3NjIsMS4wNjkzMywxMC44NjEzMi05LjEzMzMsMjIuMzMyLTMwLjMyMjc2LDM0LjA5Mzc1LTIwLjAxNDY1LDExLjEwOTM3LTQ5LjEwMzUxLDIyLjE3Mjg1LTg2LjQ1ODQ5LDMyLjg4MjgxLTc2LjY4NTA2LDIxLjk4ODI4LTE3OS43MTk3Myw0MC4wODEwNS0yOTAuMTI0NTEsNTAuOTQ4MjRDNTM5LjAwMjQ3LDcwMC44Niw0NzIuMDE2NjMsNzA0LjMyMjg3LDQxMi4wOTQyNiw3MDQuMzIyODdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjNmM2M2ZmIi8+PGNpcmNsZSBjeD0iODM4LjQ1NjUzIiBjeT0iNDM0LjQ4MzA1IiByPSIxNy40ODMwNSIgZmlsbD0iIzZjNjNmZiIvPjxjaXJjbGUgY3g9IjMzMS40NTY1MyIgY3k9IjE3LjQ4MzA1IiByPSIxNy40ODMwNSIgZmlsbD0iI2U2ZTZlNiIvPjxjaXJjbGUgY3g9IjE5LjQ1NjUzIiBjeT0iNDMzLjQ4MzA1IiByPSIxNy40ODMwNSIgZmlsbD0iI2U2ZTZlNiIvPjxjaXJjbGUgY3g9IjEyNy40NTY1MyIgY3k9IjEwOC40ODMwNSIgcj0iMTAuNzAyMzQiIGZpbGw9IiNmZjY1ODQiLz48Y2lyY2xlIGN4PSI3Ny40NTY1MyIgY3k9IjUxNC40ODMwNSIgcj0iMTAuNzAyMzQiIGZpbGw9IiNmZjY1ODQiLz48Y2lyY2xlIGN4PSI4MDcuNDU2NTMiIGN5PSIzMzkuNDgzMDUiIHI9IjEwLjcwMjM0IiBmaWxsPSIjZmY2NTg0Ii8+PGNpcmNsZSBjeD0iNjQ1LjQ1NjUzIiBjeT0iNTk4LjQ4MzA1IiByPSIxNy40ODMwNSIgZmlsbD0iI2U2ZTZlNiIvPjwvc3ZnPg=="; +function SvgShare(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + xmlns: "http://www.w3.org/2000/svg", + enableBackground: "new 0 0 24 24", + height: "20px", + viewBox: "0 0 24 24", + width: "20px", + fill: "#37352f" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("g", null, /* @__PURE__ */ _react_17_0_2_react.exports.createElement("rect", { + fill: "none", + height: 24, + width: 24 + })), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("g", null, /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M16,5l-1.42,1.42l-1.59-1.59V16h-1.98V4.83L9.42,6.42L8,5l4-4L16,5z M20,10v11c0,1.1-0.9,2-2,2H6c-1.11,0-2-0.9-2-2V10 c0-1.11,0.89-2,2-2h3v2H6v11h12V10h-3V8h3C19.1,8,20,8.89,20,10z" + }))); +} +const getPathOfImage = (vault, image2) => { + return vault.getResourcePath(image2); +}; +const detectWikiInternalLink = (lineText) => { + var _a, _b; + const { + metadataCache, + vault + } = appStore.getState().dailyNotesState.app; + const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1]; + const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5]; + const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); + if (file === null) { + return { + linkText: internalFileName, + altText: internalAltName, + path: "", + filePath: "" + }; + } else { + const imagePath = getPathOfImage(vault, file); + if (internalAltName) { + return { + linkText: internalFileName, + altText: internalAltName, + path: imagePath, + filePath: file.path + }; + } else { + return { + linkText: internalFileName, + altText: "", + path: imagePath, + filePath: file.path + }; } - if (hasArrayBuffer && ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) { - length = a.length; - if (length != b.length) - return false; - for (i = length; i-- !== 0; ) - if (a[i] !== b[i]) - return false; - return true; + } +}; +const detectMDInternalLink = (lineText) => { + var _a, _b; + const { + metadataCache, + vault + } = appStore.getState().dailyNotesState.app; + const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5]; + const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2]; + const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); + if (file === null) { + return { + linkText: internalFileName, + altText: internalAltName, + path: "", + filePath: "" + }; + } else { + const imagePath = getPathOfImage(vault, file); + if (internalAltName) { + return { + linkText: internalFileName, + altText: internalAltName, + path: imagePath, + filePath: file.path + }; + } else { + return { + linkText: internalFileName, + altText: "", + path: imagePath, + filePath: file.path + }; } - if (a.constructor === RegExp) - return a.source === b.source && a.flags === b.flags; - if (a.valueOf !== Object.prototype.valueOf) - return a.valueOf() === b.valueOf(); - if (a.toString !== Object.prototype.toString) - return a.toString() === b.toString(); - keys = Object.keys(a); - length = keys.length; - if (length !== Object.keys(b).length) - return false; - for (i = length; i-- !== 0; ) - if (!Object.prototype.hasOwnProperty.call(b, keys[i])) - return false; - if (hasElementType && a instanceof Element) - return false; - for (i = length; i-- !== 0; ) { - if ((keys[i] === "_owner" || keys[i] === "__v" || keys[i] === "__o") && a.$$typeof) { - continue; + } +}; +const ShareMemoImageDialog = (props) => { + var _a; + const { + memo: propsMemo, + destroy + } = props; + const { + memos + } = appStore.getState().memoState; + let memosLength; + let createdDays; + if (memos.length) { + memosLength = memos.length - 1; + createdDays = memos ? Math.ceil((Date.now() - utils$1.getTimeStampByDate(memos[memosLength].createdAt)) / 1e3 / 3600 / 24) : 0; + } + const memo2 = __spreadProps(__spreadValues({}, propsMemo), { + createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt) + }); + const footerEnd = ShareFooterEnd.replace("{UserName}", UserName); + const footerStart = ShareFooterStart.replace("{MemosNum}", memos.length.toString()).replace("{UsedDay}", createdDays.toString()); + let externalImageUrls = []; + const internalImageUrls = []; + let allMarkdownLink = []; + let allInternalLink = []; + if (new RegExp(IMAGE_URL_REG).test(memo2.content)) { + let allExternalImageUrls = []; + const anotherExternalImageUrls = []; + if (new RegExp(MARKDOWN_URL_REG).test(memo2.content)) { + allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG)); + } + if (new RegExp(WIKI_IMAGE_URL_REG).test(memo2.content)) { + allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG)); + } + if (new RegExp(MARKDOWN_WEB_URL_REG).test(memo2.content)) { + allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG)); + } + if (allInternalLink.length) { + for (let i = 0; i < allInternalLink.length; i++) { + const allInternalLinkElement = allInternalLink[i]; + internalImageUrls.push(detectWikiInternalLink(allInternalLinkElement)); } - if (!equal(a[keys[i]], b[keys[i]])) - return false; } - return true; - } - return a !== a && b !== b; -} -var _reactFastCompare_3_2_0_reactFastCompare = function isEqual(a, b) { - try { - return equal(a, b); - } catch (error) { - if ((error.message || "").match(/stack|recursion/i)) { - console.warn("react-fast-compare cannot handle circular refs"); - return false; + if (allMarkdownLink.length) { + for (let i = 0; i < allMarkdownLink.length; i++) { + const allMarkdownLinkElement = allMarkdownLink[i]; + if (/(.*)http[s]?(.*)/.test(allMarkdownLinkElement)) { + anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(allMarkdownLinkElement)) == null ? void 0 : _a[5]); + } else { + internalImageUrls.push(detectMDInternalLink(allMarkdownLinkElement)); + } + } } - throw error; - } -}; -var EMPTY_MODIFIERS = []; -var usePopper = function usePopper2(referenceElement, popperElement, options) { - if (options === void 0) { - options = {}; + externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls); } - var prevOptions = _react_17_0_2_react.exports.useRef(null); - var optionsWithDefaults = { - onFirstUpdate: options.onFirstUpdate, - placement: options.placement || "bottom", - strategy: options.strategy || "absolute", - modifiers: options.modifiers || EMPTY_MODIFIERS + const [shortcutImgUrl, setShortcutImgUrl] = _react_17_0_2_react.exports.useState(""); + const [imgAmount, setImgAmount] = _react_17_0_2_react.exports.useState(externalImageUrls.length); + const memoElRef = _react_17_0_2_react.exports.useRef(null); + _react_17_0_2_react.exports.useEffect(() => { + if (imgAmount > 0) { + return; + } + changeBackgroundImage(); + setTimeout(() => { + if (!memoElRef.current) { + return; + } + let shareDialogBackgroundColor; + if (document.body.className.contains("theme-dark")) { + shareDialogBackgroundColor = "#727171"; + } else { + shareDialogBackgroundColor = "#eaeaea"; + } + toImage(memoElRef.current, { + backgroundColor: shareDialogBackgroundColor, + pixelRatio: window.devicePixelRatio * 2 + }).then((url) => { + setShortcutImgUrl(url); + }).catch(() => { + }); + }, ANIMATION_DURATION); + }, [changeBackgroundImage, imgAmount]); + const handleCloseBtnClick = () => { + destroy(); }; - var _React$useState = _react_17_0_2_react.exports.useState({ - styles: { - popper: { - position: optionsWithDefaults.strategy, - left: "0", - top: "0" - }, - arrow: { - position: "absolute" + const convertBase64ToBlob = (base64, type) => { + const bytes = window.atob(base64); + const ab2 = new ArrayBuffer(bytes.length); + const ia2 = new Uint8Array(ab2); + for (let i = 0; i < bytes.length; i++) { + ia2[i] = bytes.charCodeAt(i); + } + return new Blob([ab2], { + type + }); + }; + const convertBackgroundToBase64 = async (path) => { + const { + vault + } = dailyNotesService.getState().app; + const buffer = await vault.adapter.readBinary(path); + const arr = new Uint8Array(buffer); + const blob = new Blob([arr], { + type: "image/png" + }); + return new Promise((resolve) => { + const reader = new FileReader(); + reader.onloadend = () => { + const base64Url = reader.result; + resolve(base64Url); + }; + reader.readAsDataURL(blob); + }); + }; + const changeBackgroundImage = async () => { + const { + app: app2 + } = dailyNotesService.getState(); + let imageUrl; + let imagePath; + const lightBackgroundImage = encodeURI(lightBackground); + const darkBackgroundImage = encodeURI(darkBackground); + if (document.body.className.contains("theme-light")) { + if (await app2.vault.adapter.exists(DefaultLightBackgroundImage) && /\.(png|svg|jpg|jpeg)/g.test(DefaultLightBackgroundImage)) { + imagePath = DefaultLightBackgroundImage; + imageUrl = await convertBackgroundToBase64(imagePath); + } else { + imageUrl = lightBackgroundImage; + } + } else if (document.body.className.contains("theme-dark")) { + if (await app2.vault.adapter.exists(DefaultDarkBackgroundImage) && /\.(png|svg|jpg|jpeg)/g.test(DefaultDarkBackgroundImage)) { + imagePath = DefaultDarkBackgroundImage; + imageUrl = await convertBackgroundToBase64(imagePath); + } else { + imageUrl = darkBackgroundImage; } - }, - attributes: {} - }), state = _React$useState[0], setState = _React$useState[1]; - var updateStateModifier = _react_17_0_2_react.exports.useMemo(function() { - return { - name: "updateState", - enabled: true, - phase: "write", - fn: function fn2(_ref) { - var state2 = _ref.state; - var elements = Object.keys(state2.elements); - setState({ - styles: fromEntries(elements.map(function(element) { - return [element, state2.styles[element] || {}]; - })), - attributes: fromEntries(elements.map(function(element) { - return [element, state2.attributes[element]]; - })) - }); - }, - requires: ["computeStyles"] - }; - }, []); - var popperOptions = _react_17_0_2_react.exports.useMemo(function() { - var newOptions = { - onFirstUpdate: optionsWithDefaults.onFirstUpdate, - placement: optionsWithDefaults.placement, - strategy: optionsWithDefaults.strategy, - modifiers: [].concat(optionsWithDefaults.modifiers, [updateStateModifier, { - name: "applyStyles", - enabled: false - }]) - }; - if (_reactFastCompare_3_2_0_reactFastCompare(prevOptions.current, newOptions)) { - return prevOptions.current || newOptions; - } else { - prevOptions.current = newOptions; - return newOptions; } - }, [optionsWithDefaults.onFirstUpdate, optionsWithDefaults.placement, optionsWithDefaults.strategy, optionsWithDefaults.modifiers, updateStateModifier]); - var popperInstanceRef = _react_17_0_2_react.exports.useRef(); - useIsomorphicLayoutEffect(function() { - if (popperInstanceRef.current) { - popperInstanceRef.current.setOptions(popperOptions); + const memoShareDiv = document.querySelector(".dialog-wrapper .memo-background .property-image"); + memoShareDiv.style.backgroundImage = "url('" + imageUrl + "')"; + if (document.body.className.contains("theme-dark")) { + memoShareDiv.style.backgroundColor = "#1f1f1f"; } - }, [popperOptions]); - useIsomorphicLayoutEffect(function() { - if (referenceElement == null || popperElement == null) { - return; + }; + const handleCopytoClipboardBtnClick = async () => { + const { + vault + } = appStore.getState().dailyNotesState.app; + const divs = document.querySelector(".memo-shortcut-img"); + const myBase64 = divs.getAttribute("src").split("base64,")[1]; + const blobInput = convertBase64ToBlob(myBase64, "image/png"); + let aFile; + if (AutoSaveWhenOnMobile && require$$0.Platform.isMobile) { + blobInput.arrayBuffer().then(async (buffer) => { + const ext = "png"; + const dailyNotes = getAllDailyNotes_1(); + for (const string in dailyNotes) { + if (dailyNotes[string] instanceof require$$0.TFile) { + aFile = dailyNotes[string]; + break; + } + } + if (aFile !== void 0) { + await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, aFile), buffer); + } + }); } - var createPopper$1 = options.createPopper || createPopper; - var popperInstance = createPopper$1(referenceElement, popperElement, popperOptions); - popperInstanceRef.current = popperInstance; - return function() { - popperInstance.destroy(); - popperInstanceRef.current = null; - }; - }, [referenceElement, popperElement, options.createPopper]); - return { - state: popperInstanceRef.current ? popperInstanceRef.current.state : null, - styles: state.styles, - attributes: state.attributes, - update: popperInstanceRef.current ? popperInstanceRef.current.update : null, - forceUpdate: popperInstanceRef.current ? popperInstanceRef.current.forceUpdate : null + const clipboardItemInput = new ClipboardItem({ + "image/png": blobInput + }); + window.navigator["clipboard"].write([clipboardItemInput]); + new require$$0.Notice("Send to clipboard successfully"); }; -}; -var _propTypes_15_8_1_propTypes = { exports: {} }; -var ReactPropTypesSecret$1 = "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"; -var ReactPropTypesSecret_1 = ReactPropTypesSecret$1; -var ReactPropTypesSecret = ReactPropTypesSecret_1; -function emptyFunction() { -} -function emptyFunctionWithReset() { -} -emptyFunctionWithReset.resetWarningCache = emptyFunction; -var factoryWithThrowingShims = function() { - function shim(props, propName, componentName, location, propFullName, secret) { - if (secret === ReactPropTypesSecret) { - return; + const handleImageOnLoad = (ev) => { + if (ev.type === "error") { + new require$$0.Notice(t$1("Image load failed")); + ev.target.remove(); } - var err = new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types"); - err.name = "Invariant Violation"; - throw err; - } - shim.isRequired = shim; - function getShim() { - return shim; - } - var ReactPropTypes = { - array: shim, - bigint: shim, - bool: shim, - func: shim, - number: shim, - object: shim, - string: shim, - symbol: shim, - any: shim, - arrayOf: getShim, - element: shim, - elementType: shim, - instanceOf: getShim, - node: shim, - objectOf: getShim, - oneOf: getShim, - oneOfType: getShim, - shape: getShim, - exact: getShim, - checkPropTypes: emptyFunctionWithReset, - resetWarningCache: emptyFunction + setImgAmount(imgAmount - 1); }; - ReactPropTypes.PropTypes = ReactPropTypes; - return ReactPropTypes; -}; -{ - _propTypes_15_8_1_propTypes.exports = factoryWithThrowingShims(); -} -/*! -* tabbable 5.2.1 -* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE -*/ -var candidateSelectors = ["input", "select", "textarea", "a[href]", "button", "[tabindex]", "audio[controls]", "video[controls]", '[contenteditable]:not([contenteditable="false"])', "details>summary:first-of-type", "details"]; -var candidateSelector = /* @__PURE__ */ candidateSelectors.join(","); -var matches = typeof Element === "undefined" ? function() { -} : Element.prototype.matches || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; -var getCandidates = function getCandidates2(el, includeContainer, filter) { - var candidates = Array.prototype.slice.apply(el.querySelectorAll(candidateSelector)); - if (includeContainer && matches.call(el, candidateSelector)) { - candidates.unshift(el); - } - candidates = candidates.filter(filter); - return candidates; -}; -var isContentEditable = function isContentEditable2(node) { - return node.contentEditable === "true"; -}; -var getTabindex = function getTabindex2(node) { - var tabindexAttr = parseInt(node.getAttribute("tabindex"), 10); - if (!isNaN(tabindexAttr)) { - return tabindexAttr; - } - if (isContentEditable(node)) { - return 0; - } - if ((node.nodeName === "AUDIO" || node.nodeName === "VIDEO" || node.nodeName === "DETAILS") && node.getAttribute("tabindex") === null) { - return 0; - } - return node.tabIndex; -}; -var sortOrderedTabbables = function sortOrderedTabbables2(a, b) { - return a.tabIndex === b.tabIndex ? a.documentOrder - b.documentOrder : a.tabIndex - b.tabIndex; -}; -var isInput = function isInput2(node) { - return node.tagName === "INPUT"; -}; -var isHiddenInput = function isHiddenInput2(node) { - return isInput(node) && node.type === "hidden"; -}; -var isDetailsWithSummary = function isDetailsWithSummary2(node) { - var r2 = node.tagName === "DETAILS" && Array.prototype.slice.apply(node.children).some(function(child) { - return child.tagName === "SUMMARY"; + return /* @__PURE__ */ jsxs(Fragment, { + children: [/* @__PURE__ */ jsxs("div", { + className: "dialog-header-container", + children: [/* @__PURE__ */ jsxs("p", { + className: "title-text", + children: [/* @__PURE__ */ jsx("span", { + className: "icon-text", + children: "\u{1F970}" + }), t$1("Share Memo Image")] + }), /* @__PURE__ */ jsxs("div", { + className: "btn-group", + children: [/* @__PURE__ */ jsx("button", { + className: "btn copy-btn", + onClick: handleCopytoClipboardBtnClick, + children: /* @__PURE__ */ jsx(SvgShare, { + className: "icon-img" + }) + }), /* @__PURE__ */ jsx("button", { + className: "btn close-btn", + onClick: handleCloseBtnClick, + children: /* @__PURE__ */ jsx(SvgClose, { + className: "icon-img" + }) + })] + })] + }), /* @__PURE__ */ jsxs("div", { + className: "dialog-content-container", + children: [/* @__PURE__ */ jsx("div", { + className: `tip-words-container ${shortcutImgUrl ? "finish" : "loading"}`, + children: /* @__PURE__ */ jsx("p", { + className: "tip-text", + children: shortcutImgUrl ? t$1("\u2197Click the button to save") : t$1("Image is generating...") + }) + }), /* @__PURE__ */ jsxs("div", { + className: "memo-container", + ref: memoElRef, + children: [/* @__PURE__ */ jsx(Only, { + when: shortcutImgUrl !== "", + children: /* @__PURE__ */ jsx("img", { + className: "memo-shortcut-img", + src: shortcutImgUrl + }) + }), /* @__PURE__ */ jsxs("div", { + className: "memo-background", + children: [/* @__PURE__ */ jsx("div", { + className: "property-image", + style: { + backgroundSize: "cover", + backgroundRepeat: "no-repeat" + } + }), /* @__PURE__ */ jsx("span", { + className: "background-container" + }), /* @__PURE__ */ jsx("div", { + className: "memo-content-text", + dangerouslySetInnerHTML: { + __html: formatMemoContent(memo2.content) + } + }), /* @__PURE__ */ jsx(Only, { + when: externalImageUrls.length > 0, + children: /* @__PURE__ */ jsx("div", { + className: "images-container", + children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", { + src: imgUrl, + alt: "", + referrerPolicy: "no-referrer", + onLoad: handleImageOnLoad, + onError: handleImageOnLoad + }, idx)) + }) + }), /* @__PURE__ */ jsx(Only, { + when: internalImageUrls.length > 0, + children: /* @__PURE__ */ jsx("div", { + className: "images-container internal-embed image-embed is-loaded", + children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", { + className: "memo-img", + src: imgUrl.path, + alt: imgUrl.altText, + path: imgUrl.filePath + }, idx)) + }) + }), /* @__PURE__ */ jsxs("div", { + className: "watermark-container", + children: [/* @__PURE__ */ jsxs("span", { + className: "normal-text footer-start", + children: [/* @__PURE__ */ jsx("div", { + className: "property-social-icons" + }), /* @__PURE__ */ jsx("span", { + className: "name-text", + children: footerStart + })] + }), /* @__PURE__ */ jsx("span", { + className: "normal-text footer-end", + children: /* @__PURE__ */ jsx("span", { + className: "name-text", + children: footerEnd + }) + })] + })] + })] + })] + })] }); - return r2; -}; -var getCheckedRadio = function getCheckedRadio2(nodes, form) { - for (var i = 0; i < nodes.length; i++) { - if (nodes[i].checked && nodes[i].form === form) { - return nodes[i]; - } - } }; -var isTabbableRadio = function isTabbableRadio2(node) { - if (!node.name) { - return true; - } - var radioScope = node.form || node.ownerDocument; - var queryRadios = function queryRadios2(name) { - return radioScope.querySelectorAll('input[type="radio"][name="' + name + '"]'); - }; - var radioSet; - if (typeof window !== "undefined" && typeof window.CSS !== "undefined" && typeof window.CSS.escape === "function") { - radioSet = queryRadios(window.CSS.escape(node.name)); +function showShareMemoImageDialog(memo2) { + showDialog({ + className: "share-memo-image-dialog" + }, ShareMemoImageDialog, { + memo: memo2 + }); +} +var memo = ""; +const showMemoInDailyNotes = async (memoId, memoPath) => { + const { app: app2 } = dailyNotesService.getState(); + const lineNum = parseInt(memoId.slice(14)); + const file = app2.metadataCache.getFirstLinkpathDest("", memoPath); + if (!require$$0.Platform.isMobile) { + const leaf = app2.workspace.splitActiveLeaf(); + leaf.openFile(file, { eState: { line: lineNum } }); } else { - try { - radioSet = queryRadios(node.name); - } catch (err) { - console.error("Looks like you have a radio button with a name attribute containing invalid CSS selector characters and need the CSS.escape polyfill: %s", err.message); - return false; + let leaf = app2.workspace.activeLeaf; + if (leaf === null) { + leaf = app2.workspace.getLeaf(true); } + leaf.openFile(file, { eState: { line: lineNum } }); } - var checked = getCheckedRadio(radioSet, node.form); - return !checked || checked === node; + return; }; -var isRadio = function isRadio2(node) { - return isInput(node) && node.type === "radio"; +function SvgMore(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + xmlns: "http://www.w3.org/2000/svg", + height: "24px", + viewBox: "0 0 24 24", + width: "24px", + fill: "#37352f" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M0 0h24v24H0V0z", + fill: "none" + }), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z" + })); +} +function SvgComment(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + t: 1650249616615, + className: "icon", + viewBox: "0 0 1024 1024", + xmlns: "http://www.w3.org/2000/svg", + "p-id": 2597, + width: 20, + height: 20, + fill: "#37352f" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M853.333333 768c35.413333 0 64-20.650667 64-55.978667V170.581333A63.978667 63.978667 0 0 0 853.333333 106.666667H170.666667C135.253333 106.666667 106.666667 135.253333 106.666667 170.581333v541.44C106.666667 747.285333 135.338667 768 170.666667 768h201.173333l110.016 117.44a42.752 42.752 0 0 0 60.586667 0.042667L651.904 768H853.333333z m-219.029333-42.666667h-6.250667l-115.797333 129.962667c-0.106667 0.106667-116.010667-129.962667-116.010667-129.962667H170.666667c-11.776 0-21.333333-1.621333-21.333334-13.312V170.581333A21.205333 21.205333 0 0 1 170.666667 149.333333h682.666666c11.776 0 21.333333 9.536 21.333334 21.248v541.44c0 11.754667-9.472 13.312-21.333334 13.312H634.304zM341.333333 490.666667a42.666667 42.666667 0 1 0 0-85.333334 42.666667 42.666667 0 0 0 0 85.333334z m170.666667 0a42.666667 42.666667 0 1 0 0-85.333334 42.666667 42.666667 0 0 0 0 85.333334z m170.666667 0a42.666667 42.666667 0 1 0 0-85.333334 42.666667 42.666667 0 0 0 0 85.333334z", + fill: "#3D3D3D", + "p-id": 2598 + })); +} +function SvgTaskBlank(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + xmlns: "http://www.w3.org/2000/svg", + height: "20px", + viewBox: "0 0 24 24", + width: "20px", + fill: "#37352f" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M0 0h24v24H0V0z", + fill: "none" + }), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z" + })); +} +function SvgTask(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + xmlns: "http://www.w3.org/2000/svg", + height: "20px", + viewBox: "0 0 24 24", + width: "20px", + fill: "#37352f" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M0 0h24v24H0V0z", + fill: "none" + }), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14zM17.99 9l-1.41-1.42-6.59 6.59-2.58-2.57-1.42 1.41 4 3.99z" + })); +} +const getInitialAction = () => { + return { + type: "initialText", + value: "", + timestamp: Date.now(), + selectionStart: 0, + selectionEnd: 0 + }; }; -var isNonTabbableRadio = function isNonTabbableRadio2(node) { - return isRadio(node) && !isTabbableRadio(node); +const defaultConfig = { + initialValue: "", + interval: 300 }; -var isHidden = function isHidden2(node, displayCheck) { - if (getComputedStyle(node).visibility === "hidden") { - return true; - } - var isDirectSummary = matches.call(node, "details>summary:first-of-type"); - var nodeUnderDetails = isDirectSummary ? node.parentElement : node; - if (matches.call(nodeUnderDetails, "details:not([open]) *")) { - return true; - } - if (!displayCheck || displayCheck === "full") { - while (node) { - if (getComputedStyle(node).display === "none") { - return true; +class TinyUndo { + constructor(element, config = defaultConfig) { + this.listeners = []; + this.runUndo = () => { + const cursorPosition = this.actions[this.currentIndex].selectionStart; + if (this.currentIndex > 0) { + this.currentIndex--; } - node = node.parentElement; - } - } else if (displayCheck === "non-zero-area") { - var _node$getBoundingClie = node.getBoundingClientRect(), width = _node$getBoundingClie.width, height = _node$getBoundingClie.height; - return width === 0 && height === 0; - } - return false; -}; -var isDisabledFromFieldset = function isDisabledFromFieldset2(node) { - if (isInput(node) || node.tagName === "SELECT" || node.tagName === "TEXTAREA" || node.tagName === "BUTTON") { - var parentNode = node.parentElement; - while (parentNode) { - if (parentNode.tagName === "FIELDSET" && parentNode.disabled) { - for (var i = 0; i < parentNode.children.length; i++) { - var child = parentNode.children.item(i); - if (child.tagName === "LEGEND") { - if (child.contains(node)) { - return false; - } - return true; - } - } - return true; + this.element.value = this.actions[this.currentIndex].value; + this.element.setSelectionRange(cursorPosition, cursorPosition); + this.dispatchChange(); + }; + this.runRedo = () => { + if (this.currentIndex < this.actions.length - 1) { + this.currentIndex++; } - parentNode = parentNode.parentElement; - } - } - return false; -}; -var isNodeMatchingSelectorFocusable = function isNodeMatchingSelectorFocusable2(options, node) { - if (node.disabled || isHiddenInput(node) || isHidden(node, options.displayCheck) || isDetailsWithSummary(node) || isDisabledFromFieldset(node)) { - return false; - } - return true; -}; -var isNodeMatchingSelectorTabbable = function isNodeMatchingSelectorTabbable2(options, node) { - if (!isNodeMatchingSelectorFocusable(options, node) || isNonTabbableRadio(node) || getTabindex(node) < 0) { - return false; - } - return true; -}; -var tabbable = function tabbable2(el, options) { - options = options || {}; - var regularTabbables = []; - var orderedTabbables = []; - var candidates = getCandidates(el, options.includeContainer, isNodeMatchingSelectorTabbable.bind(null, options)); - candidates.forEach(function(candidate, i) { - var candidateTabindex = getTabindex(candidate); - if (candidateTabindex === 0) { - regularTabbables.push(candidate); - } else { - orderedTabbables.push({ - documentOrder: i, - tabIndex: candidateTabindex, - node: candidate + const cursorPosition = this.actions[this.currentIndex].selectionEnd; + this.element.value = this.actions[this.currentIndex].value; + this.element.setSelectionRange(cursorPosition, cursorPosition); + this.dispatchChange(); + }; + this.getActions = () => { + return this.actions; + }; + this.setState = (actions, index) => { + this.actions = [...actions]; + this.currentIndex = index < this.actions.length ? index : this.actions.length - 1; + this.dispatchChange(); + }; + this.resetState = () => { + this.actions = [getInitialAction()]; + this.currentIndex = 0; + this.dispatchChange(); + }; + this.destroy = () => { + this.rmEventListeners(); + }; + this.subscribe = (callback) => { + this.listeners.push(callback); + }; + this.handleElementKeydown = (event) => { + const keyboardEvent = event; + if (keyboardEvent.key === "z" && !keyboardEvent.shiftKey && (keyboardEvent.metaKey || keyboardEvent.ctrlKey)) { + event.preventDefault(); + this.runUndo(); + } else if (keyboardEvent.key === "z" && keyboardEvent.shiftKey && (keyboardEvent.metaKey || keyboardEvent.ctrlKey) || keyboardEvent.key === "y" && (keyboardEvent.metaKey || keyboardEvent.ctrlKey)) { + event.preventDefault(); + this.runRedo(); + } + }; + this.handleElementInput = (event) => { + const inputEvent = event; + const lastAction = this.actions[this.currentIndex]; + this.pushNewAction({ + type: inputEvent.inputType, + value: this.element.value, + timestamp: Date.now(), + selectionStart: this.element.selectionEnd - (this.element.value.length - lastAction.value.length), + selectionEnd: this.element.selectionEnd }); - } - }); - var tabbableNodes = orderedTabbables.sort(sortOrderedTabbables).map(function(a) { - return a.node; - }).concat(regularTabbables); - return tabbableNodes; -}; -var isTabbable = function isTabbable2(node, options) { - options = options || {}; - if (!node) { - throw new Error("No node provided"); - } - if (matches.call(node, candidateSelector) === false) { - return false; - } - return isNodeMatchingSelectorTabbable(options, node); -}; -var focusableCandidateSelector = /* @__PURE__ */ candidateSelectors.concat("iframe").join(","); -var isFocusable = function isFocusable2(node, options) { - options = options || {}; - if (!node) { - throw new Error("No node provided"); - } - if (matches.call(node, focusableCandidateSelector) === false) { - return false; - } - return isNodeMatchingSelectorFocusable(options, node); -}; -/*! -* focus-trap 6.7.2 -* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE -*/ -function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - enumerableOnly && (symbols = symbols.filter(function(sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - })), keys.push.apply(keys, symbols); - } - return keys; -} -function _objectSpread2(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i] != null ? arguments[i] : {}; - i % 2 ? ownKeys(Object(source), true).forEach(function(key) { - _defineProperty(target, key, source[key]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function(key) { - Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); - }); - } - return target; -} -function _defineProperty(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - return obj; -} -var activeFocusTraps = function() { - var trapQueue = []; - return { - activateTrap: function activateTrap(trap) { - if (trapQueue.length > 0) { - var activeTrap = trapQueue[trapQueue.length - 1]; - if (activeTrap !== trap) { - activeTrap.pause(); + }; + this.addEventListeners = () => { + this.element.addEventListener("keydown", this.handleElementKeydown); + this.element.addEventListener("input", this.handleElementInput); + }; + this.rmEventListeners = () => { + this.element.removeEventListener("keydown", this.handleElementKeydown); + this.element.removeEventListener("input", this.handleElementInput); + }; + this.pushNewAction = (action) => { + const lastAction = this.actions[this.currentIndex]; + if (lastAction && lastAction.type === action.type && action.timestamp - lastAction.timestamp < this.config.interval) { + this.actions[this.currentIndex] = Object.assign(Object.assign({}, lastAction), { value: action.value, selectionEnd: action.selectionEnd, timestamp: action.timestamp }); + } else { + if (this.config.maxSize && this.currentIndex >= this.config.maxSize) { + this.actions.shift(); + this.actions[0] = getInitialAction(); + } else { + this.currentIndex++; } + this.actions[this.currentIndex] = action; + this.actions = this.actions.slice(0, this.currentIndex + 1); } - var trapIndex = trapQueue.indexOf(trap); - if (trapIndex === -1) { - trapQueue.push(trap); - } else { - trapQueue.splice(trapIndex, 1); - trapQueue.push(trap); + this.dispatchChange(); + }; + this.dispatchChange = () => { + for (const cb2 of this.listeners) { + cb2([...this.actions], this.currentIndex); } - }, - deactivateTrap: function deactivateTrap(trap) { - var trapIndex = trapQueue.indexOf(trap); - if (trapIndex !== -1) { - trapQueue.splice(trapIndex, 1); + }; + this.element = element; + this.config = Object.assign(Object.assign({}, defaultConfig), config); + if (this.config.initialActions && this.config.initialActions.length > 0) { + this.actions = this.config.initialActions; + if (this.config.initialIndex !== void 0 && this.config.initialIndex < this.actions.length) { + this.currentIndex = this.config.initialIndex; + } else { + this.currentIndex = this.actions.length - 1; } - if (trapQueue.length > 0) { - trapQueue[trapQueue.length - 1].unpause(); + } else { + this.actions = [getInitialAction()]; + this.currentIndex = 0; + if (this.config.initialValue !== "") { + this.actions.push({ + type: "insertText", + value: this.config.initialValue, + timestamp: Date.now(), + selectionStart: 0, + selectionEnd: this.config.initialValue.length + }); + this.currentIndex++; } } - }; -}(); -var isSelectableInput = function isSelectableInput2(node) { - return node.tagName && node.tagName.toLowerCase() === "input" && typeof node.select === "function"; -}; -var isEscapeEvent = function isEscapeEvent2(e) { - return e.key === "Escape" || e.key === "Esc" || e.keyCode === 27; -}; -var isTabEvent = function isTabEvent2(e) { - return e.key === "Tab" || e.keyCode === 9; -}; -var delay = function delay2(fn2) { - return setTimeout(fn2, 0); -}; -var findIndex = function findIndex2(arr, fn2) { - var idx = -1; - arr.every(function(value, i) { - if (fn2(value)) { - idx = i; - return false; - } - return true; - }); - return idx; -}; -var valueOrHandler = function valueOrHandler2(value) { - for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - params[_key - 1] = arguments[_key]; + this.element.value = this.actions[this.currentIndex].value; + this.addEventListeners(); } - return typeof value === "function" ? value.apply(void 0, params) : value; -}; -var getActualTarget = function getActualTarget2(event) { - return event.target.shadowRoot && typeof event.composedPath === "function" ? event.composedPath()[0] : event.target; -}; -var createFocusTrap$1 = function createFocusTrap2(elements, userOptions) { - var doc = (userOptions === null || userOptions === void 0 ? void 0 : userOptions.document) || document; - var config = _objectSpread2({ - returnFocusOnDeactivate: true, - escapeDeactivates: true, - delayInitialFocus: true - }, userOptions); - var state = { - containers: [], - tabbableGroups: [], - nodeFocusedBeforeActivation: null, - mostRecentlyFocusedNode: null, - active: false, - paused: false, - delayInitialFocusTimer: void 0 - }; - var trap; - var getOption = function getOption2(configOverrideOptions, optionName, configOptionName) { - return configOverrideOptions && configOverrideOptions[optionName] !== void 0 ? configOverrideOptions[optionName] : config[configOptionName || optionName]; - }; - var containersContain = function containersContain2(element) { - return !!(element && state.containers.some(function(container) { - return container.contains(element); - })); - }; - var getNodeForOption = function getNodeForOption2(optionName) { - var optionValue = config[optionName]; - if (typeof optionValue === "function") { - for (var _len2 = arguments.length, params = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - params[_key2 - 1] = arguments[_key2]; - } - optionValue = optionValue.apply(void 0, params); - } - if (!optionValue) { - if (optionValue === void 0 || optionValue === false) { - return optionValue; - } - throw new Error("`".concat(optionName, "` was specified but was not a node, or did not return a node")); - } - var node = optionValue; - if (typeof optionValue === "string") { - node = doc.querySelector(optionValue); - if (!node) { - throw new Error("`".concat(optionName, "` as selector refers to no known node")); - } - } - return node; - }; - var getInitialFocusNode = function getInitialFocusNode2() { - var node = getNodeForOption("initialFocus"); - if (node === false) { - return false; - } - if (node === void 0) { - if (containersContain(doc.activeElement)) { - node = doc.activeElement; - } else { - var firstTabbableGroup = state.tabbableGroups[0]; - var firstTabbableNode = firstTabbableGroup && firstTabbableGroup.firstTabbableNode; - node = firstTabbableNode || getNodeForOption("fallbackFocus"); +} +function useRefresh() { + const [, setBoolean] = _react_17_0_2_react.exports.useState(false); + const refresh = _react_17_0_2_react.exports.useCallback(() => { + setBoolean((ps) => { + return !ps; + }); + }, []); + return refresh; +} +var editor = ""; +var _textareaCaret_3_0_2_textareaCaret = { exports: {} }; +(function(module2) { + (function() { + var properties = [ + "direction", + "boxSizing", + "width", + "height", + "overflowX", + "overflowY", + "borderTopWidth", + "borderRightWidth", + "borderBottomWidth", + "borderLeftWidth", + "borderStyle", + "paddingTop", + "paddingRight", + "paddingBottom", + "paddingLeft", + "fontStyle", + "fontVariant", + "fontWeight", + "fontStretch", + "fontSize", + "fontSizeAdjust", + "lineHeight", + "fontFamily", + "textAlign", + "textTransform", + "textIndent", + "textDecoration", + "letterSpacing", + "wordSpacing", + "tabSize", + "MozTabSize" + ]; + var isBrowser = typeof window !== "undefined"; + var isFirefox = isBrowser && window.mozInnerScreenX != null; + function getCaretCoordinates2(element, position, options) { + if (!isBrowser) { + throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser"); } - } - if (!node) { - throw new Error("Your focus-trap needs to have at least one focusable element"); - } - return node; - }; - var updateTabbableNodes = function updateTabbableNodes2() { - state.tabbableGroups = state.containers.map(function(container) { - var tabbableNodes = tabbable(container); - if (tabbableNodes.length > 0) { - return { - container, - firstTabbableNode: tabbableNodes[0], - lastTabbableNode: tabbableNodes[tabbableNodes.length - 1] - }; + var debug = options && options.debug || false; + if (debug) { + var el = document.querySelector("#input-textarea-caret-position-mirror-div"); + if (el) { + el.parentNode.removeChild(el); + } } - return void 0; - }).filter(function(group) { - return !!group; - }); - if (state.tabbableGroups.length <= 0 && !getNodeForOption("fallbackFocus")) { - throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times"); - } - }; - var tryFocus = function tryFocus2(node) { - if (node === false) { - return; - } - if (node === doc.activeElement) { - return; - } - if (!node || !node.focus) { - tryFocus2(getInitialFocusNode()); - return; - } - node.focus({ - preventScroll: !!config.preventScroll - }); - state.mostRecentlyFocusedNode = node; - if (isSelectableInput(node)) { - node.select(); - } - }; - var getReturnFocusNode = function getReturnFocusNode2(previousActiveElement) { - var node = getNodeForOption("setReturnFocus", previousActiveElement); - return node ? node : node === false ? false : previousActiveElement; - }; - var checkPointerDown = function checkPointerDown2(e) { - var target = getActualTarget(e); - if (containersContain(target)) { - return; - } - if (valueOrHandler(config.clickOutsideDeactivates, e)) { - trap.deactivate({ - returnFocus: config.returnFocusOnDeactivate && !isFocusable(target) + var div = document.createElement("div"); + div.id = "input-textarea-caret-position-mirror-div"; + document.body.appendChild(div); + var style = div.style; + var computed = window.getComputedStyle ? getComputedStyle(element) : element.currentStyle; + style.whiteSpace = "pre-wrap"; + if (element.nodeName !== "INPUT") + style.wordWrap = "break-word"; + style.position = "absolute"; + if (!debug) + style.visibility = "hidden"; + properties.forEach(function(prop) { + style[prop] = computed[prop]; }); - return; - } - if (valueOrHandler(config.allowOutsideClick, e)) { - return; - } - e.preventDefault(); - }; - var checkFocusIn = function checkFocusIn2(e) { - var target = getActualTarget(e); - var targetContained = containersContain(target); - if (targetContained || target instanceof Document) { - if (targetContained) { - state.mostRecentlyFocusedNode = target; + if (isFirefox) { + if (element.scrollHeight > parseInt(computed.height)) + style.overflowY = "scroll"; + } else { + style.overflow = "hidden"; } - } else { - e.stopImmediatePropagation(); - tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode()); - } - }; - var checkTab = function checkTab2(e) { - var target = getActualTarget(e); - updateTabbableNodes(); - var destinationNode = null; - if (state.tabbableGroups.length > 0) { - var containerIndex = findIndex(state.tabbableGroups, function(_ref) { - var container = _ref.container; - return container.contains(target); - }); - if (containerIndex < 0) { - if (e.shiftKey) { - destinationNode = state.tabbableGroups[state.tabbableGroups.length - 1].lastTabbableNode; - } else { - destinationNode = state.tabbableGroups[0].firstTabbableNode; - } - } else if (e.shiftKey) { - var startOfGroupIndex = findIndex(state.tabbableGroups, function(_ref2) { - var firstTabbableNode = _ref2.firstTabbableNode; - return target === firstTabbableNode; - }); - if (startOfGroupIndex < 0 && (state.tabbableGroups[containerIndex].container === target || isFocusable(target) && !isTabbable(target))) { - startOfGroupIndex = containerIndex; - } - if (startOfGroupIndex >= 0) { - var destinationGroupIndex = startOfGroupIndex === 0 ? state.tabbableGroups.length - 1 : startOfGroupIndex - 1; - var destinationGroup = state.tabbableGroups[destinationGroupIndex]; - destinationNode = destinationGroup.lastTabbableNode; - } + div.textContent = element.value.substring(0, position); + if (element.nodeName === "INPUT") + div.textContent = div.textContent.replace(/\s/g, "\xA0"); + var span = document.createElement("span"); + span.textContent = element.value.substring(position) || "."; + div.appendChild(span); + var coordinates = { + top: span.offsetTop + parseInt(computed["borderTopWidth"]), + left: span.offsetLeft + parseInt(computed["borderLeftWidth"]) + }; + if (debug) { + span.style.backgroundColor = "#aaa"; } else { - var lastOfGroupIndex = findIndex(state.tabbableGroups, function(_ref3) { - var lastTabbableNode = _ref3.lastTabbableNode; - return target === lastTabbableNode; - }); - if (lastOfGroupIndex < 0 && (state.tabbableGroups[containerIndex].container === target || isFocusable(target) && !isTabbable(target))) { - lastOfGroupIndex = containerIndex; - } - if (lastOfGroupIndex >= 0) { - var _destinationGroupIndex = lastOfGroupIndex === state.tabbableGroups.length - 1 ? 0 : lastOfGroupIndex + 1; - var _destinationGroup = state.tabbableGroups[_destinationGroupIndex]; - destinationNode = _destinationGroup.firstTabbableNode; - } + document.body.removeChild(div); } - } else { - destinationNode = getNodeForOption("fallbackFocus"); - } - if (destinationNode) { - e.preventDefault(); - tryFocus(destinationNode); - } - }; - var checkKey = function checkKey2(e) { - if (isEscapeEvent(e) && valueOrHandler(config.escapeDeactivates, e) !== false) { - e.preventDefault(); - trap.deactivate(); - return; - } - if (isTabEvent(e)) { - checkTab(e); - return; - } - }; - var checkClick = function checkClick2(e) { - if (valueOrHandler(config.clickOutsideDeactivates, e)) { - return; - } - var target = getActualTarget(e); - if (containersContain(target)) { - return; - } - if (valueOrHandler(config.allowOutsideClick, e)) { - return; + return coordinates; } - e.preventDefault(); - e.stopImmediatePropagation(); - }; - var addListeners = function addListeners2() { - if (!state.active) { - return; + { + module2.exports = getCaretCoordinates2; } - activeFocusTraps.activateTrap(trap); - state.delayInitialFocusTimer = config.delayInitialFocus ? delay(function() { - tryFocus(getInitialFocusNode()); - }) : tryFocus(getInitialFocusNode()); - doc.addEventListener("focusin", checkFocusIn, true); - doc.addEventListener("mousedown", checkPointerDown, { - capture: true, - passive: false - }); - doc.addEventListener("touchstart", checkPointerDown, { - capture: true, - passive: false - }); - doc.addEventListener("click", checkClick, { - capture: true, - passive: false - }); - doc.addEventListener("keydown", checkKey, { - capture: true, - passive: false + })(); +})(_textareaCaret_3_0_2_textareaCaret); +var getCaretCoordinates = _textareaCaret_3_0_2_textareaCaret.exports; +var NativeCustomEvent = commonjsGlobal.CustomEvent; +function useNative() { + try { + var p2 = new NativeCustomEvent("cat", { detail: { foo: "bar" } }); + return p2.type === "cat" && p2.detail.foo === "bar"; + } catch (e) { + } + return false; +} +var _customEvent_1_0_1_customEvent = useNative() ? NativeCustomEvent : typeof document !== "undefined" && typeof document.createEvent === "function" ? function CustomEvent(type, params) { + var e = document.createEvent("CustomEvent"); + if (params) { + e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail); + } else { + e.initCustomEvent(type, false, false, void 0); + } + return e; +} : function CustomEvent2(type, params) { + var e = document.createEventObject(); + e.type = type; + if (params) { + e.bubbles = Boolean(params.bubbles); + e.cancelable = Boolean(params.cancelable); + e.detail = params.detail; + } else { + e.bubbles = false; + e.cancelable = false; + e.detail = void 0; + } + return e; +}; +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value, + enumerable: true, + configurable: true, + writable: true }); - return trap; - }; - var removeListeners = function removeListeners2() { - if (!state.active) { - return; - } - doc.removeEventListener("focusin", checkFocusIn, true); - doc.removeEventListener("mousedown", checkPointerDown, true); - doc.removeEventListener("touchstart", checkPointerDown, true); - doc.removeEventListener("click", checkClick, true); - doc.removeEventListener("keydown", checkKey, true); - return trap; - }; - trap = { - activate: function activate(activateOptions) { - if (state.active) { - return this; - } - var onActivate = getOption(activateOptions, "onActivate"); - var onPostActivate = getOption(activateOptions, "onPostActivate"); - var checkCanFocusTrap = getOption(activateOptions, "checkCanFocusTrap"); - if (!checkCanFocusTrap) { - updateTabbableNodes(); - } - state.active = true; - state.paused = false; - state.nodeFocusedBeforeActivation = doc.activeElement; - if (onActivate) { - onActivate(); - } - var finishActivation = function finishActivation2() { - if (checkCanFocusTrap) { - updateTabbableNodes(); - } - addListeners(); - if (onPostActivate) { - onPostActivate(); - } - }; - if (checkCanFocusTrap) { - checkCanFocusTrap(state.containers.concat()).then(finishActivation, finishActivation); - return this; - } - finishActivation(); - return this; - }, - deactivate: function deactivate(deactivateOptions) { - if (!state.active) { - return this; - } - clearTimeout(state.delayInitialFocusTimer); - state.delayInitialFocusTimer = void 0; - removeListeners(); - state.active = false; - state.paused = false; - activeFocusTraps.deactivateTrap(trap); - var onDeactivate = getOption(deactivateOptions, "onDeactivate"); - var onPostDeactivate = getOption(deactivateOptions, "onPostDeactivate"); - var checkCanReturnFocus = getOption(deactivateOptions, "checkCanReturnFocus"); - if (onDeactivate) { - onDeactivate(); - } - var returnFocus = getOption(deactivateOptions, "returnFocus", "returnFocusOnDeactivate"); - var finishDeactivation = function finishDeactivation2() { - delay(function() { - if (returnFocus) { - tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation)); - } - if (onPostDeactivate) { - onPostDeactivate(); - } - }); - }; - if (returnFocus && checkCanReturnFocus) { - checkCanReturnFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation)).then(finishDeactivation, finishDeactivation); - return this; - } - finishDeactivation(); - return this; - }, - pause: function pause() { - if (state.paused || !state.active) { - return this; - } - state.paused = true; - removeListeners(); - return this; - }, - unpause: function unpause() { - if (!state.paused || !state.active) { - return this; - } - state.paused = false; - updateTabbableNodes(); - addListeners(); - return this; - }, - updateContainerElements: function updateContainerElements(containerElements) { - var elementsAsArray = [].concat(containerElements).filter(Boolean); - state.containers = elementsAsArray.map(function(element) { - return typeof element === "string" ? doc.querySelector(element) : element; - }); - if (state.active) { - updateTabbableNodes(); - } - return this; + } else { + obj[key] = value; + } + return obj; +} +function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + if (typeof Object.getOwnPropertySymbols === "function") { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + })); } - }; - trap.updateContainerElements(elements); - return trap; -}; -var focusTrap_esm = /* @__PURE__ */ Object.freeze({ - __proto__: null, - [Symbol.toStringTag]: "Module", - createFocusTrap: createFocusTrap$1 -}); -var require$$3 = /* @__PURE__ */ getAugmentedNamespace(focusTrap_esm); -function _typeof(obj) { - "@babel/helpers - typeof"; - return _typeof = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(obj2) { - return typeof obj2; - } : function(obj2) { - return obj2 && typeof Symbol == "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2; - }, _typeof(obj); + ownKeys.forEach(function(key) { + _defineProperty(target, key, source[key]); + }); + } + return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -17084,11 +12443,57 @@ function _createClass(Constructor, protoProps, staticProps) { _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); return Constructor; } +function _typeof2(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof2 = function _typeof22(obj2) { + return typeof obj2; + }; + } else { + _typeof2 = function _typeof22(obj2) { + return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2; + }; + } + return _typeof2(obj); +} +function _typeof(obj) { + if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") { + _typeof = function _typeof3(obj2) { + return _typeof2(obj2); + }; + } else { + _typeof = function _typeof3(obj2) { + return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : _typeof2(obj2); + }; + } + return _typeof(obj); +} +function _assertThisInitialized(self2) { + if (self2 === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self2; +} +function _possibleConstructorReturn(self2, call) { + if (call && (_typeof(call) === "object" || typeof call === "function")) { + return call; + } + return _assertThisInitialized(self2); +} +function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) { + return o2.__proto__ || Object.getPrototypeOf(o2); + }; + return _getPrototypeOf(o); +} +function _setPrototypeOf(o, p2) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p3) { + o2.__proto__ = p3; + return o2; + }; + return _setPrototypeOf(o, p2); +} function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); @@ -17100,2322 +12505,2705 @@ function _inherits(subClass, superClass) { configurable: true } }); - Object.defineProperty(subClass, "prototype", { - writable: false - }); if (superClass) _setPrototypeOf(subClass, superClass); } -function _setPrototypeOf(o, p2) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p3) { - o2.__proto__ = p3; - return o2; - }; - return _setPrototypeOf(o, p2); -} -function _createSuper(Derived) { - var hasNativeReflectConstruct = _isNativeReflectConstruct(); - return function _createSuperInternal() { - var Super = _getPrototypeOf(Derived), result; - if (hasNativeReflectConstruct) { - var NewTarget = _getPrototypeOf(this).constructor; - result = Reflect.construct(Super, arguments, NewTarget); - } else { - result = Super.apply(this, arguments); +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { + arr2[i] = arr[i]; } - return _possibleConstructorReturn(this, result); - }; -} -function _possibleConstructorReturn(self2, call) { - if (call && (_typeof(call) === "object" || typeof call === "function")) { - return call; - } else if (call !== void 0) { - throw new TypeError("Derived constructors may only return object or undefined"); + return arr2; } - return _assertThisInitialized(self2); } -function _assertThisInitialized(self2) { - if (self2 === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - return self2; +function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") + return Array.from(iter); } -function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) - return false; - if (Reflect.construct.sham) - return false; - if (typeof Proxy === "function") - return true; - try { - Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() { - })); - return true; - } catch (e) { - return false; - } +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); } -function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) { - return o2.__proto__ || Object.getPrototypeOf(o2); - }; - return _getPrototypeOf(o); +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } -var React = _react_17_0_2_react.exports; -var ReactDOM = _reactDom_17_0_2_reactDom.exports; -var PropTypes = _propTypes_15_8_1_propTypes.exports; -var _require = require$$3, createFocusTrap = _require.createFocusTrap; -var FocusTrap = /* @__PURE__ */ function(_React$Component) { - _inherits(FocusTrap2, _React$Component); - var _super = _createSuper(FocusTrap2); - function FocusTrap2(props) { +var KEY_CODES = { + ESC: 27, + UP: 38, + DOWN: 40, + LEFT: 37, + RIGHT: 39, + ENTER: 13, + TAB: 9 +}; +var Listener = function Listener2() { + var _this = this; + _classCallCheck(this, Listener2); + this.startListen = function(ref) { + if (!ref) + return; + ref.addEventListener("keydown", _this.f); + }; + this.stopListen = function(ref) { + if (!ref) + return; + ref.removeEventListener("keydown", _this.f); + }; + this.add = function(keyCodes, fn2) { + var keyCode = keyCodes; + if (typeof keyCode !== "object") + keyCode = [keyCode]; + _this.listeners[_this.index] = { + keyCode, + fn: fn2 + }; + return _this.index++; + }; + this.remove = function(id2) { + delete _this.listeners[id2]; + }; + this.removeAll = function() { + _this.listeners = {}; + _this.index = 1; + }; + this.index = 1; + this.listeners = {}; + this.f = function(e) { + if (!e) + return; + var code = e.keyCode || e.which; + Object.values(_this.listeners).forEach(function(_ref) { + var keyCode = _ref.keyCode, fn2 = _ref.fn; + if (keyCode.includes(code)) { + e.stopPropagation(); + e.preventDefault(); + fn2(e); + } + }); + }; +}; +var Listeners = new Listener(); +var Item = /* @__PURE__ */ function(_React$Component) { + _inherits(Item2, _React$Component); + function Item2() { + var _getPrototypeOf2; + var _this; + _classCallCheck(this, Item2); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(Item2)).call.apply(_getPrototypeOf2, [this].concat(args))); + _this.selectItem = function() { + var _this$props = _this.props, item = _this$props.item, onSelectHandler = _this$props.onSelectHandler; + onSelectHandler(item); + }; + return _this; + } + _createClass(Item2, [{ + key: "shouldComponentUpdate", + value: function shouldComponentUpdate(nextProps) { + if (this.props.item !== nextProps.item || this.props.selected !== nextProps.selected || this.props.style !== nextProps.style || this.props.className !== nextProps.className) { + return true; + } + return false; + } + }, { + key: "render", + value: function render() { + var _this2 = this; + var _this$props2 = this.props, Component = _this$props2.component, style = _this$props2.style, onClickHandler = _this$props2.onClickHandler, item = _this$props2.item, selected = _this$props2.selected, className = _this$props2.className, innerRef = _this$props2.innerRef; + return React.createElement("li", { + className: "rta__item ".concat(selected === true ? "rta__item--selected" : "", " ").concat(className || ""), + style + }, React.createElement("div", { + className: "rta__entity ".concat(selected === true ? "rta__entity--selected" : ""), + role: "button", + tabIndex: 0, + onClick: onClickHandler, + onFocus: this.selectItem, + onMouseEnter: this.selectItem, + onTouchStart: function onTouchStart() { + _this2.clicked = true; + _this2.selectItem(); + }, + onTouchEnd: function onTouchEnd(e) { + e.preventDefault(); + if (_this2.clicked) { + onClickHandler(e); + } + }, + onTouchMove: function onTouchMove() { + _this2.clicked = false; + }, + onTouchCancel: function onTouchCancel() { + _this2.clicked = false; + }, + ref: innerRef + }, React.createElement(Component, { + selected, + entity: item + }))); + } + }]); + return Item2; +}(React.Component); +var List = /* @__PURE__ */ function(_React$Component) { + _inherits(List2, _React$Component); + function List2() { + var _getPrototypeOf2; var _this; - _classCallCheck(this, FocusTrap2); - _this = _super.call(this, props); - _this.tailoredFocusTrapOptions = { - returnFocusOnDeactivate: false + _classCallCheck(this, List2); + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(List2)).call.apply(_getPrototypeOf2, [this].concat(args))); + _this.state = { + selectedItem: null }; - _this.returnFocusOnDeactivate = true; - var focusTrapOptions = props.focusTrapOptions; - for (var optionName in focusTrapOptions) { - if (!Object.prototype.hasOwnProperty.call(focusTrapOptions, optionName)) { - continue; + _this.cachedIdOfItems = /* @__PURE__ */ new Map(); + _this.onPressEnter = function(e) { + if (typeof e !== "undefined") { + e.preventDefault(); } - if (optionName === "returnFocusOnDeactivate") { - _this.returnFocusOnDeactivate = !!focusTrapOptions[optionName]; - continue; + var values = _this.props.values; + _this.modifyText(values[_this.getPositionInList()]); + }; + _this.getPositionInList = function() { + var values = _this.props.values; + var selectedItem = _this.state.selectedItem; + if (!selectedItem) + return 0; + return values.findIndex(function(a) { + return _this.getId(a) === _this.getId(selectedItem); + }); + }; + _this.getId = function(item) { + if (_this.cachedIdOfItems.has(item)) { + return _this.cachedIdOfItems.get(item); } - if (optionName === "onPostDeactivate") { - _this.onPostDeactivate = focusTrapOptions[optionName]; - continue; + var textToReplace = _this.props.getTextToReplace(item); + var computeId = function computeId2() { + if (textToReplace) { + if (textToReplace.key) { + return textToReplace.key; + } + if (typeof item === "string" || !item.key) { + return textToReplace.text; + } + } + if (!item.key) { + throw new Error("Item ".concat(JSON.stringify(item), ' has to have defined "key" property')); + } + return item.key; + }; + var id2 = computeId(); + _this.cachedIdOfItems.set(item, id2); + return id2; + }; + _this.listeners = []; + _this.itemsRef = {}; + _this.modifyText = function(value) { + if (!value) + return; + var onSelect = _this.props.onSelect; + onSelect(value); + }; + _this.selectItem = function(item) { + var keyboard = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false; + var onItemHighlighted = _this.props.onItemHighlighted; + if (_this.state.selectedItem === item) + return; + _this.setState({ + selectedItem: item + }, function() { + onItemHighlighted(item); + if (keyboard) { + _this.props.dropdownScroll(_this.itemsRef[_this.getId(item)]); + } + }); + }; + _this.scroll = function(e) { + e.preventDefault(); + var values = _this.props.values; + var code = e.keyCode || e.which; + var oldPosition = _this.getPositionInList(); + var newPosition; + switch (code) { + case KEY_CODES.DOWN: + newPosition = oldPosition + 1; + break; + case KEY_CODES.UP: + newPosition = oldPosition - 1; + break; + default: + newPosition = oldPosition; + break; } - _this.tailoredFocusTrapOptions[optionName] = focusTrapOptions[optionName]; - } - _this.focusTrapElements = props.containerElements || []; - _this.updatePreviousElement(); + newPosition = (newPosition % values.length + values.length) % values.length; + _this.selectItem(values[newPosition], [KEY_CODES.DOWN, KEY_CODES.UP].includes(code)); + }; + _this.isSelected = function(item) { + var selectedItem = _this.state.selectedItem; + if (!selectedItem) + return false; + return _this.getId(selectedItem) === _this.getId(item); + }; return _this; } - _createClass(FocusTrap2, [{ - key: "getDocument", - value: function getDocument() { - return this.props.focusTrapOptions.document || (typeof document !== "undefined" ? document : void 0); + _createClass(List2, [{ + key: "componentDidMount", + value: function componentDidMount() { + this.listeners.push(Listeners.add([KEY_CODES.DOWN, KEY_CODES.UP], this.scroll), Listeners.add([KEY_CODES.ENTER, KEY_CODES.TAB], this.onPressEnter)); + var values = this.props.values; + if (values && values[0]) + this.selectItem(values[0]); } }, { - key: "getNodeForOption", - value: function getNodeForOption(optionName) { - var optionValue = this.tailoredFocusTrapOptions[optionName]; - if (!optionValue) { - return null; - } - var node = optionValue; - if (typeof optionValue === "string") { - var _this$getDocument; - node = (_this$getDocument = this.getDocument()) === null || _this$getDocument === void 0 ? void 0 : _this$getDocument.querySelector(optionValue); - if (!node) { - throw new Error("`".concat(optionName, "` refers to no known node")); - } - } - if (typeof optionValue === "function") { - node = optionValue(); - if (!node) { - throw new Error("`".concat(optionName, "` did not return a node")); - } + key: "componentDidUpdate", + value: function componentDidUpdate(_ref) { + var _this2 = this; + var oldValues = _ref.values; + var values = this.props.values; + var oldValuesSerialized = oldValues.map(function(val) { + return _this2.getId(val); + }).join(""); + var newValuesSerialized = values.map(function(val) { + return _this2.getId(val); + }).join(""); + if (oldValuesSerialized !== newValuesSerialized && values && values[0]) { + this.selectItem(values[0]); } - return node; } }, { - key: "getReturnFocusNode", - value: function getReturnFocusNode() { - var node = this.getNodeForOption("setReturnFocus"); - return node ? node : this.previouslyFocusedElement; - } - }, { - key: "updatePreviousElement", - value: function updatePreviousElement() { - var currentDocument = this.getDocument(); - if (currentDocument) { - this.previouslyFocusedElement = currentDocument.activeElement; + key: "componentWillUnmount", + value: function componentWillUnmount() { + var listener; + while (this.listeners.length) { + listener = this.listeners.pop(); + Listeners.remove(listener); } } }, { - key: "deactivateTrap", - value: function deactivateTrap() { - var _this2 = this; - var _this$tailoredFocusTr = this.tailoredFocusTrapOptions, checkCanReturnFocus = _this$tailoredFocusTr.checkCanReturnFocus, _this$tailoredFocusTr2 = _this$tailoredFocusTr.preventScroll, preventScroll = _this$tailoredFocusTr2 === void 0 ? false : _this$tailoredFocusTr2; - if (this.focusTrap) { - this.focusTrap.deactivate({ - returnFocus: false + key: "render", + value: function render() { + var _this3 = this; + var _this$props = this.props, values = _this$props.values, component = _this$props.component, style = _this$props.style, itemClassName = _this$props.itemClassName, className = _this$props.className, itemStyle = _this$props.itemStyle; + return React.createElement("ul", { + className: "rta__list ".concat(className || ""), + style + }, values.map(function(item) { + return React.createElement(Item, { + key: _this3.getId(item), + innerRef: function innerRef(ref) { + _this3.itemsRef[_this3.getId(item)] = ref; + }, + selected: _this3.isSelected(item), + item, + className: itemClassName, + style: itemStyle, + onClickHandler: _this3.onPressEnter, + onSelectHandler: _this3.selectItem, + component }); - } - var finishDeactivation = function finishDeactivation2() { - var returnFocusNode = _this2.getReturnFocusNode(); - var canReturnFocus = (returnFocusNode === null || returnFocusNode === void 0 ? void 0 : returnFocusNode.focus) && _this2.returnFocusOnDeactivate; - if (canReturnFocus) { - returnFocusNode.focus({ - preventScroll - }); - } - if (_this2.onPostDeactivate) { - _this2.onPostDeactivate.call(null); + })); + } + }]); + return List2; +}(React.Component); +function defaultScrollToItem(container, item) { + var itemHeight = parseInt(getComputedStyle(item).getPropertyValue("height"), 10); + var containerHight = parseInt(getComputedStyle(container).getPropertyValue("height"), 10) - itemHeight; + var itemOffsetTop = item.offsetTop; + var actualScrollTop = container.scrollTop; + if (itemOffsetTop < actualScrollTop + containerHight && actualScrollTop < itemOffsetTop) { + return; + } + container.scrollTop = itemOffsetTop; +} +var DEFAULT_CARET_POSITION = "next"; +var POSITION_CONFIGURATION = { + X: { + LEFT: "rta__autocomplete--left", + RIGHT: "rta__autocomplete--right" + }, + Y: { + TOP: "rta__autocomplete--top", + BOTTOM: "rta__autocomplete--bottom" + } +}; +var errorMessage = function errorMessage2(message) { + return console.error("RTA: dataProvider fails: ".concat(message, "\n \nCheck the documentation or create issue if you think it's bug. https://github.com/webscopeio/react-textarea-autocomplete/issues")); +}; +var reservedRegexChars = [".", "^", "$", "*", "+", "-", "?", "(", ")", "[", "]", "{", "}", "\\", "|"]; +var escapeRegex = function escapeRegex2(text) { + return _toConsumableArray(text).map(function(character) { + return reservedRegexChars.includes(character) ? "\\".concat(character) : character; + }).join(""); +}; +var Autocomplete = /* @__PURE__ */ function(_React$Component) { + _inherits(Autocomplete2, _React$Component); + function Autocomplete2() { + _classCallCheck(this, Autocomplete2); + return _possibleConstructorReturn(this, _getPrototypeOf(Autocomplete2).apply(this, arguments)); + } + _createClass(Autocomplete2, [{ + key: "componentDidMount", + value: function componentDidMount() { + var boundariesElement = this.props.boundariesElement; + if (typeof boundariesElement === "string") { + var elem = document.querySelector(boundariesElement); + if (!elem) { + throw new Error("RTA: Invalid prop boundariesElement: it has to be string or HTMLElement."); } - }; - if (checkCanReturnFocus) { - checkCanReturnFocus(this.getReturnFocusNode()).then(finishDeactivation, finishDeactivation); + this.containerElem = elem; + } else if (boundariesElement instanceof HTMLElement) { + this.containerElem = boundariesElement; } else { - finishDeactivation(); + throw new Error("RTA: Invalid prop boundariesElement: it has to be string or HTMLElement."); } - } - }, { - key: "setupFocusTrap", - value: function setupFocusTrap() { - if (!this.focusTrap) { - var focusTrapElementDOMNodes = this.focusTrapElements.map(ReactDOM.findDOMNode); - var nodesExist = focusTrapElementDOMNodes.some(Boolean); - if (nodesExist) { - this.focusTrap = this.props._createFocusTrap(focusTrapElementDOMNodes, this.tailoredFocusTrapOptions); - if (this.props.active) { - this.focusTrap.activate(); - } - if (this.props.paused) { - this.focusTrap.pause(); - } + if (!this.containerElem || !this.containerElem.contains(this.ref)) { + { + throw new Error("RTA: Invalid prop boundariesElement: it has to be one of the parents of the RTA."); } } } - }, { - key: "componentDidMount", - value: function componentDidMount() { - if (this.props.active) { - this.setupFocusTrap(); - } - } }, { key: "componentDidUpdate", - value: function componentDidUpdate(prevProps) { - if (this.focusTrap) { - if (prevProps.containerElements !== this.props.containerElements) { - this.focusTrap.updateContainerElements(this.props.containerElements); - } - var hasActivated = !prevProps.active && this.props.active; - var hasDeactivated = prevProps.active && !this.props.active; - var hasPaused = !prevProps.paused && this.props.paused; - var hasUnpaused = prevProps.paused && !this.props.paused; - if (hasActivated) { - this.updatePreviousElement(); - this.focusTrap.activate(); - } - if (hasDeactivated) { - this.deactivateTrap(); - return; - } - if (hasPaused) { - this.focusTrap.pause(); - } - if (hasUnpaused) { - this.focusTrap.unpause(); - } + value: function componentDidUpdate() { + var _this$ref$classList, _this$ref$classList2; + var top2 = this.props.top || 0; + var left2 = this.props.left || 0; + var usedClasses = []; + var unusedClasses = []; + var topPosition = 0; + var leftPosition = 0; + var containerBounds = this.containerElem.getBoundingClientRect(); + var dropdownBounds = this.ref.getBoundingClientRect(); + var textareaBounds = this.props.textareaRef.getBoundingClientRect(); + var computedStyle = window.getComputedStyle(this.ref); + var marginTop = parseInt(computedStyle.getPropertyValue("margin-top"), 10); + var marginBottom = parseInt(computedStyle.getPropertyValue("margin-bottom"), 10); + var marginLeft = parseInt(computedStyle.getPropertyValue("margin-left"), 10); + var marginRight = parseInt(computedStyle.getPropertyValue("margin-right"), 10); + var dropdownBottom = marginTop + marginBottom + textareaBounds.top + top2 + dropdownBounds.height; + var dropdownRight = marginLeft + marginRight + textareaBounds.left + left2 + dropdownBounds.width; + if (dropdownRight > containerBounds.right && textareaBounds.left + left2 > dropdownBounds.width) { + leftPosition = left2 - dropdownBounds.width; + usedClasses.push(POSITION_CONFIGURATION.X.LEFT); + unusedClasses.push(POSITION_CONFIGURATION.X.RIGHT); } else { - if (prevProps.containerElements !== this.props.containerElements) { - this.focusTrapElements = this.props.containerElements; - } - if (this.props.active) { - this.updatePreviousElement(); - this.setupFocusTrap(); - } + leftPosition = left2; + usedClasses.push(POSITION_CONFIGURATION.X.RIGHT); + unusedClasses.push(POSITION_CONFIGURATION.X.LEFT); } - } - }, { - key: "componentWillUnmount", - value: function componentWillUnmount() { - this.deactivateTrap(); + if (dropdownBottom > containerBounds.bottom && textareaBounds.top + top2 > dropdownBounds.height) { + topPosition = top2 - dropdownBounds.height; + usedClasses.push(POSITION_CONFIGURATION.Y.TOP); + unusedClasses.push(POSITION_CONFIGURATION.Y.BOTTOM); + } else { + topPosition = top2; + usedClasses.push(POSITION_CONFIGURATION.Y.BOTTOM); + unusedClasses.push(POSITION_CONFIGURATION.Y.TOP); + } + if (this.props.renderToBody) { + topPosition += textareaBounds.top; + leftPosition += textareaBounds.left; + } + this.ref.style.top = "".concat(topPosition, "px"); + this.ref.style.left = "".concat(leftPosition, "px"); + (_this$ref$classList = this.ref.classList).remove.apply(_this$ref$classList, unusedClasses); + (_this$ref$classList2 = this.ref.classList).add.apply(_this$ref$classList2, usedClasses); } }, { key: "render", value: function render() { - var _this3 = this; - var child = this.props.children ? React.Children.only(this.props.children) : void 0; - if (child) { - if (child.type && child.type === React.Fragment) { - throw new Error("A focus-trap cannot use a Fragment as its child container. Try replacing it with a

element."); - } - var composedRefCallback = function composedRefCallback2(element) { - var containerElements = _this3.props.containerElements; - if (child) { - if (typeof child.ref === "function") { - child.ref(element); - } else if (child.ref) { - child.ref.current = element; - } - } - _this3.focusTrapElements = containerElements ? containerElements : [element]; - }; - var childWithRef = React.cloneElement(child, { - ref: composedRefCallback - }); - return childWithRef; - } - return null; + var _this = this; + var _this$props = this.props, style = _this$props.style, className = _this$props.className, innerRef = _this$props.innerRef, children = _this$props.children, renderToBody = _this$props.renderToBody; + var body = document.body; + var autocompleteContainer = React.createElement("div", { + ref: function ref(_ref) { + _this.ref = _ref; + innerRef(_ref); + }, + className: "rta__autocomplete ".concat(className || ""), + style + }, children); + return renderToBody && body !== null ? ReactDOM.createPortal(autocompleteContainer, body) : autocompleteContainer; } }]); - return FocusTrap2; + return Autocomplete2; }(React.Component); -var ElementType = typeof Element === "undefined" ? Function : Element; -FocusTrap.propTypes = { - active: PropTypes.bool, - paused: PropTypes.bool, - focusTrapOptions: PropTypes.shape({ - document: PropTypes.object, - onActivate: PropTypes.func, - onPostActivate: PropTypes.func, - checkCanFocusTrap: PropTypes.func, - onDeactivate: PropTypes.func, - onPostDeactivate: PropTypes.func, - checkCanReturnFocus: PropTypes.func, - initialFocus: PropTypes.oneOfType([PropTypes.instanceOf(ElementType), PropTypes.string, PropTypes.func, PropTypes.bool]), - fallbackFocus: PropTypes.oneOfType([PropTypes.instanceOf(ElementType), PropTypes.string, PropTypes.func]), - escapeDeactivates: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]), - clickOutsideDeactivates: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]), - returnFocusOnDeactivate: PropTypes.bool, - setReturnFocus: PropTypes.oneOfType([PropTypes.instanceOf(ElementType), PropTypes.string, PropTypes.func]), - allowOutsideClick: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]), - preventScroll: PropTypes.bool - }), - containerElements: PropTypes.arrayOf(PropTypes.instanceOf(ElementType)), - children: PropTypes.oneOfType([ - PropTypes.element, - PropTypes.instanceOf(ElementType) - ]) -}; -FocusTrap.defaultProps = { - active: true, - paused: false, - focusTrapOptions: {}, - _createFocusTrap: createFocusTrap -}; -var focusTrapReact = FocusTrap; -function useToggle(initialState = false) { - const [state, setState] = _react_17_0_2_react.exports.useState(initialState); - const toggle = _react_17_0_2_react.exports.useCallback((nextState) => { - if (nextState !== void 0) { - setState(nextState); - } else { - setState((state2) => !state2); - } - }, []); - return [state, toggle]; -} -const getCursorPostion = (input) => { - const { - offsetLeft: inputX, - offsetTop: inputY, - offsetHeight: inputH, - offsetWidth: inputW, - selectionEnd: selectionPoint - } = input; - const div = document.createElement("div"); - const copyStyle = window.getComputedStyle(input); - for (const item of copyStyle) { - div.style.setProperty(item, copyStyle.getPropertyValue(item)); - } - div.style.position = "fixed"; - div.style.visibility = "hidden"; - div.style.whiteSpace = "pre-wrap"; - const swap = "."; - const inputValue = input.tagName === "INPUT" ? input.value.replace(/ /g, swap) : input.value; - const textContent = inputValue.substring(0, selectionPoint || 0); - div.textContent = textContent; - if (input.tagName === "TEXTAREA") { - div.style.height = "auto"; - } - const span = document.createElement("span"); - span.textContent = inputValue.substring(selectionPoint || 0) || "."; - div.appendChild(span); - document.body.appendChild(div); - const { - offsetLeft: spanX, - offsetTop: spanY, - offsetHeight: spanH, - offsetWidth: spanW - } = span; - document.body.removeChild(div); - return { - x: inputX + spanX, - y: inputY + spanY, - h: inputH + spanH, - w: inputW + spanW - }; -}; -let isList; -let isEditor = false; -let isEditorGo = false; -let positionX; -const MemoEditor = () => { - const { - globalState - } = _react_17_0_2_react.exports.useContext(appContext); - const [isListShown, toggleList] = useToggle(false); - const [isEditorShown, toggleEditor] = useToggle(false); - const editorRef = _react_17_0_2_react.exports.useRef(null); - const prevGlobalStateRef = _react_17_0_2_react.exports.useRef(globalState); - const [selected, setSelected] = _react_17_0_2_react.exports.useState(); - const [isPopperOpen, setIsPopperOpen] = _react_17_0_2_react.exports.useState(false); - const { - app: app2 - } = dailyNotesService.getState(); - const popperRef = _react_17_0_2_react.exports.useRef(null); - const [popperElement, setPopperElement] = _react_17_0_2_react.exports.useState(null); - let popper2; - _react_17_0_2_react.exports.useEffect(() => { - if (!editorRef.current) { - return; - } - if (DefaultPrefix === "List") { - isList = false; - toggleList(false); - } else { - isList = true; - toggleList(true); - } - }, []); - _react_17_0_2_react.exports.useEffect(() => { - var _a; - if (!editorRef.current) { - return; - } - if ((require$$0.Platform.isMobile === true || window.innerWidth < 875) && UseButtonToShowEditor) { - toggleEditor(true); - } - if (FocusOnEditor) { - (_a = editorRef.current) == null ? void 0 : _a.focus(); - } - }, []); - _react_17_0_2_react.exports.useEffect(() => { - var _a, _b; - if (!editorRef.current) { - return; - } - if (UseButtonToShowEditor === true && DefaultEditorLocation === "Bottom" && require$$0.Platform.isMobile === true && window.innerWidth < 875) { - const leaves = app2.workspace.getLeavesOfType(MEMOS_VIEW_TYPE); - let memosHeight; - let leafView; - if (leaves.length > 0) { - const leaf = leaves[0]; - leafView = leaf.view.containerEl; - memosHeight = leafView.offsetHeight; - } else { - leafView = document; - memosHeight = window.innerHeight; +var ReactTextareaAutocomplete = /* @__PURE__ */ function(_React$Component2) { + _inherits(ReactTextareaAutocomplete2, _React$Component2); + function ReactTextareaAutocomplete2(_props) { + var _this2; + _classCallCheck(this, ReactTextareaAutocomplete2); + _this2 = _possibleConstructorReturn(this, _getPrototypeOf(ReactTextareaAutocomplete2).call(this, _props)); + _this2.state = { + top: null, + left: null, + currentTrigger: null, + actualToken: "", + data: null, + value: "", + dataLoading: false, + selectionEnd: 0, + component: null, + textToReplace: null + }; + _this2.escListenerInit = function() { + if (!_this2.escListener) { + _this2.escListener = Listeners.add(KEY_CODES.ESC, _this2._closeAutocomplete); } - const divThis = document.createElement("img"); - const memoEditorDiv = leafView.querySelector("div[data-type='memos_view'] .view-content .memo-editor-wrapper"); - divThis.src = `${showEditorSvg}`; - if (isEditorShown) { - divThis.className = "memo-show-editor-button hidden"; - } else { - divThis.className = "memo-show-editor-button"; + }; + _this2.escListenerDestroy = function() { + if (_this2.escListener) { + Listeners.remove(_this2.escListener); + _this2.escListener = null; } - const buttonTop = memosHeight - 200; - const buttonLeft = window.innerWidth / 2 - 25; - divThis.style.top = buttonTop + "px"; - divThis.style.left = buttonLeft + "px"; - divThis.onclick = function() { - let scaleElementAni = divThis.animate([ - { - transform: "rotate(0deg) scale(1)" - }, - { - transform: "rotate(60deg) scale(1.5)" - } - ], { - duration: 300, - iterations: Infinity - }); - setTimeout(() => { - var _a2; - divThis.className = "memo-show-editor-button hidden"; - handleShowEditor(); - (_a2 = editorRef.current) == null ? void 0 : _a2.focus(); - scaleElementAni.reverse(); - }, 300); + }; + _this2.getSelectionPosition = function() { + if (!_this2.textareaRef) + return null; + return { + selectionStart: _this2.textareaRef.selectionStart, + selectionEnd: _this2.textareaRef.selectionEnd }; - leafView.querySelector(".content-wrapper").prepend(divThis); - const memolistScroll = leafView.querySelector(".memolist-wrapper"); - memolistScroll.onscroll = function() { - if (isEditor && !isEditorGo) { - isEditorGo = true; - let scaleEditorElementAni = memoEditorDiv.animate([ - { - transform: "scale(1)", - opacity: 1 - }, - { - transform: "scale(0.4)", - opacity: 0 + }; + _this2.getSelectedText = function() { + if (!_this2.textareaRef) + return null; + var _this2$textareaRef = _this2.textareaRef, selectionStart = _this2$textareaRef.selectionStart, selectionEnd = _this2$textareaRef.selectionEnd; + if (selectionStart === selectionEnd) + return null; + return _this2.state.value.substr(selectionStart, selectionEnd - selectionStart); + }; + _this2.setCaretPosition = function() { + var position = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0; + if (!_this2.textareaRef) + return; + _this2.textareaRef.focus(); + _this2.textareaRef.setSelectionRange(position, position); + }; + _this2.getCaretPosition = function() { + if (!_this2.textareaRef) { + return 0; + } + var position = _this2.textareaRef.selectionEnd; + return position; + }; + _this2._handleCaretChange = function(e) { + var cleanLastTrigger = function cleanLastTrigger2() { + var beforeHandle = _this2.getCaretPosition() - 1; + _this2.lastTrigger = _this2.lastTrigger ? beforeHandle : 0; + }; + if (e.type === "keydown") { + var code = e.keyCode || e.which; + switch (code) { + case KEY_CODES.UP: + case KEY_CODES.DOWN: + if (!_this2._isAutocompleteOpen()) { + cleanLastTrigger(); } - ], { - duration: 300, - iterations: 1 - }); - let scaleOneElementAni; - setTimeout(() => { - scaleOneElementAni = divThis.animate([ - { - transform: "rotate(20deg) scale(1.5)" - }, - { - transform: "rotate(0deg) scale(1)" - } - ], { - duration: 100, - iterations: 1 - }); - }, 300); - setTimeout(() => { - handleShowEditor(true); - divThis.className = "memo-show-editor-button"; - }, 300); - setTimeout(() => { - scaleOneElementAni.cancel(); - scaleEditorElementAni.reverse(); - }, 700); + break; + case KEY_CODES.LEFT: + case KEY_CODES.RIGHT: + cleanLastTrigger(); + break; } - }; - } else if (UseButtonToShowEditor === false && DefaultEditorLocation === "Bottom" && require$$0.Platform.isMobile === true && window.innerWidth < 875) { - handleShowEditor(false); - if (FocusOnEditor) { - (_a = editorRef.current) == null ? void 0 : _a.focus(); + return; } - } else { - if (!isEditor) { - handleShowEditor(false); + cleanLastTrigger(); + }; + _this2._onSelect = function(item) { + var _this2$state = _this2.state, selectionEnd = _this2$state.selectionEnd, currentTrigger = _this2$state.currentTrigger, textareaValue = _this2$state.value; + var onItemSelected = _this2.props.onItemSelected; + if (!currentTrigger) + return; + var getTextToReplaceForCurrentTrigger = _this2._getTextToReplace(currentTrigger); + if (!getTextToReplaceForCurrentTrigger) { + _this2._closeAutocomplete(); + return; } - if (FocusOnEditor) { - (_b = editorRef.current) == null ? void 0 : _b.focus(); + var newToken = getTextToReplaceForCurrentTrigger(item); + if (!newToken) { + _this2._closeAutocomplete(); + return; } - } - }, []); - if (!require$$0.Platform.isMobile) { - popper2 = usePopper(popperRef.current, popperElement, { - placement: "right-end", - modifiers: [{ - name: "flip", - options: { - allowedAutoPlacements: ["bottom"], - rootBoundary: "document" + if (onItemSelected) { + onItemSelected({ + currentTrigger, + item + }); + } + var computeCaretPosition = function computeCaretPosition2(position, token, startToken) { + switch (position) { + case "start": + return startToken; + case "next": + case "end": + return startToken + token.length; + default: + if (!Number.isInteger(position)) { + throw new Error('RTA: caretPosition should be "start", "next", "end" or number.'); + } + return position; + } + }; + var textToModify = textareaValue.slice(0, selectionEnd); + var escapedCurrentTrigger = escapeRegex(currentTrigger); + var triggerOffset = textToModify.length - textToModify.lastIndexOf(currentTrigger); + var startOfTokenPosition = textToModify.search(new RegExp("(?!".concat(escapedCurrentTrigger, ")$"))) - triggerOffset; + var newTokenString = newToken.caretPosition === "next" ? "".concat(newToken.text, " ") : newToken.text; + var newCaretPosition = computeCaretPosition(newToken.caretPosition, newTokenString, startOfTokenPosition); + var modifiedText = textToModify.substring(0, startOfTokenPosition) + newTokenString; + var newValue = textareaValue.replace(textToModify, modifiedText); + _this2.setState({ + value: newValue, + dataLoading: false + }, function() { + var insertedTrigger = _this2.tokenRegExpEnding.exec(newTokenString); + var insertedTriggerModifier = insertedTrigger ? insertedTrigger[0].length : 1; + _this2.lastTrigger = newCaretPosition ? newCaretPosition - insertedTriggerModifier : newCaretPosition; + _this2.textareaRef.value = newValue; + _this2.textareaRef.selectionEnd = newCaretPosition; + _this2._changeHandler(); + var scrollTop = _this2.textareaRef.scrollTop; + _this2.setCaretPosition(newCaretPosition); + if (window.chrome) { + _this2.textareaRef.scrollTop = scrollTop; } - }] - }); - } else if (require$$0.Platform.isMobile && DefaultEditorLocation !== "Bottom") { - const seletorPopupWidth = 280; - if (window.innerWidth - positionX > seletorPopupWidth * 1.2) { - popper2 = usePopper(popperRef.current, popperElement, { - placement: "right-end", - modifiers: [{ - name: "flip", - options: { - allowedAutoPlacements: ["left-end"], - rootBoundary: "document" - } - }, { - name: "preventOverflow", - options: { - rootBoundary: "document" - } - }] }); - } else if (window.innerWidth - positionX < seletorPopupWidth && window.innerWidth > seletorPopupWidth * 1.5) { - popper2 = usePopper(popperRef.current, popperElement, { - placement: "left-end", - modifiers: [{ - name: "flip", - options: { - allowedAutoPlacements: ["right-end"], - rootBoundary: "document" + }; + _this2._getTextToReplace = function(currentTrigger) { + var triggerSettings = _this2.props.trigger[currentTrigger]; + if (!currentTrigger || !triggerSettings) + return null; + var output = triggerSettings.output; + return function(item) { + if (typeof item === "object" && (!output || typeof output !== "function")) { + throw new Error('Output functor is not defined! If you are using items as object you have to define "output" function. https://github.com/webscopeio/react-textarea-autocomplete#trigger-type'); + } + if (output) { + var textToReplace = output(item, currentTrigger); + if (textToReplace === void 0 || typeof textToReplace === "number") { + throw new Error('Output functor should return string or object in shape {text: string, caretPosition: string | number}.\nGot "'.concat(String(textToReplace), '". Check the implementation for trigger "').concat(currentTrigger, '"\n\nSee https://github.com/webscopeio/react-textarea-autocomplete#trigger-type for more information.\n')); } - }, { - name: "preventOverflow", - options: { - rootBoundary: "document" + if (textToReplace === null) + return null; + if (typeof textToReplace === "string") { + return { + text: textToReplace, + caretPosition: DEFAULT_CARET_POSITION + }; } - }] - }); - } else { - popper2 = usePopper(popperRef.current, popperElement, { - placement: "bottom", - modifiers: [{ - name: "flip", - options: { - allowedAutoPlacements: ["bottom"], - rootBoundary: "document" + if (!textToReplace.text && typeof textToReplace.text !== "string") { + throw new Error('Output "text" is not defined! Object should has shape {text: string, caretPosition: string | number}. Check the implementation for trigger "'.concat(currentTrigger, '"\n')); } - }, { - name: "preventOverflow", - options: { - rootBoundary: "document" + if (!textToReplace.caretPosition) { + throw new Error('Output "caretPosition" is not defined! Object should has shape {text: string, caretPosition: string | number}. Check the implementation for trigger "'.concat(currentTrigger, '"\n')); } - }] + return textToReplace; + } + if (typeof item !== "string") { + throw new Error("Output item should be string\n"); + } + return { + text: "".concat(currentTrigger).concat(item).concat(currentTrigger), + caretPosition: DEFAULT_CARET_POSITION + }; + }; + }; + _this2._getCurrentTriggerSettings = function() { + var currentTrigger = _this2.state.currentTrigger; + if (!currentTrigger) + return null; + return _this2.props.trigger[currentTrigger]; + }; + _this2._getValuesFromProvider = function() { + var _this2$state2 = _this2.state, currentTrigger = _this2$state2.currentTrigger, actualToken2 = _this2$state2.actualToken; + var triggerSettings = _this2._getCurrentTriggerSettings(); + if (!currentTrigger || !triggerSettings) { + return; + } + var dataProvider = triggerSettings.dataProvider, component = triggerSettings.component; + if (typeof dataProvider !== "function") { + throw new Error("Trigger provider has to be a function!"); + } + _this2.setState({ + dataLoading: true }); - } - } else if (require$$0.Platform.isMobile && DefaultEditorLocation === "Bottom") { - const seletorPopupWidth = 280; - if (window.innerWidth - positionX > seletorPopupWidth * 1.2) { - popper2 = usePopper(popperRef.current, popperElement, { - placement: "top-end", - modifiers: [{ - name: "flip", - options: { - allowedAutoPlacements: ["top-start"], - rootBoundary: "document" - } - }, { - name: "preventOverflow", - options: { - rootBoundary: "document" - } - }] + var providedData = dataProvider(actualToken2); + if (!(providedData instanceof Promise)) { + providedData = Promise.resolve(providedData); + } + providedData.then(function(data) { + if (!Array.isArray(data)) { + throw new Error("Trigger provider has to provide an array!"); + } + if (typeof component !== "function") { + throw new Error("Component should be defined!"); + } + if (currentTrigger !== _this2.state.currentTrigger) + return; + if (!data.length) { + _this2._closeAutocomplete(); + return; + } + _this2.setState({ + dataLoading: false, + data, + component + }); + }).catch(function(e) { + return errorMessage(e.message); }); - } else if (window.innerWidth - positionX < seletorPopupWidth && positionX > seletorPopupWidth) { - popper2 = usePopper(popperRef.current, popperElement, { - placement: "top-start", - modifiers: [{ - name: "flip", - options: { - allowedAutoPlacements: ["top-end"], - rootBoundary: "document" - } - }, { - name: "preventOverflow", - options: { - rootBoundary: "document" - } - }] + }; + _this2._getSuggestions = function() { + var _this2$state3 = _this2.state, currentTrigger = _this2$state3.currentTrigger, data = _this2$state3.data; + if (!currentTrigger || !data || data && !data.length) + return null; + return data; + }; + _this2._createRegExp = function() { + var trigger = _this2.props.trigger; + _this2.tokenRegExp = new RegExp("(".concat(Object.keys(trigger).sort(function(a, b) { + if (a < b) { + return 1; + } + if (a > b) { + return -1; + } + return 0; + }).map(function(a) { + return escapeRegex(a); + }).join("|"), ")((?:(?!\\1)[^\\s])*$)")); + _this2.tokenRegExpEnding = new RegExp("(".concat(Object.keys(trigger).sort(function(a, b) { + if (a < b) { + return 1; + } + if (a > b) { + return -1; + } + return 0; + }).map(function(a) { + return escapeRegex(a); + }).join("|"), ")$")); + }; + _this2._closeAutocomplete = function() { + var currentTrigger = _this2.state.currentTrigger; + _this2.escListenerDestroy(); + _this2.setState({ + data: null, + dataLoading: false, + currentTrigger: null + }, function() { + if (currentTrigger) + _this2._onItemHighlightedHandler(null); }); - } else { - popper2 = usePopper(popperRef.current, popperElement, { - placement: "top", - modifiers: [{ - name: "flip", - options: { - allowedAutoPlacements: ["top"], - rootBoundary: "document" - } - }, { - name: "preventOverflow", - options: { - rootBoundary: "document" + }; + _this2._cleanUpProps = function() { + var props = _objectSpread({}, _this2.props); + var notSafe = ["loadingComponent", "boundariesElement", "containerStyle", "minChar", "scrollToItem", "ref", "innerRef", "onChange", "onCaretPositionChange", "className", "value", "trigger", "listStyle", "itemStyle", "containerStyle", "loaderStyle", "className", "containerClassName", "listClassName", "itemClassName", "loaderClassName", "dropdownStyle", "dropdownClassName", "movePopupAsYouType", "textAreaComponent", "renderToBody", "onItemSelected", "onItemHighlighted"]; + for (var prop in props) { + if (notSafe.includes(prop)) + delete props[prop]; + } + return props; + }; + _this2._changeHandler = function(e) { + var _this2$props = _this2.props, trigger = _this2$props.trigger, onChange = _this2$props.onChange, minChar = _this2$props.minChar, onCaretPositionChange = _this2$props.onCaretPositionChange, movePopupAsYouType = _this2$props.movePopupAsYouType; + var _this2$state4 = _this2.state, top2 = _this2$state4.top, left2 = _this2$state4.left; + var event = e; + if (!event) { + event = new _customEvent_1_0_1_customEvent("change", { + bubbles: true + }); + _this2.textareaRef.dispatchEvent(event); + } + var textarea = event.target || _this2.textareaRef; + var selectionEnd = textarea.selectionEnd; + var value = textarea.value; + _this2.lastValueBubbledEvent = value; + if (onChange && event) { + event.persist && event.persist(); + onChange(new Proxy(event, { + get: function get(original, prop, receiver) { + if (prop === "target") { + return textarea; + } + return Reflect.get(original, prop, receiver); } - }] + })); + } + if (onCaretPositionChange) { + var caretPosition = _this2.getCaretPosition(); + onCaretPositionChange(caretPosition); + } + _this2.setState({ + value }); - } - } - const closePopper = () => { - setIsPopperOpen(false); - }; - _react_17_0_2_react.exports.useEffect(() => { - var _a, _b, _c, _d, _e; - if (globalState.markMemoId) { - const editorCurrentValue = (_a = editorRef.current) == null ? void 0 : _a.getContent(); - const memoLinkText = `${editorCurrentValue ? "\n" : ""}${t("MARK")}: [@MEMO](${globalState.markMemoId})`; - (_b = editorRef.current) == null ? void 0 : _b.insertText(memoLinkText); - globalStateService.setMarkMemoId(""); - } - if (globalState.editMemoId && globalState.editMemoId !== prevGlobalStateRef.current.editMemoId) { - const editMemo = memoService.getMemoById(globalState.editMemoId); - if (editMemo) { - (_d = editorRef.current) == null ? void 0 : _d.setContent((_c = editMemo.content.replace(/\/g, "\n")) != null ? _c : ""); - (_e = editorRef.current) == null ? void 0 : _e.focus(); + var setTopLeft = function setTopLeft2() { + var _getCaretCoordinates = getCaretCoordinates(textarea, selectionEnd), newTop = _getCaretCoordinates.top, newLeft = _getCaretCoordinates.left; + _this2.setState({ + top: newTop - _this2.textareaRef.scrollTop || 0, + left: newLeft + }); + }; + var cleanLastTrigger = function cleanLastTrigger2(triggerLength) { + _this2.lastTrigger = selectionEnd - triggerLength; + _this2._closeAutocomplete(); + setTopLeft(); + }; + if (selectionEnd <= _this2.lastTrigger) { + var _affectedTextareaValue = value.slice(0, selectionEnd); + var _newTrigger = _this2.tokenRegExp.exec(_affectedTextareaValue); + cleanLastTrigger(_newTrigger ? _newTrigger[0].length : 0); } - } - prevGlobalStateRef.current = globalState; - }, [globalState.markMemoId, globalState.editMemoId]); - _react_17_0_2_react.exports.useEffect(() => { - if (!editorRef.current) { - return; - } - const handlePasteEvent = async (event) => { - var _a; - if (event.clipboardData && event.clipboardData.files.length > 0) { - event.preventDefault(); - const file = event.clipboardData.files[0]; - const url = await handleUploadFile(file); - if (url) { - (_a = editorRef.current) == null ? void 0 : _a.insertText(url); - } + var affectedTextareaValue = value.slice(_this2.lastTrigger, selectionEnd); + var tokenMatch = _this2.tokenRegExp.exec(affectedTextareaValue); + var lastToken = tokenMatch && tokenMatch[0]; + var currentTrigger = tokenMatch && tokenMatch[1] || null; + var currentTriggerLength = currentTrigger ? currentTrigger.length - 1 : 0; + var newTrigger = _this2.tokenRegExpEnding.exec(affectedTextareaValue); + if (newTrigger) { + cleanLastTrigger(newTrigger[0].length); + } else if (!_this2._isAutocompleteOpen()) { + _this2._closeAutocomplete(); } - }; - const handleDropEvent = async (event) => { - var _a; - if (event.dataTransfer && event.dataTransfer.files.length > 0) { - event.preventDefault(); - const file = event.dataTransfer.files[0]; - const url = await handleUploadFile(file); - if (url) { - (_a = editorRef.current) == null ? void 0 : _a.insertText(url); + if ((!lastToken || lastToken.length <= minChar + currentTriggerLength) && (_this2.state.currentTrigger && !trigger[_this2.state.currentTrigger].allowWhitespace || !_this2.state.currentTrigger)) { + _this2._closeAutocomplete(); + return; + } + if (currentTrigger && trigger[currentTrigger].afterWhitespace && !/\s/.test(value[selectionEnd - lastToken.length - 1]) && value[selectionEnd - lastToken.length - 1] !== void 0) { + _this2._closeAutocomplete(); + return; + } + if (_this2.state.currentTrigger && trigger[_this2.state.currentTrigger].allowWhitespace) { + tokenMatch = new RegExp("".concat(escapeRegex(_this2.state.currentTrigger), ".*$")).exec(value.slice(0, selectionEnd)); + lastToken = tokenMatch && tokenMatch[0]; + if (!lastToken) { + _this2._closeAutocomplete(); + return; } + currentTrigger = Object.keys(trigger).find(function(a) { + return a.slice(0, currentTriggerLength + 1) === lastToken.slice(0, currentTriggerLength + 1); + }) || null; } - }; - const handleClickEvent = () => { - var _a, _b; - handleContentChange((_b = (_a = editorRef.current) == null ? void 0 : _a.element.value) != null ? _b : ""); - }; - const handleKeyDownEvent = () => { - setTimeout(() => { - var _a, _b; - handleContentChange((_b = (_a = editorRef.current) == null ? void 0 : _a.element.value) != null ? _b : ""); + var actualToken2 = lastToken.slice(1); + if (!currentTrigger) { + return; + } + if (movePopupAsYouType || top2 === null && left2 === null || _this2.state.currentTrigger !== currentTrigger) { + setTopLeft(); + } + _this2.escListenerInit(); + var textToReplace = _this2._getTextToReplace(currentTrigger); + _this2.setState({ + selectionEnd, + currentTrigger, + textToReplace, + actualToken: actualToken2 + }, function() { + try { + _this2._getValuesFromProvider(); + } catch (err) { + errorMessage(err.message); + } }); }; - editorRef.current.element.addEventListener("paste", handlePasteEvent); - editorRef.current.element.addEventListener("drop", handleDropEvent); - editorRef.current.element.addEventListener("click", handleClickEvent); - editorRef.current.element.addEventListener("keydown", handleKeyDownEvent); - return () => { - var _a, _b; - (_a = editorRef.current) == null ? void 0 : _a.element.removeEventListener("paste", handlePasteEvent); - (_b = editorRef.current) == null ? void 0 : _b.element.removeEventListener("drop", handleDropEvent); + _this2._selectHandler = function(e) { + var _this2$props2 = _this2.props, onCaretPositionChange = _this2$props2.onCaretPositionChange, onSelect = _this2$props2.onSelect; + if (onCaretPositionChange) { + var caretPosition = _this2.getCaretPosition(); + onCaretPositionChange(caretPosition); + } + if (onSelect) { + e.persist(); + onSelect(e); + } }; - }, []); - const handleUploadFile = _react_17_0_2_react.exports.useCallback(async (file) => { - const { - type - } = file; - if (!type.startsWith("image")) { - return; - } - try { - const image2 = await resourceService.upload(file); - const url = `${image2}`; - return url; - } catch (error) { - new require$$0.Notice(error); - } - }, []); - const handleSaveBtnClick = _react_17_0_2_react.exports.useCallback(async (content) => { - if (content === "") { - new require$$0.Notice("\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A\u5440"); - return; - } - const { - editMemoId - } = globalStateService.getState(); - content = content.replaceAll(" ", " "); - setEditorContentCache(""); - try { - if (editMemoId) { - const prevMemo = memoService.getMemoById(editMemoId); - if (prevMemo && prevMemo.content !== content) { - const editedMemo = await memoService.updateMemo(prevMemo.id, prevMemo.content, content, prevMemo.memoType); - editedMemo.updatedAt = utils$1.getDateTimeString(Date.now()); - memoService.editMemo(editedMemo); - } - globalStateService.setEditMemoId(""); - } else { - const newMemo = await memoService.createMemo(content, isList); - memoService.pushMemo(newMemo); - locationService.clearQuery(); + _this2._shouldStayOpen = function(e) { + var el = e.relatedTarget; + if (el === null) { + el = document.activeElement; } - } catch (error) { - new require$$0.Notice(error.message); - } - setEditorContentCache(""); - }, []); - const handleCancelBtnClick = _react_17_0_2_react.exports.useCallback(() => { - var _a; - globalStateService.setEditMemoId(""); - (_a = editorRef.current) == null ? void 0 : _a.setContent(""); - setEditorContentCache(""); - }, []); - const handleContentChange = _react_17_0_2_react.exports.useCallback((content) => { - const tempDiv = document.createElement("div"); - tempDiv.innerHTML = content; - if (tempDiv.innerText.trim() === "") { - content = ""; - } - setEditorContentCache(content); - if (editorRef.current) { - const currentValue = editorRef.current.getContent(); - const selectionStart = editorRef.current.element.selectionStart; - const prevString = currentValue.slice(0, selectionStart); - const nextString = currentValue.slice(selectionStart); - if ((prevString.endsWith("@") || prevString.endsWith("\u{1F4C6}")) && nextString.startsWith(" ")) { - updateDateSelectorPopupPosition(); - setIsPopperOpen(true); - } else if ((prevString.endsWith("@") || prevString.endsWith("\u{1F4C6}")) && nextString === "") { - updateDateSelectorPopupPosition(); - setIsPopperOpen(true); - } else { - setIsPopperOpen(false); + if (_this2.dropdownRef && el instanceof Node && _this2.dropdownRef.contains(el)) { + return true; } - setTimeout(() => { - var _a; - (_a = editorRef.current) == null ? void 0 : _a.focus(); - }); - } - }, []); - const handleDateInsertTrigger = (date) => { - if (!editorRef.current) { - return; - } - if (date) { - closePopper(); - isList = true; - toggleList(true); - } - const currentValue = editorRef.current.getContent(); - const selectionStart = editorRef.current.element.selectionStart; - const prevString = currentValue.slice(0, selectionStart); - const nextString = currentValue.slice(selectionStart); - const todayMoment = require$$0.moment(date); - if (!editorRef.current) { - return; - } - if (prevString.endsWith("@")) { - if (InsertDateFormat === "Dataview") { - editorRef.current.element.value = currentValue.slice(0, editorRef.current.element.selectionStart - 1) + "[due::" + todayMoment.format("YYYY-MM-DD") + "]" + nextString; - editorRef.current.element.setSelectionRange(selectionStart + 17, selectionStart + 17); - editorRef.current.focus(); - handleContentChange(editorRef.current.element.value); - } else if (InsertDateFormat === "Tasks") { - editorRef.current.element.value = currentValue.slice(0, editorRef.current.element.selectionStart - 1) + "\u{1F4C6}" + todayMoment.format("YYYY-MM-DD") + nextString; - editorRef.current.element.setSelectionRange(selectionStart + 11, selectionStart + 11); - editorRef.current.focus(); - handleContentChange(editorRef.current.element.value); + return false; + }; + _this2._onClick = function(e) { + var onClick = _this2.props.onClick; + if (onClick) { + e.persist(); + onClick(e); } - } else { - editorRef.current.element.value = prevString + todayMoment.format("YYYY-MM-DD") + nextString; - editorRef.current.element.setSelectionRange(selectionStart + 10, selectionStart + 10); - editorRef.current.focus(); - handleContentChange(editorRef.current.element.value); - } - }; - const handleChangeStatus = () => { - if (!editorRef.current) { - return; - } - if (isList) { - isList = false; - toggleList(false); - } else { - isList = true; - toggleList(true); - } - }; - const handleShowEditor = (flag) => { - if (!editorRef.current) { - return; - } - if (isEditor || flag === true) { - isEditor = false; - toggleEditor(true); - } else { - isEditor = true; - isEditorGo = false; - toggleEditor(false); - } - }; - const handleTagTextBtnClick = _react_17_0_2_react.exports.useCallback(() => { - if (!editorRef.current) { - return; - } - const currentValue = editorRef.current.getContent(); - const selectionStart = editorRef.current.element.selectionStart; - const prevString = currentValue.slice(0, selectionStart); - const nextString = currentValue.slice(selectionStart); - let nextValue = prevString + "# " + nextString; - let cursorIndex = prevString.length + 1; - if (prevString.endsWith("#") && nextString.startsWith(" ")) { - nextValue = prevString.slice(0, prevString.length - 1) + nextString.slice(1); - cursorIndex = prevString.length - 1; - } - editorRef.current.element.value = nextValue; - editorRef.current.element.setSelectionRange(cursorIndex, cursorIndex); - editorRef.current.focus(); - handleContentChange(editorRef.current.element.value); - }, []); - const updateDateSelectorPopupPosition = _react_17_0_2_react.exports.useCallback(() => { - if (!editorRef.current || !popperRef.current) { - return; - } - const seletorPopupWidth = 280; - const editorWidth = editorRef.current.element.clientWidth; - const { - x: x2, - y: y2 - } = getCursorPostion(editorRef.current.element); - let left2; - let top2; - if (!require$$0.Platform.isMobile) { - left2 = x2 + seletorPopupWidth + 16 > editorWidth ? x2 + 2 : x2 + 2; - top2 = y2 + 20; - } else { - if (window.innerWidth - x2 > seletorPopupWidth) { - left2 = x2 + seletorPopupWidth + 16 > editorWidth ? x2 + 2 : x2 + 2; - } else if (window.innerWidth - x2 < seletorPopupWidth) { - left2 = x2 + seletorPopupWidth + 16 > editorWidth ? x2 + 18 : x2 + 18; - } else { - left2 = editorRef.current.element.clientWidth / 2; + if (_this2._shouldStayOpen(e)) { + return; } - if (DefaultEditorLocation === "Bottom" && window.innerWidth > 875) { - top2 = y2 + 20; - } else if (DefaultEditorLocation === "Bottom" && window.innerWidth <= 875) { - top2 = y2 + 35; - } else if (DefaultEditorLocation === "Top" && window.innerWidth <= 875) { - top2 = y2 + 20; + _this2._closeAutocomplete(); + }; + _this2._onBlur = function(e) { + var onBlur = _this2.props.onBlur; + if (onBlur) { + e.persist(); + onBlur(e); } - } - positionX = x2; - popperRef.current.style.left = `${left2}px`; - popperRef.current.style.top = `${top2}px`; - }, []); - const handleUploadFileBtnClick = _react_17_0_2_react.exports.useCallback(() => { - const inputEl = document.createElement("input"); - document.body.appendChild(inputEl); - inputEl.type = "file"; - inputEl.multiple = false; - inputEl.accept = "image/png, image/gif, image/jpeg"; - inputEl.onchange = async () => { - var _a; - if (!inputEl.files || inputEl.files.length === 0) { + if (_this2._shouldStayOpen(e)) { return; } - const file = inputEl.files[0]; - const url = await handleUploadFile(file); - if (url) { - (_a = editorRef.current) == null ? void 0 : _a.insertText(url); + _this2._closeAutocomplete(); + }; + _this2._onScrollHandler = function() { + _this2._closeAutocomplete(); + }; + _this2._onItemHighlightedHandler = function(item) { + var onItemHighlighted = _this2.props.onItemHighlighted; + var currentTrigger = _this2.state.currentTrigger; + if (onItemHighlighted) { + if (typeof onItemHighlighted === "function") { + onItemHighlighted({ + currentTrigger, + item + }); + } else { + throw new Error("`onItemHighlighted` has to be a function"); + } } - document.body.removeChild(inputEl); }; - inputEl.click(); - }, []); - const showEditStatus = Boolean(globalState.editMemoId); - const editorConfig = _react_17_0_2_react.exports.useMemo(() => ({ - className: "memo-editor", - initialContent: getEditorContentCache(), - placeholder: t("What do you think now..."), - showConfirmBtn: true, - showCancelBtn: showEditStatus, - showTools: true, - onConfirmBtnClick: handleSaveBtnClick, - onCancelBtnClick: handleCancelBtnClick, - onContentChange: handleContentChange - }), [showEditStatus]); - return /* @__PURE__ */ jsxs("div", { - className: `memo-editor-wrapper ${showEditStatus ? "edit-ing" : ""} ${isEditorShown ? "hidden" : ""}`, - children: [/* @__PURE__ */ jsx("p", { - className: `tip-text ${showEditStatus ? "" : "hidden"}`, - children: "Modifying..." - }), /* @__PURE__ */ jsx(Editor, __spreadProps(__spreadValues({ - ref: editorRef - }, editorConfig), { - tools: /* @__PURE__ */ jsxs(Fragment, { - children: [/* @__PURE__ */ jsx("img", { - className: "action-btn add-tag", - src: tag, - onClick: handleTagTextBtnClick - }), /* @__PURE__ */ jsx("img", { - className: "action-btn file-upload", - src: imageSvg, - onClick: handleUploadFileBtnClick - }), /* @__PURE__ */ jsx("img", { - className: "action-btn list-or-task", - src: `${!isListShown ? journalSvg : task}`, - onClick: handleChangeStatus - })] - }) - })), /* @__PURE__ */ jsx("div", { - ref: popperRef, - className: "date-picker", - children: isPopperOpen && /* @__PURE__ */ jsx(focusTrapReact, { - active: true, - focusTrapOptions: { - initialFocus: false, - allowOutsideClick: true, - clickOutsideDeactivates: true, - onDeactivate: closePopper - }, - children: /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({ - tabIndex: -1, - style: popper2.styles.popper - }, popper2.attributes.popper), { - ref: setPopperElement, - role: "dialog", - children: /* @__PURE__ */ jsx(DayPicker, { - initialFocus: isPopperOpen, - mode: "single", - defaultMonth: selected, - selected, - onSelect: handleDateInsertTrigger - }) - })) - }) - })] - }); -}; -function getEditorContentCache() { - var _a; - return (_a = storage.get(["editorContentCache"]).editorContentCache) != null ? _a : ""; -} -function setEditorContentCache(content) { - storage.set({ - editorContentCache: content - }); -} -const relationConsts = [ - { text: "AND", value: "AND" }, - { text: "OR", value: "OR" } -]; -const filterConsts = { - TAG: { - value: "TAG", - text: t("TAG"), - operators: [ - { - text: t("INCLUDE"), - value: "CONTAIN" - }, - { - text: t("EXCLUDE"), - value: "NOT_CONTAIN" + _this2._dropdownScroll = function(item) { + var scrollToItem = _this2.props.scrollToItem; + if (!scrollToItem) + return; + if (scrollToItem === true) { + defaultScrollToItem(_this2.dropdownRef, item); + return; } - ] - }, - TYPE: { - value: "TYPE", - text: t("TYPE"), - operators: [ - { - value: "IS", - text: t("IS") - }, - { - value: "IS_NOT", - text: t("ISNOT") + if (typeof scrollToItem !== "function" || scrollToItem.length !== 2) { + throw new Error("`scrollToItem` has to be boolean (true for default implementation) or function with two parameters: container, item."); } - ], - values: [ - { - value: "CONNECTED", - text: t("LINKED") - }, - { - value: "NOT_TAGGED", - text: t("NO TAGS") - }, - { - value: "LINKED", - text: t("HAS LINKS") - }, - { - value: "IMAGED", - text: t("HAS IMAGES") + scrollToItem(_this2.dropdownRef, item); + }; + _this2._isAutocompleteOpen = function() { + var _this2$state5 = _this2.state, dataLoading = _this2$state5.dataLoading, currentTrigger = _this2$state5.currentTrigger; + var suggestionData = _this2._getSuggestions(); + return !!((dataLoading || suggestionData) && currentTrigger); + }; + _this2._textareaRef = function(ref) { + _this2.props.innerRef && _this2.props.innerRef(ref); + _this2.textareaRef = ref; + }; + _this2.lastTrigger = 0; + _this2.escListener = null; + var _this2$props3 = _this2.props, loadingComponent = _this2$props3.loadingComponent, _trigger = _this2$props3.trigger, _value = _this2$props3.value; + if (_value) + _this2.state.value = _value; + _this2._createRegExp(); + if (!loadingComponent) { + throw new Error("RTA: loadingComponent is not defined"); + } + if (!_trigger) { + throw new Error("RTA: trigger is not defined"); + } + return _this2; + } + _createClass(ReactTextareaAutocomplete2, [{ + key: "componentDidMount", + value: function componentDidMount() { + Listeners.startListen(this.textareaRef); + this.textareaRef && this.textareaRef.addEventListener("focus", this._handleCaretChange); + this.textareaRef && this.textareaRef.addEventListener("click", this._handleCaretChange); + this.textareaRef && this.textareaRef.addEventListener("keydown", this._handleCaretChange); + } + }, { + key: "componentDidUpdate", + value: function componentDidUpdate(_ref2) { + var oldTrigger = _ref2.trigger, oldValue = _ref2.value; + var _this$props2 = this.props, trigger = _this$props2.trigger, value = _this$props2.value; + if (Object.keys(trigger).join("") !== Object.keys(oldTrigger).join("")) { + this._createRegExp(); } - ] - }, - TEXT: { - value: "TEXT", - text: t("TEXT"), - operators: [ - { - value: "CONTAIN", - text: t("INCLUDE") - }, - { - value: "NOT_CONTAIN", - text: t("EXCLUDE") + if (oldValue !== value && this.lastValueBubbledEvent !== value) { + this.lastTrigger = 0; + this._changeHandler(); } - ] - } -}; -const memoSpecialTypes = filterConsts["TYPE"].values; -const getTextWithMemoType = (type) => { - for (const t2 of memoSpecialTypes) { - if (t2.value === type) { - return t2.text; } - } - return ""; + }, { + key: "componentWillUnmount", + value: function componentWillUnmount() { + this.escListenerDestroy(); + Listeners.stopListen(this.textareaRef); + this.textareaRef && this.textareaRef.removeEventListener("focus", this._handleCaretChange); + this.textareaRef && this.textareaRef.removeEventListener("click", this._handleCaretChange); + this.textareaRef && this.textareaRef.removeEventListener("keydown", this._handleCaretChange); + } + }, { + key: "render", + value: function render() { + var _this3 = this; + var _this$props3 = this.props, Loader = _this$props3.loadingComponent, style = _this$props3.style, className = _this$props3.className, listStyle = _this$props3.listStyle, itemStyle = _this$props3.itemStyle, boundariesElement = _this$props3.boundariesElement, movePopupAsYouType = _this$props3.movePopupAsYouType, listClassName = _this$props3.listClassName, itemClassName = _this$props3.itemClassName, dropdownClassName = _this$props3.dropdownClassName, dropdownStyle = _this$props3.dropdownStyle, containerStyle = _this$props3.containerStyle, containerClassName = _this$props3.containerClassName, loaderStyle = _this$props3.loaderStyle, loaderClassName = _this$props3.loaderClassName, textAreaComponent = _this$props3.textAreaComponent, renderToBody = _this$props3.renderToBody; + var _this$state = this.state, left2 = _this$state.left, top2 = _this$state.top, dataLoading = _this$state.dataLoading, component = _this$state.component, value = _this$state.value, textToReplace = _this$state.textToReplace; + var isAutocompleteOpen = this._isAutocompleteOpen(); + var suggestionData = this._getSuggestions(); + var extraAttrs = {}; + var TextAreaComponent; + if (textAreaComponent.component) { + TextAreaComponent = textAreaComponent.component; + extraAttrs[textAreaComponent.ref] = this._textareaRef; + } else { + TextAreaComponent = textAreaComponent; + extraAttrs.ref = this._textareaRef; + } + return React.createElement("div", { + className: "rta ".concat(dataLoading === true ? "rta--loading" : "", " ").concat(containerClassName || ""), + style: containerStyle + }, React.createElement(TextAreaComponent, Object.assign({}, this._cleanUpProps(), { + className: "rta__textarea ".concat(className || ""), + onChange: this._changeHandler, + onSelect: this._selectHandler, + onScroll: this._onScrollHandler, + onClick: this._onClick, + onBlur: this._onBlur, + value, + style + }, extraAttrs)), isAutocompleteOpen && React.createElement(Autocomplete, { + innerRef: function innerRef(ref) { + _this3.dropdownRef = ref; + }, + top: top2, + left: left2, + style: dropdownStyle, + className: dropdownClassName, + movePopupAsYouType, + boundariesElement, + textareaRef: this.textareaRef, + renderToBody + }, suggestionData && component && textToReplace && React.createElement(List, { + values: suggestionData, + component, + style: listStyle, + className: listClassName, + itemClassName, + itemStyle, + getTextToReplace: textToReplace, + onItemHighlighted: this._onItemHighlightedHandler, + onSelect: this._onSelect, + dropdownScroll: this._dropdownScroll + }), dataLoading && React.createElement("div", { + className: "rta__loader ".concat(suggestionData !== null ? "rta__loader--suggestion-data" : "rta__loader--empty-suggestion-data", " ").concat(loaderClassName || ""), + style: loaderStyle + }, React.createElement(Loader, { + data: suggestionData + })))); + } + }], [{ + key: "getDerivedStateFromProps", + value: function getDerivedStateFromProps(_ref3) { + var value = _ref3.value; + if (value === null || value === void 0) + return null; + return { + value + }; + } + }]); + return ReactTextareaAutocomplete2; +}(React.Component); +ReactTextareaAutocomplete.defaultProps = { + movePopupAsYouType: false, + value: null, + minChar: 1, + boundariesElement: "body", + scrollToItem: true, + textAreaComponent: "textarea", + renderToBody: false }; -const getDefaultFilter = () => { - return { - type: "TAG", - value: { - operator: "CONTAIN", - value: "" - }, - relation: "AND" - }; +const etTags = () => { + const { app: app2 } = dailyNotesService.getState(); + const tags = app2.metadataCache.getTags(); + return [...Object.keys(tags)].map((p2) => p2.split("#").pop()); }; -const checkShouldShowMemoWithFilters = (memo2, filters) => { - let shouldShow = true; - for (const f2 of filters) { - const { relation } = f2; - const r2 = checkShouldShowMemo(memo2, f2); - if (relation === "OR") { - shouldShow = shouldShow || r2; - } else { - shouldShow = shouldShow && r2; - } +const usedTags = (seletecText) => { + let allTags; + if (UseVaultTags) { + allTags = etTags(); + } else { + const { tags } = memoService.getState(); + allTags = tags; } - return shouldShow; + const lowerCaseInputStr = seletecText.toLowerCase(); + const usedTags2 = []; + allTags.forEach((tag) => { + if (tag && tag.toLowerCase().contains(lowerCaseInputStr)) { + usedTags2.push({ + name: tag, + char: tag + }); + } + }); + return usedTags2; }; -const checkShouldShowMemo = (memo2, filter) => { - var _a, _b; - const { - type, - value: { operator, value } - } = filter; - if (value === "") { - return true; - } - let shouldShow = true; - if (type === "TAG") { - let contained = true; - const tagsSet = new Set(); - for (const t2 of Array.from((_a = memo2.content.match(TAG_REG)) != null ? _a : [])) { - const tag2 = t2.replace(TAG_REG, "$1").trim(); - const items = tag2.split("/"); - let temp = ""; - for (const i of items) { - temp += i; - tagsSet.add(temp); - temp += "/"; +var suggest = ""; +const getSuggestions = (inputStr) => { + const { app: app2 } = dailyNotesService.getState(); + const abstractFiles = app2.vault.getAllLoadedFiles(); + const files = []; + let actualInput; + abstractFiles.forEach((file) => { + if (inputStr === "[") { + actualInput = ""; + const lowerCaseInputStr = actualInput.toLowerCase(); + if (file instanceof require$$0.TFile && (file.extension === "md" || file.extension === "png" || file.extension === "jpg" || file.extension === "jpeg" || file.extension === "gif") && file.path.toLowerCase().contains(lowerCaseInputStr)) { + files.push({ + name: file.basename, + char: file.name, + file + }); } - } - for (const t2 of Array.from((_b = memo2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) { - const tag2 = t2.replace(NOP_FIRST_TAG_REG, "$1").trim(); - const items = tag2.split("/"); - let temp = ""; - for (const i of items) { - temp += i; - tagsSet.add(temp); - temp += "/"; + } else if (inputStr.contains("[")) { + actualInput = inputStr.slice(1); + const lowerCaseInputStr = actualInput.toLowerCase(); + if (file instanceof require$$0.TFile && (file.extension === "md" || file.extension === "png" || file.extension === "jpg" || file.extension === "jpeg" || file.extension === "gif") && file.path.toLowerCase().contains(lowerCaseInputStr)) { + files.push({ + name: file.basename, + char: file.name, + file + }); } } - if (!tagsSet.has(value)) { - contained = false; + }); + return files; +}; +const TItem = ({ + entity: { + name, + char, + file + } +}) => { + return /* @__PURE__ */ jsx("div", { + children: `${char}` + }); +}; +const Loading = ({ + data +}) => { + return /* @__PURE__ */ jsx("div", { + children: "Loading" + }); +}; +let actualToken; +const Editor = _react_17_0_2_react.exports.forwardRef((props, ref) => { + var _a, _b; + const { + globalState: { + useTinyUndoHistoryCache } - if (operator === "NOT_CONTAIN") { - contained = !contained; + } = _react_17_0_2_react.exports.useContext(appContext); + const { + className, + inputerType, + initialContent, + placeholder, + showConfirmBtn, + showCancelBtn, + onConfirmBtnClick: handleConfirmBtnClickCallback, + onCancelBtnClick: handleCancelBtnClickCallback, + onContentChange: handleContentChangeCallback + } = props; + const editorRef = _react_17_0_2_react.exports.useRef(null); + const tinyUndoRef = _react_17_0_2_react.exports.useRef(null); + const refresh = useRefresh(); + const [, setHeight, currentHeightRef] = dist(0); + _react_17_0_2_react.exports.useEffect(() => { + const leaves = app.workspace.getLeavesOfType(MEMOS_VIEW_TYPE); + let memosHeight; + let leafView; + if (leaves.length > 0) { + const leaf = leaves[0]; + leafView = leaf.view.containerEl; + memosHeight = leafView.offsetHeight; + } else { + leafView = document; + memosHeight = window.outerHeight; } - shouldShow = contained; - } else if (type === "TYPE") { - let matched = false; - if (value === "NOT_TAGGED" && memo2.content.match(TAG_REG) === null) { - matched = true; - } else if (value === "LINKED" && memo2.content.match(LINK_REG) !== null) { - matched = true; - } else if (value === "IMAGED" && memo2.content.match(IMAGE_URL_REG) !== null) { - matched = true; - } else if (value === "CONNECTED" && memo2.content.match(MEMO_LINK_REG) !== null) { - matched = true; + setHeight(memosHeight); + }, []); + _react_17_0_2_react.exports.useEffect(() => { + if (!editorRef.current) { + return; } - if (operator === "IS_NOT") { - matched = !matched; + if (initialContent) { + editorRef.current.value = initialContent; + refresh(); } - shouldShow = matched; - } else if (type === "TEXT") { - let contained = memo2.content.includes(value); - if (operator === "NOT_CONTAIN") { - contained = !contained; + }, []); + _react_17_0_2_react.exports.useEffect(() => { + var _a2; + if (useTinyUndoHistoryCache) { + if (!editorRef.current) { + return; + } + const { + tinyUndoActionsCache, + tinyUndoIndexCache + } = storage.get(["tinyUndoActionsCache", "tinyUndoIndexCache"]); + tinyUndoRef.current = new TinyUndo(editorRef.current, { + interval: 5e3, + initialActions: tinyUndoActionsCache, + initialIndex: tinyUndoIndexCache + }); + tinyUndoRef.current.subscribe((actions, index) => { + storage.set({ + tinyUndoActionsCache: actions, + tinyUndoIndexCache: index + }); + }); + return () => { + var _a3; + (_a3 = tinyUndoRef.current) == null ? void 0 : _a3.destroy(); + }; + } else { + (_a2 = tinyUndoRef.current) == null ? void 0 : _a2.destroy(); + tinyUndoRef.current = null; + storage.remove(["tinyUndoActionsCache", "tinyUndoIndexCache"]); } - shouldShow = contained; - } - return shouldShow; -}; -var searchBar = ""; -var search = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6Ii8+PC9zdmc+"; -const SearchBar = () => { - const { - locationState: { - query: { - type: memoType + }, [useTinyUndoHistoryCache]); + _react_17_0_2_react.exports.useEffect(() => { + var _a2; + if (editorRef.current) { + editorRef.current.style.height = "auto"; + editorRef.current.style.height = ((_a2 = editorRef.current.scrollHeight) != null ? _a2 : 0) + "px"; + } + }, [(_a = editorRef.current) == null ? void 0 : _a.value]); + _react_17_0_2_react.exports.useImperativeHandle(ref, () => ({ + element: editorRef.current, + focus: () => { + var _a2; + if (FocusOnEditor) { + (_a2 = editorRef.current) == null ? void 0 : _a2.focus(); + } + }, + insertText: (rawText) => { + if (!editorRef.current) { + return; + } + const prevValue = editorRef.current.value; + editorRef.current.value = prevValue.slice(0, editorRef.current.selectionStart) + rawText + prevValue.slice(editorRef.current.selectionStart); + handleContentChangeCallback(editorRef.current.value); + refresh(); + }, + setContent: (text) => { + if (editorRef.current) { + editorRef.current.value = text; + handleContentChangeCallback(editorRef.current.value); + refresh(); } + }, + getContent: () => { + var _a2, _b2; + return (_b2 = (_a2 = editorRef.current) == null ? void 0 : _a2.value) != null ? _b2 : ""; + } + }), []); + const handleInsertTrigger = (event) => { + if (!editorRef.current) { + return; } - } = _react_17_0_2_react.exports.useContext(appContext); - const [isSearchBarShow, toggleSearchbar] = useToggle(false); - const handleMemoTypeItemClick = (type) => { const { - type: prevType - } = locationService.getState().query; - if (type === prevType) { - type = ""; + fileManager + } = appStore.getState().dailyNotesState.app; + if (event.currentTrigger === "#") { + const prevValue = editorRef.current.value; + let removeCharNum; + if (actualToken !== null && actualToken !== void 0) { + removeCharNum = actualToken.length; + } else { + removeCharNum = 0; + } + let behindCharNum = editorRef.current.selectionStart; + for (let i = 0; i < prevValue.length; i++) { + if (!/\s/g.test(prevValue[behindCharNum])) { + behindCharNum++; + } + } + editorRef.current.value = prevValue.slice(0, editorRef.current.selectionStart - removeCharNum) + event.item.char + prevValue.slice(behindCharNum); + handleContentChangeCallback(editorRef.current.value); + refresh(); + } else if (event.currentTrigger === "[[") { + const filePath = fileManager.generateMarkdownLink(event.item.file, event.item.file.path, "", ""); + const prevValue = editorRef.current.value; + let removeCharNum; + if (actualToken !== null && actualToken !== void 0) { + if (filePath.contains("[[")) { + removeCharNum = actualToken.length + 1; + } else if (event.item.file.extension !== "md") { + removeCharNum = actualToken.length + 1; + } else { + removeCharNum = actualToken.length + 2; + } + } else { + removeCharNum = 2; + } + let behindCharNum = editorRef.current.selectionStart; + for (let i = 0; i < prevValue.length; i++) { + if (!/\s/g.test(prevValue[behindCharNum])) { + behindCharNum++; + } + } + editorRef.current.value = prevValue.slice(0, editorRef.current.selectionStart - removeCharNum) + filePath + prevValue.slice(behindCharNum); + handleContentChangeCallback(editorRef.current.value); + refresh(); } - locationService.setMemoTypeQuery(type); - }; - const handleTextQueryInput = (event) => { - const text = event.currentTarget.value; - locationService.setTextQuery(text); }; - const mouseIn = () => { - toggleSearchbar(true); + const handleEditorInput = _react_17_0_2_react.exports.useCallback(() => { + var _a2, _b2; + handleContentChangeCallback((_b2 = (_a2 = editorRef.current) == null ? void 0 : _a2.value) != null ? _b2 : ""); + refresh(); + }, []); + const handleEditorKeyDown = _react_17_0_2_react.exports.useCallback((event) => { + event.stopPropagation(); + if (event.code === "Enter") { + if (event.metaKey || event.ctrlKey) { + handleCommonConfirmBtnClick(); + } + } + refresh(); + }, []); + const handleCommonConfirmBtnClick = _react_17_0_2_react.exports.useCallback(() => { + var _a2; + if (!editorRef.current) { + return; + } + if (inputerType === "memo") { + editorRef.current.value = getEditorContentCache2(); + } + handleConfirmBtnClickCallback(editorRef.current.value); + editorRef.current.value = ""; + refresh(); + (_a2 = tinyUndoRef.current) == null ? void 0 : _a2.resetState(); + }, []); + const handleCommonCancelBtnClick = _react_17_0_2_react.exports.useCallback(() => { + handleCancelBtnClickCallback(); + }, []); + const getEditorContentCache2 = () => { + var _a2; + return (_a2 = storage.get(["editorContentCache"]).editorContentCache) != null ? _a2 : ""; }; - const mouseOut = () => { - toggleSearchbar(false); + const getEditorContent = () => { + if (!editorRef.current) { + return; + } + editorRef.current.value = getEditorContentCache2(); + return editorRef.current.value; }; return /* @__PURE__ */ jsxs("div", { - className: "search-bar-container", - children: [/* @__PURE__ */ jsxs("div", { - className: "search-bar-inputer", - children: [/* @__PURE__ */ jsx("img", { - className: "icon-img", - src: search - }), /* @__PURE__ */ jsx("input", { - className: "text-input", - type: "text", - onMouseOver: mouseIn, - onMouseOut: mouseOut, - placeholder: isSearchBarShow ? "Type Here" : "", - onChange: handleTextQueryInput - })] - }), /* @__PURE__ */ jsx("div", { - className: "quickly-action-wrapper", - children: /* @__PURE__ */ jsxs("div", { - className: "quickly-action-container", - children: [/* @__PURE__ */ jsx("p", { - className: "title-text", - children: t("Quick filter") - }), /* @__PURE__ */ jsxs("div", { - className: "section-container types-container", - children: [/* @__PURE__ */ jsxs("span", { - className: "section-text", - children: [t("TYPE"), ":"] - }), /* @__PURE__ */ jsx("div", { - className: "values-container", - children: memoSpecialTypes.map((t2, idx) => { - return /* @__PURE__ */ jsxs("div", { - children: [/* @__PURE__ */ jsx("span", { - className: `type-item ${memoType === t2.value ? "selected" : ""}`, - onClick: () => { - handleMemoTypeItemClick(t2.value); - }, - children: t2.text - }), idx + 1 < memoSpecialTypes.length ? /* @__PURE__ */ jsx("span", { - className: "split-text", - children: "/" - }) : null] - }, t2.value); - }) - })] + className: "common-editor-wrapper " + className, + children: [inputerType === "memo" ? /* @__PURE__ */ jsx(ReactTextareaAutocomplete, { + className: "common-editor-inputer scroll", + loadingComponent: Loading, + placeholder, + movePopupAsYouType: true, + value: getEditorContent(), + innerRef: (textarea) => { + editorRef.current = textarea; + }, + onInput: handleEditorInput, + onKeyDown: handleEditorKeyDown, + style: { + minHeight: 48, + maxHeight: `${currentHeightRef.current > 400 ? currentHeightRef.current - 400 : 100}px` + }, + dropdownStyle: { + minWidth: 180, + maxHeight: 250, + overflowY: "auto" + }, + minChar: 0, + onItemSelected: handleInsertTrigger, + scrollToItem: true, + trigger: { + "#": { + dataProvider: (token) => { + actualToken = token; + return usedTags(token).map(({ + name, + char + }) => ({ + name, + char + })); + }, + component: TItem, + afterWhitespace: true, + output: (item) => item.char + }, + "[[": { + dataProvider: (token) => { + actualToken = token; + return getSuggestions(token).slice(0, 10).map(({ + name, + char, + file + }) => ({ + name, + char, + file + })); + }, + component: TItem, + afterWhitespace: true, + output: (item) => item.char + } + } + }) : /* @__PURE__ */ jsx("textarea", { + style: { + minHeight: 48 + }, + className: "common-editor-inputer scroll", + rows: 1, + placeholder, + ref: editorRef, + onInput: handleEditorInput, + onKeyDown: handleEditorKeyDown + }), /* @__PURE__ */ jsxs("div", { + className: "common-tools-wrapper", + children: [/* @__PURE__ */ jsx("div", { + className: "common-tools-container", + children: /* @__PURE__ */ jsx(Only, { + when: props.tools !== void 0, + children: props.tools + }) + }), /* @__PURE__ */ jsxs("div", { + className: "btns-container", + children: [/* @__PURE__ */ jsx(Only, { + when: showCancelBtn, + children: /* @__PURE__ */ jsx("button", { + className: "action-btn cancel-btn", + onClick: handleCommonCancelBtnClick, + children: t$1("CANCEL EDIT") + }) + }), /* @__PURE__ */ jsx(Only, { + when: showConfirmBtn, + children: /* @__PURE__ */ jsxs("button", { + className: "action-btn confirm-btn", + disabled: !((_b = editorRef.current) == null ? void 0 : _b.value), + onClick: handleCommonConfirmBtnClick, + children: [SaveMemoButtonLabel, /* @__PURE__ */ jsxs("span", { + className: "icon-text", + children: [SaveMemoButtonIcon, "\uFE0F"] + })] + }) })] - }) + })] })] }); -}; -var memosHeader = ""; -var menuSvg = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTMgMThoMTh2LTJIM3Yyem0wLTVoMTh2LTJIM3Yyem0wLTd2MmgxOFY2SDN6Ii8+PC9zdmc+"; -let prevRequestTimestamp = Date.now(); -const MemosHeader = () => { +}); +const Memo = (props) => { + var _a; const { - locationState: { - query: { - filter - } - }, - globalState: { - isMobileView - }, - queryState: { - queries - } + globalState } = _react_17_0_2_react.exports.useContext(appContext); - const [titleText, setTitleText] = _react_17_0_2_react.exports.useState("MEMOS"); + const { + memo: propsMemo + } = props; + const [showConfirmDeleteBtn, toggleConfirmDeleteBtn] = useToggle(false); + const memoCommentRef = _react_17_0_2_react.exports.useRef(null); + const [isCommentShown, toggleComment] = useToggle(false); + const [isCommentListShown, toggleCommentList] = useToggle(ShowCommentOnMemos); + const [commentMemos, setCommentMemos, commentMemosRef] = dist([]); + const [, setAddRandomIDflag, RandomIDRef] = dist(false); _react_17_0_2_react.exports.useEffect(() => { - const query = queryService.getQueryById(filter); - if (query) { - setTitleText(query.title); - } else { - setTitleText("MEMOS"); + if (!memoCommentRef.current) { + return; } - }, [filter, queries]); - const handleMemoTextClick = _react_17_0_2_react.exports.useCallback(() => { - const now = Date.now(); - if (now - prevRequestTimestamp > 10 * 1e3) { - prevRequestTimestamp = now; - memoService.fetchAllMemos().catch(() => { - }); + if (!CommentOnMemos) { + return; + } + const fetchCommentMemos = async () => { + const allCommentMemos = memoService.getState().commentMemos.filter((m2) => m2.linkId === propsMemo.hasId).sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)); + setCommentMemos(allCommentMemos); + }; + fetchCommentMemos(); + }, [propsMemo.content, propsMemo.id]); + _react_17_0_2_react.exports.useEffect(() => { + if (!memoCommentRef.current) { + return; } + const handlePasteEvent = async (event) => { + var _a2; + if (event.clipboardData && event.clipboardData.files.length > 0) { + event.preventDefault(); + const file = event.clipboardData.files[0]; + const url = await handleUploadFile(file); + if (url) { + (_a2 = memoCommentRef.current) == null ? void 0 : _a2.insertText(url); + } + } + }; + const handleDropEvent = async (event) => { + var _a2; + if (event.dataTransfer && event.dataTransfer.files.length > 0) { + event.preventDefault(); + const file = event.dataTransfer.files[0]; + const url = await handleUploadFile(file); + if (url) { + (_a2 = memoCommentRef.current) == null ? void 0 : _a2.insertText(url); + } + } + }; + const handleClickEvent = () => { + var _a2, _b; + handleContentChange((_b = (_a2 = memoCommentRef.current) == null ? void 0 : _a2.element.value) != null ? _b : ""); + }; + const handleKeyDownEvent = () => { + setTimeout(() => { + var _a2, _b; + handleContentChange((_b = (_a2 = memoCommentRef.current) == null ? void 0 : _a2.element.value) != null ? _b : ""); + }); + }; + memoCommentRef.current.element.addEventListener("paste", handlePasteEvent); + memoCommentRef.current.element.addEventListener("drop", handleDropEvent); + memoCommentRef.current.element.addEventListener("click", handleClickEvent); + memoCommentRef.current.element.addEventListener("keydown", handleKeyDownEvent); + return () => { + var _a2, _b; + (_a2 = memoCommentRef.current) == null ? void 0 : _a2.element.removeEventListener("paste", handlePasteEvent); + (_b = memoCommentRef.current) == null ? void 0 : _b.element.removeEventListener("drop", handleDropEvent); + }; }, []); - const handleShowSidebarBtnClick = _react_17_0_2_react.exports.useCallback(() => { - globalStateService.setShowSiderbarInMobileView(true); + const handleCancelBtnClick = _react_17_0_2_react.exports.useCallback(() => { + var _a2; + globalStateService.setCommentMemoId(""); + (_a2 = memoCommentRef.current) == null ? void 0 : _a2.setContent(""); + toggleComment(false); }, []); - return /* @__PURE__ */ jsxs("div", { - className: "section-header-container memos-header-container", - children: [/* @__PURE__ */ jsxs("div", { - className: "title-text", - onClick: handleMemoTextClick, - children: [/* @__PURE__ */ jsx(Only, { - when: isMobileView, - children: /* @__PURE__ */ jsx("button", { - className: "action-btn", - onClick: handleShowSidebarBtnClick, - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: menuSvg, - alt: "menu" - }) - }) - }), /* @__PURE__ */ jsx("span", { - className: "normal-text", - children: titleText - })] - }), /* @__PURE__ */ jsx(SearchBar, {})] - }); -}; -var memoFilter = ""; -var copy = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xMyAxMi40MzE2VjcuODEyNUMxMyA2LjI1OTIgMTQuMjU5MiA1IDE1LjgxMjUgNUg0MC4xODc1QzQxLjc0MDggNSA0MyA2LjI1OTIgNDMgNy44MTI1VjMyLjE4NzVDNDMgMzMuNzQwOCA0MS43NDA4IDM1IDQwLjE4NzUgMzVIMzUuNTE2MyIgc3Ryb2tlPSIjMzMzIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjxwYXRoIGQ9Ik0zMi4xODc1IDEzSDcuODEyNUM2LjI1OTIgMTMgNSAxNC4yNTkyIDUgMTUuODEyNVY0MC4xODc1QzUgNDEuNzQwOCA2LjI1OTIgNDMgNy44MTI1IDQzSDMyLjE4NzVDMzMuNzQwOCA0MyAzNSA0MS43NDA4IDM1IDQwLjE4NzVWMTUuODEyNUMzNSAxNC4yNTkyIDMzLjc0MDggMTMgMzIuMTg3NSAxM1oiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzMzMyIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+"; -const CODE_BLOCK_REG = /```([\s\S]*?)```/g; -const BOLD_TEXT_REG = /\*\*(.+?)\*\*/g; -const EM_TEXT_REG = /\*(.+?)\*/g; -const TODO_BLOCK_REG = /\[ \] /g; -const DONE_BLOCK_REG = /\[x\] /g; -const DOT_LI_REG = /[*] /g; -const NUM_LI_REG = /(\d+)\. /g; -const INTERNAL_MD_REG = /\[\[([^\]]+)\]\]/g; -const EXRERNAL_MD_REG = /\[([^\]]+)\]\((([^\]]+).md)\)/g; -const parseMarkedToHtml = (markedStr, memoid) => { - const htmlText = markedStr.replace(CODE_BLOCK_REG, "
$1
").replace(DOT_LI_REG, "\u2022").replace(NUM_LI_REG, "$1.").replace(TODO_BLOCK_REG, "\u2B1C").replace(DONE_BLOCK_REG, "\u2705").replace(BOLD_TEXT_REG, "$1").replace(EM_TEXT_REG, "$1").replace(/<br>/g, "

").replace(/&/g, "&"); - let newHtmlText = htmlText; - if (memoid) { - if (INTERNAL_MD_REG.test(htmlText)) { - const internalMD = htmlText.match(INTERNAL_MD_REG); - for (let i = 0; i < internalMD.length; i++) { - if (!/(jpeg|jpg|gif|png|svg|bmp|wepg)/g.test(internalMD[i])) { - const internalContent = getContentFromInternalLink(internalMD[i]); - if (/\|/g.test(internalContent)) { - const [link, label] = internalContent.split("|"); - const replaceMent = replaceMd(link, label); - newHtmlText = htmlText.replace(internalMD[i], replaceMent); + const handleContentChange = _react_17_0_2_react.exports.useCallback((content) => { + const tempDiv = document.createElement("div"); + tempDiv.innerHTML = content; + if (tempDiv.innerText.trim() === "") { + content = ""; + } + setTimeout(() => { + var _a2; + (_a2 = memoCommentRef.current) == null ? void 0 : _a2.focus(); + }); + }, []); + const handleSaveBtnClick = _react_17_0_2_react.exports.useCallback(async (content) => { + var _a2, _b; + if (content === "") { + new require$$0.Notice(t$1("Content cannot be empty")); + return; + } + const { + commentMemoId + } = globalStateService.getState(); + content = content.replaceAll(" ", " "); + globalStateService.setChangedByMemos(true); + try { + if (commentMemoId) { + (_a2 = memoCommentRef.current) == null ? void 0 : _a2.setContent(""); + let prevMemo; + if (CommentOnMemos && CommentsInOriginalNotes) { + prevMemo = memoService.getCommentMemoById(commentMemoId); + content = require$$0.moment().format("YYYYMMDDHHmmss") + " " + content; + } else { + prevMemo = memoService.getMemoById(commentMemoId); + content = prevMemo.content.replace(/^(.*) comment:/g, content + " comment:"); + } + if (prevMemo && prevMemo.content !== content) { + let editedMemo; + if (CommentOnMemos && CommentsInOriginalNotes) { + editedMemo = await memoService.updateMemo(prevMemo.id, prevMemo.content, content, prevMemo.memoType, prevMemo.path); } else { - const link = internalContent; - const label = ""; - const replaceMent = replaceMd(link, label); - newHtmlText = newHtmlText.replace(internalMD[i], replaceMent); + editedMemo = await memoService.updateMemo(prevMemo.id, prevMemo.content, content, prevMemo.memoType); + } + if (CommentOnMemos && CommentsInOriginalNotes) { + memoService.editCommentMemo(editedMemo); + } else { + editedMemo.updatedAt = utils$1.getDateTimeString(Date.now()); + memoService.editMemo(editedMemo); } + setCommentMemos(commentMemosRef.current.map((m2) => { + if (m2.id.slice(14) === commentMemoId.slice(14) && m2.path === prevMemo.path) { + return editedMemo; + } + return m2; + })); + } + globalStateService.setCommentMemoId(""); + toggleComment(false); + } else { + const dailyFormat = getDailyNoteFormat(); + let randomId; + if (propsMemo.hasId.length > 0) { + randomId = propsMemo.hasId; + } else if (!CommentsInOriginalNotes) { + randomId = Math.random().toString(36).slice(-6); + setAddRandomIDflag(true); + } + if (!CommentsInOriginalNotes) { + content = content + " comment: [[" + require$$0.moment(propsMemo.id.slice(0, 8)).format(dailyFormat) + "#^" + randomId + "]]"; } + (_b = memoCommentRef.current) == null ? void 0 : _b.setContent(""); + let newMemo; + if (CommentsInOriginalNotes) { + newMemo = await memoService.createCommentMemo(content, true, propsMemo.path, propsMemo.id, randomId); + memoService.pushCommentMemo(newMemo); + } else { + newMemo = await memoService.createMemo(content, true); + memoService.pushMemo(newMemo); + } + setCommentMemos([...commentMemosRef.current, newMemo].sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt))); + if (RandomIDRef.current) { + const editedMemo = await memoService.updateMemo(propsMemo.id, propsMemo.content, propsMemo.content + " ^" + randomId, propsMemo.memoType); + editedMemo.updatedAt = utils$1.getDateTimeString(Date.now()); + memoService.editMemo(editedMemo); + setAddRandomIDflag(false); + } + } + } catch (error) { + new require$$0.Notice(error.message); + } + }, []); + const handleUploadFile = _react_17_0_2_react.exports.useCallback(async (file) => { + const { + type + } = file; + if (!type.startsWith("image")) { + return; + } + try { + const image2 = await resourceService.upload(file); + const url = `${image2}`; + return url; + } catch (error) { + new require$$0.Notice(error); + } + }, []); + const handleShowMemoStoryDialog = () => { + showMemoCardDialog(propsMemo); + }; + const handleMarkMemoClick = () => { + if (UseButtonToShowEditor && DefaultEditorLocation === "Bottom") { + const elem = document.querySelector("div[data-type='memos_view'] .view-content .memo-show-editor-button"); + if (typeof (elem == null ? void 0 : elem.onclick) == "function") { + elem.onclick.apply(elem); + } + } + globalStateService.setMarkMemoId(propsMemo.id); + }; + const handleEditMemoClick = () => { + if (UseButtonToShowEditor && DefaultEditorLocation === "Bottom" && require$$0.Platform.isMobile) { + const elem = document.querySelector("div[data-type='memos_view'] .view-content .memo-show-editor-button"); + if (typeof elem.onclick == "function") { + elem.onclick.apply(elem); + } + } + globalStateService.setEditMemoId(propsMemo.id); + }; + const handleSourceMemoClick = (m2) => { + showMemoInDailyNotes(m2.id, m2.path); + }; + const handleDeleteMemoClick = async () => { + if (showConfirmDeleteBtn) { + try { + await memoService.hideMemoById(propsMemo.id); + } catch (error) { + new require$$0.Notice(error.message); } + if (globalStateService.getState().editMemoId === propsMemo.id) { + globalStateService.setEditMemoId(""); + } + } else { + toggleConfirmDeleteBtn(); + } + }; + const handleMouseLeaveMemoWrapper = () => { + if (showConfirmDeleteBtn) { + toggleConfirmDeleteBtn(false); + } + }; + const handleGenMemoImageBtnClick = () => { + showShareMemoImageDialog(propsMemo); + }; + const handleMemoTypeShow = () => { + if (!ShowTaskLabel) { + return; } - if (EXRERNAL_MD_REG.test(htmlText)) { - const externalMD = htmlText.match(EXRERNAL_MD_REG); - for (let i = 0; i < externalMD.length; i++) { - if (!/(jpeg|jpg|gif|png|svg|bmp|wepg)/g.test(externalMD[i])) { - const link = getContentFromExternalLink(externalMD[i]); - const label = getLabelFromExternalLink(externalMD[i]); - const replaceMent = replaceMd(link, label); - newHtmlText = htmlText.replace(externalMD[i], replaceMent); - } - } + if (propsMemo.memoType === "TASK-TODO") { + return /* @__PURE__ */ jsx(SvgTaskBlank, {}); + } else if (propsMemo.memoType === "TASK-DONE") { + return /* @__PURE__ */ jsx(SvgTask, {}); } - } - return newHtmlText; -}; -const replaceMd = (internalLink, label) => { - const { metadataCache } = appStore.getState().dailyNotesState.app; - const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalLink), ""); - if (file instanceof require$$0.TFile) { - if (label) { - return `${label}`; - } else { - return `${internalLink}`; + }; + const handleMemoDoubleClick = _react_17_0_2_react.exports.useCallback((event) => { + if (event) { + handleEditMemoClick(); } - } else if (label) { - return `${label}`; - } else { - return `${internalLink}`; - } -}; -const getContentFromInternalLink = (line) => { - var _a; - return (_a = /\[\[([^\]]+)\]\]/g.exec(line)) == null ? void 0 : _a[1]; -}; -const getLabelFromExternalLink = (line) => { - var _a; - return (_a = EXRERNAL_MD_REG.exec(line)) == null ? void 0 : _a[1]; -}; -const getContentFromExternalLink = (line) => { - var _a; - return (_a = /\[([^\]]+)\]\((([^\]]+).md)\)/g.exec(line)) == null ? void 0 : _a[3]; -}; -const parseHtmlToRawText = (htmlStr) => { - const tempEl = document.createElement("div"); - tempEl.className = "memo-content-text"; - tempEl.innerHTML = htmlStr; - const text = tempEl.innerText; - return text; -}; -const parseRawTextToHtml = (rawTextStr) => { - const htmlText = rawTextStr.replace(/\n/g, "
"); - return htmlText; -}; -const encodeHtml = (htmlStr) => { - const t2 = document.createElement("div"); - t2.textContent = htmlStr; - return t2.innerHTML; -}; -const Provider = (props) => { - const { - children, - store, - context: Context - } = props; - const [appState, setAppState] = _react_17_0_2_react.exports.useState(store.getState()); - _react_17_0_2_react.exports.useEffect(() => { - const unsubscribe = store.subscribe((ns) => { - setAppState(ns); - }); - return () => { - unsubscribe(); - }; }, []); - return /* @__PURE__ */ jsx(Context.Provider, { - value: appState, - children - }); -}; -var dialog = ""; -const BaseDialog = (props) => { - const { - children, - className, - clickSpaceDestroy, - destroy - } = props; - const handleSpaceClicked = () => { - if (clickSpaceDestroy) { - destroy(); + const handleMemoContentClick = async (e, m2) => { + var _a2; + const targetEl = e.target; + if (e.ctrlKey || e.metaKey) { + handleSourceMemoClick(m2); } + if (targetEl.className === "memo-link-text") { + const memoId = (_a2 = targetEl.dataset) == null ? void 0 : _a2.value; + const memoTemp = memoService.getMemoById(memoId != null ? memoId : ""); + if (memoTemp) { + showMemoCardDialog(memoTemp); + } else { + new require$$0.Notice("MEMO Not Found"); + targetEl.classList.remove("memo-link-text"); + } + } else if (targetEl.className === "todo-block") + ; }; - const handleEscClicked = (e) => { - const { - key - } = e; - if (key === "Escape") { - destroy(); + const handleCommentBlock = () => { + if (!isCommentShown) { + toggleComment(true); + } else { + toggleComment(false); + } + if (!isCommentListShown) { + toggleCommentList(true); + } else if (!ShowCommentOnMemos && isCommentListShown) { + toggleCommentList(false); } }; - return /* @__PURE__ */ jsx("div", { - className: `dialog-wrapper ${className}`, - onClick: handleSpaceClicked, - onKeyPress: handleEscClicked, - children: /* @__PURE__ */ jsx("div", { - className: "dialog-container", - onClick: (e) => e.stopPropagation(), - children - }) - }); -}; -function showDialog(config, DialogComponent, props) { - const tempDiv = document.createElement("div"); - document.body.append(tempDiv); - setTimeout(() => { - var _a; - (_a = tempDiv.firstElementChild) == null ? void 0 : _a.classList.add("showup"); - }, 0); - const cbs = { - destroy: () => { - var _a, _b; - (_a = tempDiv.firstElementChild) == null ? void 0 : _a.classList.remove("showup"); - (_b = tempDiv.firstElementChild) == null ? void 0 : _b.classList.add("showoff"); - setTimeout(() => { - tempDiv.remove(); - ReactDOM$1.unmountComponentAtNode(tempDiv); - }, ANIMATION_DURATION); + const handleEditCommentClick = _react_17_0_2_react.exports.useCallback((memo2) => { + var _a2, _b; + if (!CommentOnMemos) { + return; } + globalStateService.setCommentMemoId(memo2.id); + if (!isCommentShown) { + toggleComment(true); + } + (_a2 = memoCommentRef.current) == null ? void 0 : _a2.focus(); + (_b = memoCommentRef.current) == null ? void 0 : _b.setContent(memo2.content.replace(/ comment: (.*)$/g, "").replace(/^\d{14} /g, "")); + }, []); + const showEditStatus = Boolean(globalState.commentMemoId); + const editorConfig = _react_17_0_2_react.exports.useMemo(() => ({ + className: "memo-editor", + inputerType: "commentMemo", + initialContent: "", + placeholder: t$1("Comment it..."), + showConfirmBtn: true, + showCancelBtn: showEditStatus, + showTools: true, + onConfirmBtnClick: handleSaveBtnClick, + onCancelBtnClick: handleCancelBtnClick, + onContentChange: handleContentChange + }), [globalState.commentMemoId]); + const imageProps = { + memo: propsMemo.content }; - const dialogProps = __spreadProps(__spreadValues({}, props), { - destroy: cbs.destroy + return /* @__PURE__ */ jsxs("div", { + className: `memo-wrapper ${"memos-" + propsMemo.id} ${propsMemo.memoType}`, + onMouseLeave: handleMouseLeaveMemoWrapper, + children: [/* @__PURE__ */ jsxs("div", { + className: "memo-top-wrapper", + children: [/* @__PURE__ */ jsxs("div", { + className: "memo-top-left-wrapper", + children: [/* @__PURE__ */ jsx("span", { + className: "time-text", + onClick: handleShowMemoStoryDialog, + children: propsMemo.createdAt + }), /* @__PURE__ */ jsx("div", { + className: `memo-type-img ${(propsMemo.memoType === "TASK-TODO" || propsMemo.memoType === "TASK-DONE") && ShowTaskLabel ? "" : "hidden"}`, + children: (_a = handleMemoTypeShow()) != null ? _a : "" + })] + }), /* @__PURE__ */ jsxs("div", { + className: "memo-top-right-wrapper", + children: [CommentOnMemos ? /* @__PURE__ */ jsxs("div", { + className: "comment-button-wrapper", + children: [/* @__PURE__ */ jsx(SvgComment, { + className: "icon-img", + onClick: handleCommentBlock + }), commentMemos.length > 0 ? /* @__PURE__ */ jsx("div", { + className: "comment-text-count", + children: commentMemos.length + }) : null] + }) : "", /* @__PURE__ */ jsxs("div", { + className: "btns-container", + children: [/* @__PURE__ */ jsx("span", { + className: "btn more-action-btn", + children: /* @__PURE__ */ jsx(SvgMore, { + className: "icon-img" + }) + }), /* @__PURE__ */ jsx("div", { + className: "more-action-btns-wrapper", + children: /* @__PURE__ */ jsxs("div", { + className: "more-action-btns-container", + children: [/* @__PURE__ */ jsx("span", { + className: "btn", + onClick: handleShowMemoStoryDialog, + children: t$1("READ") + }), /* @__PURE__ */ jsx("span", { + className: "btn", + onClick: handleMarkMemoClick, + children: t$1("MARK") + }), /* @__PURE__ */ jsx("span", { + className: "btn", + onClick: handleGenMemoImageBtnClick, + children: t$1("SHARE") + }), /* @__PURE__ */ jsx("span", { + className: "btn", + onClick: handleEditMemoClick, + children: t$1("EDIT") + }), /* @__PURE__ */ jsx("span", { + className: "btn", + onClick: () => handleSourceMemoClick(propsMemo), + children: t$1("SOURCE") + }), /* @__PURE__ */ jsx("span", { + className: `btn delete-btn ${showConfirmDeleteBtn ? "final-confirm" : ""}`, + onClick: handleDeleteMemoClick, + children: showConfirmDeleteBtn ? t$1("CONFIRM\uFF01") : t$1("DELETE") + })] + }) + })] + })] + })] + }), /* @__PURE__ */ jsx("div", { + className: "memo-content-text", + onClick: (e) => handleMemoContentClick(e, propsMemo), + onDoubleClick: handleMemoDoubleClick, + dangerouslySetInnerHTML: { + __html: formatMemoContent(propsMemo.content, propsMemo.id) + } + }), /* @__PURE__ */ jsx(MemoImage, __spreadValues({}, imageProps)), CommentOnMemos ? /* @__PURE__ */ jsxs("div", { + className: `memo-comment-wrapper`, + children: [commentMemos.length > 0 && isCommentListShown ? /* @__PURE__ */ jsx("div", { + className: `memo-comment-list`, + children: commentMemos.map((m2, idx) => /* @__PURE__ */ jsxs("div", { + className: "memo-comment", + children: [/* @__PURE__ */ jsx("div", { + className: "memo-comment-time", + children: m2.createdAt + }), /* @__PURE__ */ jsx("div", { + className: "memo-comment-text", + onClick: (e) => handleMemoContentClick(e, m2), + onDoubleClick: () => handleEditCommentClick(m2), + dangerouslySetInnerHTML: { + __html: formatMemoContent(m2.content.replace(/comment:(.*)]]/g, "").replace(/^\d{14} /g, "").trim(), m2.id) + } + })] + }, idx)) + }) : null, /* @__PURE__ */ jsx("div", { + className: `memo-comment-inputer ${isCommentShown ? "" : "hidden"}`, + children: /* @__PURE__ */ jsx(Editor, __spreadValues({ + ref: memoCommentRef + }, editorConfig)) + })] + }) : ""] }); - let Fragment2 = /* @__PURE__ */ jsx(BaseDialog, __spreadProps(__spreadValues({ - destroy: cbs.destroy, - clickSpaceDestroy: true - }, config), { - children: /* @__PURE__ */ jsx(DialogComponent, __spreadValues({}, dialogProps)) - })); - if (config.useAppContext) { - Fragment2 = /* @__PURE__ */ jsx(Provider, { - store: appStore, - context: appContext, - children: Fragment2 - }); - } - ReactDOM$1.render(Fragment2, tempDiv); - return cbs; -} -var previewImageDialog = ""; -var close = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMiAxOSA2LjQxeiIvPjwvc3ZnPg=="; -const PreviewImageDialog = ({ - destroy, - imgUrl, - filepath -}) => { - const imgRef = _react_17_0_2_react.exports.useRef(null); - const [imgWidth, setImgWidth] = _react_17_0_2_react.exports.useState(-1); +}; +function formatMemoContent(content, memoid) { + var _a; + content = encodeHtml(content); + content = parseRawTextToHtml(content).split("
").map((t2) => { + return `

${t2 !== "" ? t2 : "
"}

`; + }).join(""); const { - vault - } = appStore.getState().dailyNotesState.app; - _react_17_0_2_react.exports.useEffect(() => { - utils$1.getImageSize(imgUrl).then(({ - width - }) => { - if (width !== 0) { - setImgWidth(80); - } else { - setImgWidth(0); - } - }); - }, []); - const handleCloseBtnClick = () => { - destroy(); - }; - const handleDecreaseImageSize = () => { - if (imgWidth > 30) { - setImgWidth(imgWidth - 10); + shouldUseMarkdownParser, + shouldHideImageUrl + } = globalStateService.getState(); + if (shouldUseMarkdownParser) { + content = parseMarkedToHtml(content, memoid); + } + if (shouldHideImageUrl) { + content = content.replace(WIKI_IMAGE_URL_REG, "").replace(MARKDOWN_URL_REG, "").replace(IMAGE_URL_REG, ""); + } + content = content.replace(TAG_REG, "#$1").replace(FIRST_TAG_REG, "

#$2").replace(LINK_REG, "$1$2").replace(MD_LINK_REG, "$1").replace(MEMO_LINK_REG, "$1").replace(/\^\S{6}/g, ""); + const tempDivContainer = document.createElement("div"); + tempDivContainer.innerHTML = content; + for (let i = 0; i < tempDivContainer.children.length; i++) { + const c = tempDivContainer.children[i]; + if (c.tagName === "P" && c.textContent === "" && ((_a = c.firstElementChild) == null ? void 0 : _a.tagName) !== "BR") { + c.remove(); + i--; + continue; } + } + return tempDivContainer.innerHTML; +} +var Memo$1 = _react_17_0_2_react.exports.memo(Memo); +var dailyMemo = ""; +const DailyMemo = (props) => { + var _a; + const { + app: app2 + } = appStore.getState().dailyNotesState; + const { + memo: propsMemo + } = props; + const memo2 = __spreadProps(__spreadValues({}, propsMemo), { + createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt), + timeStr: utils$1.getTimeString(propsMemo.createdAt) + }); + const getPathOfImage2 = (vault, image2) => { + return vault.getResourcePath(image2); }; - const handleIncreaseImageSize = () => { - setImgWidth(imgWidth + 10); - }; - const convertBase64ToBlob = (base64, type) => { - var bytes = window.atob(base64); - var ab2 = new ArrayBuffer(bytes.length); - var ia2 = new Uint8Array(ab2); - for (var i = 0; i < bytes.length; i++) { - ia2[i] = bytes.charCodeAt(i); + const detectWikiInternalLink2 = (lineText, app22) => { + var _a2, _b; + const internalFileName = (_a2 = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a2[1]; + const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5]; + const file = app22.metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); + if (file === null) { + return { + linkText: internalFileName, + altText: internalAltName, + path: "", + filePath: "" + }; + } else { + const imagePath = getPathOfImage2(app22.vault, file); + if (internalAltName) { + return { + linkText: internalFileName, + altText: internalAltName, + path: imagePath, + filePath: file.path + }; + } else { + return { + linkText: internalFileName, + altText: "", + path: imagePath, + filePath: file.path + }; + } } - return new Blob([ab2], { - type - }); }; - const copyImageToClipboard = async () => { - if ((filepath === null || filepath === void 0) && imgUrl !== null) { - const myBase64 = imgUrl.split("base64,")[1]; - const blobInput = convertBase64ToBlob(myBase64, "image/png"); - const clipboardItemInput = new ClipboardItem({ - "image/png": blobInput - }); - window.navigator["clipboard"].write([clipboardItemInput]); - new require$$0.Notice("Send to clipboard successfully"); + const detectMDInternalLink2 = (lineText, app22) => { + var _a2, _b; + const internalFileName = (_a2 = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a2[5]; + const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2]; + const file = app22.metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); + if (file === null) { + return { + linkText: internalFileName, + altText: internalAltName, + path: "", + filePath: "" + }; } else { - var buffer = await vault.adapter.readBinary(filepath); - var arr = new Uint8Array(buffer); - var blob = new Blob([arr], { - type: "image/png" - }); - const item = new ClipboardItem({ - "image/png": blob - }); - window.navigator["clipboard"].write([item]); + const imagePath = getPathOfImage2(app22.vault, file); + if (internalAltName) { + return { + linkText: internalFileName, + altText: internalAltName, + path: imagePath, + filePath: file.path + }; + } else { + return { + linkText: internalFileName, + altText: "", + path: imagePath, + filePath: file.path + }; + } } }; - return /* @__PURE__ */ jsxs(Fragment, { - children: [/* @__PURE__ */ jsx("button", { - className: "btn close-btn", - onClick: handleCloseBtnClick, - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: close + let externalImageUrls = []; + const internalImageUrls = []; + let allMarkdownLink = []; + let allInternalLink = []; + if (IMAGE_URL_REG.test(memo2.content)) { + let allExternalImageUrls = []; + const anotherExternalImageUrls = []; + if (MARKDOWN_URL_REG.test(memo2.content)) { + allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG)); + } + if (WIKI_IMAGE_URL_REG.test(memo2.content)) { + allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG)); + } + if (MARKDOWN_WEB_URL_REG.test(memo2.content)) { + allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG)); + } + if (allInternalLink.length) { + for (let i = 0; i < allInternalLink.length; i++) { + const allInternalLinkElement = allInternalLink[i]; + internalImageUrls.push(detectWikiInternalLink2(allInternalLinkElement, app2)); + } + } + if (allMarkdownLink.length) { + for (let i = 0; i < allMarkdownLink.length; i++) { + const allMarkdownLinkElement = allMarkdownLink[i]; + if (/(.*)http[s]?(.*)/.test(allMarkdownLinkElement)) { + anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(allMarkdownLinkElement)) == null ? void 0 : _a[5]); + } else { + internalImageUrls.push(detectMDInternalLink2(allMarkdownLinkElement, app2)); + } + } + } + externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls); + } + return /* @__PURE__ */ jsxs("div", { + className: "daily-memo-wrapper", + children: [/* @__PURE__ */ jsx("div", { + className: "time-wrapper", + children: /* @__PURE__ */ jsx("span", { + className: "normal-text", + children: memo2.timeStr }) }), /* @__PURE__ */ jsxs("div", { - className: "img-container internal-embed image-embed is-loaded", - children: [/* @__PURE__ */ jsx("img", { - className: imgWidth <= 0 ? "hidden" : "", - ref: imgRef, - width: imgWidth + "%", - src: imgUrl - }), /* @__PURE__ */ jsx("span", { - className: "loading-text " + (imgWidth === -1 ? "" : "hidden"), - children: t("Image is loading...") - }), /* @__PURE__ */ jsx("span", { - className: "loading-text " + (imgWidth === 0 ? "" : "hidden"), - children: t("\u{1F61F} Cannot load image, image link maybe broken") - })] - }), /* @__PURE__ */ jsxs("div", { - className: "action-btns-container", - children: [/* @__PURE__ */ jsx("button", { - className: "btn", - onClick: handleDecreaseImageSize, - children: "\u2796" - }), /* @__PURE__ */ jsx("button", { - className: "btn", - onClick: handleIncreaseImageSize, - children: "\u2795" - }), /* @__PURE__ */ jsx("button", { - className: "btn", - onClick: () => setImgWidth(80), - children: "\u2B55" - }), /* @__PURE__ */ jsx("button", { - className: "btn", - onClick: copyImageToClipboard, - children: "\u{1F4C4}" + className: "memo-content-container", + children: [/* @__PURE__ */ jsx("div", { + className: "memo-content-text", + dangerouslySetInnerHTML: { + __html: formatMemoContent(memo2.content) + } + }), /* @__PURE__ */ jsx(Only, { + when: externalImageUrls.length > 0, + children: /* @__PURE__ */ jsx("div", { + className: "images-container", + children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", { + src: imgUrl, + referrerPolicy: "no-referrer" + }, idx)) + }) + }), /* @__PURE__ */ jsx(Only, { + when: internalImageUrls.length > 0, + children: /* @__PURE__ */ jsx("div", { + className: "images-container internal-embed image-embed is-loaded", + children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", { + src: imgUrl.path, + alt: imgUrl.altText, + path: imgUrl.filePath + }, idx)) + }) })] })] }); }; -function showPreviewImageDialog(imgUrl, filepath) { - if (filepath) { - showDialog({ - className: "preview-image-dialog" - }, PreviewImageDialog, { - imgUrl, - filepath - }); - } else { - showDialog({ - className: "preview-image-dialog" - }, PreviewImageDialog, { - imgUrl - }); - } +var datePicker = ""; +function SvgArrowLeft(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + xmlns: "http://www.w3.org/2000/svg", + height: "24px", + viewBox: "0 0 24 24", + width: "24px", + fill: "#37352f" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M0 0h24v24H0V0z", + fill: "none" + }), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12l4.58-4.59z" + })); } -var image = ""; -const Image$1 = (props) => { +function SvgArrowRight(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + xmlns: "http://www.w3.org/2000/svg", + height: "24px", + viewBox: "0 0 24 24", + width: "24px", + fill: "#37352f" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M0 0h24v24H0V0z", + fill: "none" + }), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6-6-6z" + })); +} +const DatePicker = (props) => { + var _a, _b; const { className, - imgUrl, - alt, - referrerPolicy, - filepath + datestamp, + handleDateStampChange } = props; - const handleImageClick = () => { - if (filepath) { - showPreviewImageDialog(imgUrl, filepath); - } else { - showPreviewImageDialog(imgUrl); - } + const [currentDateStamp, setCurrentDateStamp] = _react_17_0_2_react.exports.useState(getMonthFirstDayDateStamp(datestamp)); + _react_17_0_2_react.exports.useEffect(() => { + setCurrentDateStamp(getMonthFirstDayDateStamp(datestamp)); + }, [datestamp]); + const firstDate = new Date(currentDateStamp); + const firstDateDay = firstDate.getDay() === 0 ? 7 : firstDate.getDay(); + const dayList = []; + for (let i = 0; i < firstDateDay; i++) { + dayList.push({ + date: 0, + datestamp: firstDate.getTime() - DAILY_TIMESTAMP * (7 - i) + }); + } + const dayAmount = getMonthDayAmount(currentDateStamp); + for (let i = 1; i <= dayAmount; i++) { + dayList.push({ + date: i, + datestamp: firstDate.getTime() + DAILY_TIMESTAMP * (i - 1) + }); + } + const handleDateItemClick = (datestamp2) => { + handleDateStampChange(datestamp2); }; - return /* @__PURE__ */ jsx("div", { - className: "image-container " + className, - onClick: handleImageClick, - referrerPolicy, - children: /* @__PURE__ */ jsx("img", { - src: imgUrl, - alt, - decoding: "async", - loading: "lazy" - }) - }); -}; -var memoCardDialog = ""; -var edit = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE0LjA2IDkuMDJsLjkyLjkyTDUuOTIgMTlINXYtLjkybDkuMDYtOS4wNk0xNy42NiAzYy0uMjUgMC0uNTEuMS0uNy4yOWwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODNjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMi0uMi0uNDUtLjI5LS43MS0uMjl6bS0zLjYgMy4xOUwzIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1eiIvPjwvc3ZnPg=="; -const getPathOfImage$4 = (vault, image2) => { - return vault.getResourcePath(image2); -}; -const detectWikiInternalLink$4 = (lineText) => { - var _a, _b; - const { - metadataCache, - vault - } = appStore.getState().dailyNotesState.app; - const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1]; - const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5]; - const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); - if (file === null) { - return { - linkText: internalFileName, - altText: internalAltName, - path: "", - filepath: "" - }; - } else { - const imagePath = getPathOfImage$4(vault, file); - const filePath = file.path; - if (internalAltName) { - return { - linkText: internalFileName, - altText: internalAltName, - path: imagePath, - filepath: filePath - }; + const handleChangeMonthBtnClick = (i) => { + const year = firstDate.getFullYear(); + const month = firstDate.getMonth() + 1; + let nextDateStamp = 0; + if (month === 1 && i === -1) { + nextDateStamp = new Date(`${year - 1}/12/1`).getTime(); + } else if (month === 12 && i === 1) { + nextDateStamp = new Date(`${year + 1}/1/1`).getTime(); } else { - return { - linkText: internalFileName, - altText: "", - path: imagePath, - filepath: filePath - }; + nextDateStamp = new Date(`${year}/${month + i}/1`).getTime(); } - } + setCurrentDateStamp(getMonthFirstDayDateStamp(nextDateStamp)); + }; + return /* @__PURE__ */ jsxs("div", { + className: `date-picker-wrapper ${className}`, + children: [/* @__PURE__ */ jsxs("div", { + className: "date-picker-header", + children: [/* @__PURE__ */ jsx("span", { + className: "btn-text", + onClick: () => handleChangeMonthBtnClick(-1), + children: /* @__PURE__ */ jsx(SvgArrowLeft, { + className: "icon-img" + }) + }), /* @__PURE__ */ jsxs("span", { + className: "normal-text", + children: [firstDate.getFullYear(), " ", t$1("year"), " ", (_a = t$1("monthsShort")[firstDate.getMonth()]) != null ? _a : firstDate.getMonth() + 1, " ", (_b = t$1("month")) != null ? _b : ""] + }), /* @__PURE__ */ jsx("span", { + className: "btn-text", + onClick: () => handleChangeMonthBtnClick(1), + children: /* @__PURE__ */ jsx(SvgArrowRight, { + className: "icon-img" + }) + })] + }), /* @__PURE__ */ jsxs("div", { + className: "date-picker-day-container", + children: [/* @__PURE__ */ jsxs("div", { + className: "date-picker-day-header", + children: [/* @__PURE__ */ jsx("span", { + className: "day-item", + children: t$1("weekDaysShort")[0] + }), /* @__PURE__ */ jsx("span", { + className: "day-item", + children: t$1("weekDaysShort")[1] + }), /* @__PURE__ */ jsx("span", { + className: "day-item", + children: t$1("weekDaysShort")[2] + }), /* @__PURE__ */ jsx("span", { + className: "day-item", + children: t$1("weekDaysShort")[3] + }), /* @__PURE__ */ jsx("span", { + className: "day-item", + children: t$1("weekDaysShort")[4] + }), /* @__PURE__ */ jsx("span", { + className: "day-item", + children: t$1("weekDaysShort")[5] + }), /* @__PURE__ */ jsx("span", { + className: "day-item", + children: t$1("weekDaysShort")[6] + })] + }), dayList.map((d) => { + if (d.date === 0) { + return /* @__PURE__ */ jsx("span", { + className: "day-item null", + children: "" + }, d.datestamp); + } else { + return /* @__PURE__ */ jsx("span", { + className: `day-item ${d.datestamp === datestamp ? "current" : ""}`, + onClick: () => handleDateItemClick(d.datestamp), + children: d.date + }, d.datestamp); + } + })] + })] + }); }; -const detectMDInternalLink$4 = (lineText) => { - var _a, _b; +function getMonthDayAmount(datestamp) { + const dateTemp = new Date(datestamp); + const currentDate = new Date(`${dateTemp.getFullYear()}/${dateTemp.getMonth() + 1}/1`); + const nextMonthDate = currentDate.getMonth() === 11 ? new Date(`${currentDate.getFullYear() + 1}/1/1`) : new Date(`${currentDate.getFullYear()}/${currentDate.getMonth() + 2}/1`); + return (nextMonthDate.getTime() - currentDate.getTime()) / DAILY_TIMESTAMP; +} +function getMonthFirstDayDateStamp(timestamp) { + const dateTemp = new Date(timestamp); + const currentDate = new Date(`${dateTemp.getFullYear()}/${dateTemp.getMonth() + 1}/1`); + return currentDate.getTime(); +} +var dailyMemoDiaryDialog = ""; +const DailyMemoDiaryDialog = (props) => { + const loadingState = useLoading(); + const [memos, setMemos] = _react_17_0_2_react.exports.useState([]); + const [currentDateStamp, setCurrentDateStamp] = _react_17_0_2_react.exports.useState(utils$1.getDateStampByDate(utils$1.getDateString(props.currentDateStamp))); + const [showDatePicker, toggleShowDatePicker] = useToggle(false); + const memosElRef = _react_17_0_2_react.exports.useRef(null); + const currentDate = new Date(currentDateStamp); const { - metadataCache, vault } = appStore.getState().dailyNotesState.app; - const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5]; - const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2]; - const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); - if (file === null) { - return { - linkText: internalFileName, - altText: internalAltName, - path: "", - filepath: "" + _react_17_0_2_react.exports.useEffect(() => { + const setDailyMemos = () => { + const dailyMemos = memoService.getState().memos.filter((a) => utils$1.getTimeStampByDate(a.createdAt) >= currentDateStamp && utils$1.getTimeStampByDate(a.createdAt) < currentDateStamp + DAILY_TIMESTAMP).sort((a, b) => utils$1.getTimeStampByDate(a.createdAt) - utils$1.getTimeStampByDate(b.createdAt)); + setMemos(dailyMemos); + loadingState.setFinish(); }; - } else { - const imagePath = getPathOfImage$4(vault, file); - const filePath = file.path; - if (internalAltName) { - return { - linkText: internalFileName, - altText: internalAltName, - path: imagePath, - filepath: filePath - }; - } else { - return { - linkText: internalFileName, - altText: "", - path: imagePath, - filepath: filePath - }; - } - } -}; -const MemoCardDialog = (props) => { - var _a; - const [memo2, setMemo] = _react_17_0_2_react.exports.useState(__spreadProps(__spreadValues({}, props.memo), { - createdAtStr: utils$1.getDateTimeString(props.memo.createdAt) - })); - const [linkMemos, setLinkMemos] = _react_17_0_2_react.exports.useState([]); - const [linkedMemos, setLinkedMemos] = _react_17_0_2_react.exports.useState([]); - let externalImageUrls = []; - let internalImageUrls = []; - let allMarkdownLink = []; - let allInternalLink = []; - if (IMAGE_URL_REG.test(memo2.content)) { - let allExternalImageUrls = []; - let anotherExternalImageUrls = []; - if (MARKDOWN_URL_REG.test(memo2.content)) { - allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG)); - } - if (WIKI_IMAGE_URL_REG.test(memo2.content)) { - allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG)); - } - if (MARKDOWN_WEB_URL_REG.test(memo2.content)) { - allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG)); - } - if (allInternalLink.length) { - for (let i = 0; i < allInternalLink.length; i++) { - let one = allInternalLink[i]; - internalImageUrls.push(detectWikiInternalLink$4(one)); - } + setDailyMemos(); + }, [currentDateStamp]); + const convertBase64ToBlob = (base64, type) => { + var bytes = window.atob(base64); + var ab2 = new ArrayBuffer(bytes.length); + var ia2 = new Uint8Array(ab2); + for (var i = 0; i < bytes.length; i++) { + ia2[i] = bytes.charCodeAt(i); } - if (allMarkdownLink.length) { - for (let i = 0; i < allMarkdownLink.length; i++) { - let two = allMarkdownLink[i]; - if (/(.*)http[s]?(.*)/.test(two)) { - anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _a[5]); - } else { - internalImageUrls.push(detectMDInternalLink$4(two)); - } + return new Blob([ab2], { + type + }); + }; + const handleShareBtnClick = async () => { + toggleShowDatePicker(false); + setTimeout(() => { + if (!memosElRef.current) { + return; } - } - externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls); - } - _react_17_0_2_react.exports.useEffect(() => { - const fetchLinkedMemos = async () => { - try { - const linkMemos2 = []; - const matchedArr = [...memo2.content.matchAll(MEMO_LINK_REG)]; - for (const matchRes of matchedArr) { - if (matchRes && matchRes.length === 3) { - const id2 = matchRes[2]; - const memoTemp = memoService.getMemoById(id2); - if (memoTemp) { - linkMemos2.push(__spreadProps(__spreadValues({}, memoTemp), { - createdAtStr: utils$1.getDateTimeString(memoTemp.createdAt), - dateStr: utils$1.getDateString(memoTemp.createdAt) - })); + toImage(memosElRef.current, { + backgroundColor: "#ffffff", + pixelRatio: window.devicePixelRatio * 2 + }).then((url) => { + if (AutoSaveWhenOnMobile && require$$0.Platform.isMobile) { + const myBase64 = url.split("base64,")[1]; + const blobInput = convertBase64ToBlob(myBase64, "image/png"); + blobInput.arrayBuffer().then(async (buffer) => { + let aFile; + const ext = "png"; + const dailyNotes = getAllDailyNotes_1(); + for (const string in dailyNotes) { + if (dailyNotes[string] instanceof require$$0.TFile) { + aFile = dailyNotes[string]; + break; + } } - } + if (aFile !== void 0) { + await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, aFile), buffer); + } + }); } - setLinkMemos([...linkMemos2]); - const linkedMemos2 = await memoService.getLinkedMemos(memo2.id); - setLinkedMemos(linkedMemos2.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)).map((m2) => __spreadProps(__spreadValues({}, m2), { - createdAtStr: utils$1.getDateTimeString(m2.createdAt), - dateStr: utils$1.getDateString(m2.createdAt) - }))); - } catch (error) { - } - }; - fetchLinkedMemos(); - }, [memo2.id]); - const handleMemoContentClick = _react_17_0_2_react.exports.useCallback(async (e) => { - var _a2; - const targetEl = e.target; - if (targetEl.className === "memo-link-text") { - const nextMemoId = (_a2 = targetEl.dataset) == null ? void 0 : _a2.value; - const memoTemp = memoService.getMemoById(nextMemoId != null ? nextMemoId : ""); - if (memoTemp) { - const nextMemo = __spreadProps(__spreadValues({}, memoTemp), { - createdAtStr: utils$1.getDateTimeString(memoTemp.createdAt) - }); - setLinkMemos([]); - setLinkedMemos([]); - setMemo(nextMemo); - } else { - new require$$0.Notice("MEMO Not Found"); - targetEl.classList.remove("memo-link-text"); - } - } - }, []); - const handleLinkedMemoClick = _react_17_0_2_react.exports.useCallback((memo22) => { - setLinkMemos([]); - setLinkedMemos([]); - setMemo(memo22); - }, []); - const handleEditMemoBtnClick = _react_17_0_2_react.exports.useCallback(() => { - props.destroy(); - globalStateService.setEditMemoId(memo2.id); - }, [memo2.id]); + showPreviewImageDialog(url); + }).catch(() => { + }); + }, 0); + }; + const handleDataPickerChange = (datestamp) => { + setCurrentDateStamp(datestamp); + toggleShowDatePicker(false); + }; return /* @__PURE__ */ jsxs(Fragment, { - children: [/* @__PURE__ */ jsxs("div", { - className: "memo-card-container", - children: [/* @__PURE__ */ jsxs("div", { - className: "header-container", - children: [/* @__PURE__ */ jsx("p", { - className: "time-text", - children: memo2.createdAtStr + children: [/* @__PURE__ */ jsx("div", { + className: "dialog-header-container", + children: /* @__PURE__ */ jsxs("div", { + className: "header-wrapper", + children: [/* @__PURE__ */ jsx("p", { + className: "title-text", + children: t$1("Daily Memos") }), /* @__PURE__ */ jsxs("div", { className: "btns-container", - children: [/* @__PURE__ */ jsx("button", { - className: "btn edit-btn", - onClick: handleEditMemoBtnClick, - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: edit + children: [/* @__PURE__ */ jsx("span", { + className: "btn-text", + onClick: () => setCurrentDateStamp(currentDateStamp - DAILY_TIMESTAMP), + children: /* @__PURE__ */ jsx(SvgArrowLeft, { + className: "icon-img" }) - }), /* @__PURE__ */ jsx("button", { - className: "btn close-btn", - onClick: props.destroy, - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: close + }), /* @__PURE__ */ jsx("span", { + className: "btn-text", + onClick: () => setCurrentDateStamp(currentDateStamp + DAILY_TIMESTAMP), + children: /* @__PURE__ */ jsx(SvgArrowRight, { + className: "icon-img" + }) + }), /* @__PURE__ */ jsx("span", { + className: "btn-text share-btn", + onClick: handleShareBtnClick, + children: /* @__PURE__ */ jsx(SvgShare, { + className: "icon-img" + }) + }), /* @__PURE__ */ jsx("span", { + className: "btn-text", + onClick: () => props.destroy(), + children: /* @__PURE__ */ jsx(SvgClose, { + className: "icon-img" }) })] })] - }), /* @__PURE__ */ jsxs("div", { - className: "memo-container", + }) + }), /* @__PURE__ */ jsxs("div", { + className: "dialog-content-container", + ref: memosElRef, + children: [/* @__PURE__ */ jsxs("div", { + className: "date-card-container", + onClick: () => toggleShowDatePicker(), children: [/* @__PURE__ */ jsx("div", { - className: "memo-content-text", - onClick: handleMemoContentClick, - dangerouslySetInnerHTML: { - __html: formatMemoContent(memo2.content) - } - }), /* @__PURE__ */ jsx(Only, { - when: externalImageUrls.length > 0, - children: /* @__PURE__ */ jsx("div", { - className: "images-wrapper", - children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, { - className: "memo-img", - imgUrl, - alt: "", - referrerPolicy: "no-referrer" - }, idx)) - }) - }), /* @__PURE__ */ jsx(Only, { - when: internalImageUrls.length > 0, - children: /* @__PURE__ */ jsx("div", { - className: "images-wrapper internal-embed image-embed is-loaded", - children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, { - className: "memo-img", - imgUrl: imgUrl.path, - alt: imgUrl.altText, - filepath: imgUrl.filepath - }, idx)) - }) + className: "year-text", + children: currentDate.getFullYear() + }), /* @__PURE__ */ jsxs("div", { + className: "date-container", + children: [/* @__PURE__ */ jsx("div", { + className: "month-text", + children: t$1("months")[currentDate.getMonth()] + }), /* @__PURE__ */ jsx("div", { + className: "date-text", + children: currentDate.getDate() + }), /* @__PURE__ */ jsx("div", { + className: "day-text", + children: t$1("weekDays")[currentDate.getDay()] + })] })] - }), /* @__PURE__ */ jsx("div", { - className: "layer-container" - }), linkMemos.map((_, idx) => { - if (idx < 4) { - return /* @__PURE__ */ jsx("div", { - className: "background-layer-container", - style: { - bottom: (idx + 1) * -3 + "px", - left: (idx + 1) * 5 + "px", - width: `calc(100% - ${(idx + 1) * 10}px)`, - zIndex: -idx - 1 - } - }, idx); - } else { - return null; - } - })] - }), linkMemos.length > 0 ? /* @__PURE__ */ jsxs("div", { - className: "linked-memos-wrapper", - children: [/* @__PURE__ */ jsxs("p", { - className: "normal-text", - children: [t("LINKED"), " ", linkMemos.length, " MEMO "] - }), linkMemos.map((m2) => { - const rawtext = parseHtmlToRawText(formatMemoContent(m2.content)).replaceAll("\n", " "); - return /* @__PURE__ */ jsxs("div", { - className: "linked-memo-container", - onClick: () => handleLinkedMemoClick(m2), - children: [/* @__PURE__ */ jsxs("span", { - className: "time-text", - children: [m2.dateStr, " "] - }), rawtext] - }, m2.id); - })] - }) : null, linkedMemos.length > 0 ? /* @__PURE__ */ jsxs("div", { - className: "linked-memos-wrapper", - children: [/* @__PURE__ */ jsxs("p", { - className: "normal-text", - children: [linkedMemos.length, " MEMO ", t("LINK TO THE"), " MEMO"] - }), linkedMemos.map((m2) => { - const rawtext = parseHtmlToRawText(formatMemoContent(m2.content)).replaceAll("\n", " "); - return /* @__PURE__ */ jsxs("div", { - className: "linked-memo-container", - onClick: () => handleLinkedMemoClick(m2), - children: [/* @__PURE__ */ jsxs("span", { - className: "time-text", - children: [m2.dateStr, " "] - }), rawtext] - }, m2.id); + }), /* @__PURE__ */ jsx(DatePicker, { + className: `date-picker ${showDatePicker ? "" : "hidden"}`, + datestamp: currentDateStamp, + handleDateStampChange: handleDataPickerChange + }), loadingState.isLoading ? /* @__PURE__ */ jsx("div", { + className: "tip-container", + children: /* @__PURE__ */ jsx("p", { + className: "tip-text", + children: t$1("Loading...") + }) + }) : memos.length === 0 ? /* @__PURE__ */ jsx("div", { + className: "tip-container", + children: /* @__PURE__ */ jsx("p", { + className: "tip-text", + children: t$1("Noooop!") + }) + }) : /* @__PURE__ */ jsx("div", { + className: "dailymemos-wrapper", + children: memos.map((memo2) => /* @__PURE__ */ jsx(DailyMemo, { + memo: memo2 + }, `${memo2.id}-${memo2.updatedAt}`)) })] - }) : null] + })] }); }; -function showMemoCardDialog(memo2) { +function showDailyMemoDiaryDialog(datestamp = Date.now()) { showDialog({ - className: "memo-card-dialog" - }, MemoCardDialog, { - memo: memo2 + className: "daily-memo-diary-dialog" + }, DailyMemoDiaryDialog, { + currentDateStamp: datestamp }); } -const cachedResourceMap = new Map(); -const convertResourceToDataURL = async (url, useCache = true) => { - const { vault } = dailyNotesService.getState().app; - if (useCache && cachedResourceMap.has(url)) { - return Promise.resolve(cachedResourceMap.get(url)); - } - if (!/(http|https)/g.test(url)) { - if (await vault.adapter.exists(url)) { - const buffer = await vault.adapter.readBinary(url); - const arr = new Uint8Array(buffer); - const blob = new Blob([arr], { type: "image/png" }); - return new Promise((resolve) => { - const reader = new FileReader(); - reader.onloadend = () => { - const base64Url = reader.result; - cachedResourceMap.set(url, base64Url); - resolve(base64Url); - }; - reader.readAsDataURL(blob); - }); - } - } else { - try { - const buffer = (await downloadFile(url)).buffer; - const blob = new Blob([buffer], { type: "image/png" }); - return new Promise((resolve) => { - const reader = new FileReader(); - reader.onloadend = () => { - const base64Url = reader.result; - cachedResourceMap.set(url, base64Url); - resolve(base64Url); - }; - reader.readAsDataURL(blob); - }); - } catch (error) { - console.log("error in grabReleaseFileFromRepository", URL, error); +var userBanner = ""; +const UserBanner = () => { + const { + memoState: { + memos, + tags + }, + userState: { + user } + } = _react_17_0_2_react.exports.useContext(appContext); + const username = user ? user.username : UserName; + let memosLength; + let createdDays; + if (memos.length) { + memosLength = memos.length - 1; + createdDays = memos ? Math.ceil((Date.now() - utils$1.getTimeStampByDate(memos[memosLength].createdAt)) / 1e3 / 3600 / 24) + 1 : 0; } + const [shouldShowPopupBtns, setShouldShowPopupBtns] = _react_17_0_2_react.exports.useState(false); + const handleUsernameClick = _react_17_0_2_react.exports.useCallback(() => { + locationService.pushHistory("/"); + locationService.clearQuery(); + }, []); + const handlePopupBtnClick = () => { + const sidebarEl = document.querySelector(".memos-sidebar-wrapper"); + const popupEl = document.querySelector(".menu-btns-popup"); + popupEl.style.top = 70 - sidebarEl.scrollTop + "px"; + setShouldShowPopupBtns(true); + }; + return /* @__PURE__ */ jsxs("div", { + className: "user-banner-container", + children: [/* @__PURE__ */ jsxs("div", { + className: "userinfo-header-container", + children: [/* @__PURE__ */ jsx("p", { + className: "username-text", + onClick: handleUsernameClick, + children: username + }), /* @__PURE__ */ jsx("span", { + className: "action-btn menu-popup-btn", + onClick: handlePopupBtnClick, + children: /* @__PURE__ */ jsx(SvgMore, { + className: "icon-img" + }) + }), /* @__PURE__ */ jsx(MenuBtnsPopup, { + shownStatus: shouldShowPopupBtns, + setShownStatus: setShouldShowPopupBtns + })] + }), /* @__PURE__ */ jsxs("div", { + className: "status-text-container", + children: [/* @__PURE__ */ jsxs("div", { + className: "status-text memos-text", + children: [/* @__PURE__ */ jsx("span", { + className: "amount-text", + children: memos.length + }), /* @__PURE__ */ jsx("span", { + className: "type-text", + children: "MEMO" + })] + }), /* @__PURE__ */ jsxs("div", { + className: "status-text tags-text", + children: [/* @__PURE__ */ jsx("span", { + className: "amount-text", + children: tags.length + }), /* @__PURE__ */ jsx("span", { + className: "type-text", + children: t$1("TAG") + })] + }), /* @__PURE__ */ jsxs("div", { + className: "status-text duration-text", + onClick: () => showDailyMemoDiaryDialog(), + children: [/* @__PURE__ */ jsx("span", { + className: "amount-text", + children: createdDays != null ? createdDays : 0 + }), /* @__PURE__ */ jsx("span", { + className: "type-text", + children: t$1("DAY") + })] + })] + })] + }); }; -const downloadFile = async (url) => { - const response = await fetch(url, { - mode: "no-cors" - }); - if (response.status !== 200) { - return { - ok: false, - msg: response.statusText - }; - } - const buffer = await response.arrayBuffer(); - try { - return { - ok: true, - msg: "ok", - buffer - }; - } catch (err) { - return { - ok: false, - msg: err - }; - } -}; -const getCloneStyledElement = async (element) => { - const clonedElementContainer = document.createElement(element.tagName); - clonedElementContainer.innerHTML = element.innerHTML; - const applyStyles2 = async (sourceElement, clonedElement) => { - var _a; - if (!sourceElement || !clonedElement) { - return; - } - const sourceStyles = window.getComputedStyle(sourceElement); - if (sourceElement.tagName === "IMG") { - try { - const url = await convertResourceToDataURL((_a = sourceElement.getAttribute("path")) != null ? _a : sourceElement.getAttribute("src")); - clonedElement.src = url; - } catch (error) { +const relationConsts = [ + { text: "AND", value: "AND" }, + { text: "OR", value: "OR" } +]; +const filterConsts = { + TAG: { + value: "TAG", + text: t$1("TAG"), + operators: [ + { + text: t$1("INCLUDE"), + value: "CONTAIN" + }, + { + text: t$1("EXCLUDE"), + value: "NOT_CONTAIN" } - } else if (sourceElement.className === "property-image") { - try { - const imageUrl = sourceElement.style.backgroundImage; - const url = await convertResourceToDataURL(imageUrl); - clonedElement.style.backgroundImage = url; - } catch (error) { + ] + }, + TYPE: { + value: "TYPE", + text: t$1("TYPE"), + operators: [ + { + value: "IS", + text: t$1("IS") + }, + { + value: "IS_NOT", + text: t$1("ISNOT") } - } - for (const item of sourceStyles) { - clonedElement.style.setProperty(item, sourceStyles.getPropertyValue(item), sourceStyles.getPropertyPriority(item)); - } - for (let i = 0; i < clonedElement.childElementCount; i++) { - await applyStyles2(sourceElement.children[i], clonedElement.children[i]); - } - }; - await applyStyles2(element, clonedElementContainer); - return clonedElementContainer; -}; -const getFontsStyleElement = async (element) => { - const styleSheets = element.ownerDocument.styleSheets; - const fontFamilyStyles = []; - for (const sheet of styleSheets) { - for (const rule of sheet.cssRules) { - if (rule.constructor.name === "CSSFontFaceRule") { - fontFamilyStyles.push(rule.style); + ], + values: [ + { + value: "CONNECTED", + text: t$1("LINKED") + }, + { + value: "NOT_TAGGED", + text: t$1("NO TAGS") + }, + { + value: "LINKED", + text: t$1("HAS LINKS") + }, + { + value: "IMAGED", + text: t$1("HAS IMAGES") + } + ] + }, + TEXT: { + value: "TEXT", + text: t$1("TEXT"), + operators: [ + { + value: "CONTAIN", + text: t$1("INCLUDE") + }, + { + value: "NOT_CONTAIN", + text: t$1("EXCLUDE") + } + ] + }, + DATE: { + value: "DATE", + text: t$1("DATE"), + operators: [ + { + value: "NOT_CONTAIN", + text: t$1("BEFORE") + }, + { + value: "CONTAIN", + text: t$1("AFTER") } + ] + } +}; +const memoSpecialTypes = filterConsts["TYPE"].values; +const getTextWithMemoType = (type) => { + for (const t2 of memoSpecialTypes) { + if (t2.value === type) { + return t2.text; } } - const styleElement = document.createElement("style"); - return styleElement; + return ""; }; -const getElementSize = (element) => { - const { width, height } = window.getComputedStyle(element); +const getDefaultFilter = () => { return { - width: parseInt(width.replace("px", "")), - height: parseInt(height.replace("px", "")) + type: "TAG", + value: { + operator: "CONTAIN", + value: "" + }, + relation: "AND" }; }; -const convertSVGToDataURL = (svg) => { - const xml = new XMLSerializer().serializeToString(svg); - const url = encodeURIComponent(xml); - return `data:image/svg+xml;charset=utf-8,${url}`; -}; -const generateSVGElement = (width, height, element) => { - const xmlNS = "http://www.w3.org/2000/svg"; - const svgElement = document.createElementNS(xmlNS, "svg"); - svgElement.setAttribute("width", `${width}`); - svgElement.setAttribute("height", `${height}`); - svgElement.setAttribute("viewBox", `0 0 ${width} ${height}`); - const foreignObject = document.createElementNS(xmlNS, "foreignObject"); - foreignObject.setAttribute("width", "100%"); - foreignObject.setAttribute("height", "100%"); - foreignObject.setAttribute("x", "0"); - foreignObject.setAttribute("y", "0"); - foreignObject.setAttribute("externalResourcesRequired", "true"); - foreignObject.appendChild(element); - svgElement.appendChild(foreignObject); - return svgElement; -}; -const toSVG = async (element, options) => { - const { width, height } = getElementSize(element); - const clonedElement = await getCloneStyledElement(element); - if (options == null ? void 0 : options.backgroundColor) { - clonedElement.style.backgroundColor = options.backgroundColor; - } - const svg = generateSVGElement(width, height, clonedElement); - svg.prepend(await getFontsStyleElement(element)); - const url = convertSVGToDataURL(svg); - return url; -}; -const toCanvas = async (element, options) => { - const url = await toSVG(element, options); - const imageEl = new Image(); - imageEl.src = url; - const ratio = (options == null ? void 0 : options.pixelRatio) || 1; - const { width, height } = getElementSize(element); - const canvas = document.createElement("canvas"); - const context = canvas.getContext("2d"); - if (!context) { - return Promise.reject("Canvas error"); - } - canvas.width = width * ratio; - canvas.height = height * ratio; - canvas.style.width = `${width}`; - canvas.style.height = `${height}`; - if ((options == null ? void 0 : options.backgroundColor) || document.body.className.contains("theme-dark")) { - context.fillStyle = options.backgroundColor || "#1f1f1f"; - context.fillRect(0, 0, canvas.width, canvas.height); - } - return new Promise((resolve) => { - imageEl.onload = () => { - context.drawImage(imageEl, 0, 0, canvas.width, canvas.height); - resolve(canvas); - }; - }); -}; -const toImage = async (element, options) => { - const canvas = await toCanvas(element, options); - return canvas.toDataURL(); -}; -var shareMemoImageDialog = ""; -var share = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0cHgiIGZpbGw9IiMzNzM1MmYiPjxnPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCIvPjwvZz48Zz48cGF0aCBkPSJNMTYsNWwtMS40MiwxLjQybC0xLjU5LTEuNTlWMTZoLTEuOThWNC44M0w5LjQyLDYuNDJMOCw1bDQtNEwxNiw1eiBNMjAsMTB2MTFjMCwxLjEtMC45LDItMiwySDZjLTEuMTEsMC0yLTAuOS0yLTJWMTAgYzAtMS4xMSwwLjg5LTIsMi0yaDN2Mkg2djExaDEyVjEwaC0zVjhoM0MxOS4xLDgsMjAsOC44OSwyMCwxMHoiLz48L2c+PC9zdmc+"; -var lightBackground = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGRhdGEtbmFtZT0iTGF5ZXIgMSIgd2lkdGg9IjExNDYuMzE4MjgiIGhlaWdodD0iODAxLjAwMzYxIiB2aWV3Qm94PSIwIDAgMTE0Ni4zMTgyOCA4MDEuMDAzNjEiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48cGF0aCBkPSJNMTA1MC42OTkxOCw1MTQuNTA4MmE0NTYuMjQ5MTMsNDU2LjI0OTEzLDAsMCwxLTM3LjM4MDEzLTI2MS44N2MzLjYwMDEtMjMuMSw5LjQ0MDA2LTQ2Ljg1LDI0LjQzMDE4LTY0Ljc5LDE0LjM4OTg5LTE3LjIzLDM5LjM0OTg1LTI3LjM3LDYwLjAyOTktMTkuMjktMTMuNTY5OTQtMjkuNjEtNDcuNzYtNDYuNS04MC41OS00Ny4zMy0zNC4wOS0uODYtNjYuOTIsMTIuNS05Ny4yNSwyOC4xLTMwLjMzLDE1LjYtNTkuNjUsMzMuODEwMDYtOTIuMjEsNDMuOTktNTMuNSwxNi43Mi0xMTEuOTEsMTAuMzQtMTY1LjUtNi4wOS01My41OC0xNi40NC0xMDMuNjItNDIuNDctMTU0LjYyLTY1LjcxLTUxLjAxLTIzLjI0LTEwNC4xNy00NC4wMy0xNjAuMDEtNDguOTEtNTUuODQtNC44Ny0xMTUuMjUsNy44OS0xNTcuMjQsNDUuMDFzLTYxLjg3LDEwMS4yOC0zOC4yNywxNTIuMTFjMTQuMjUsMzAuNyw0Mi4yMiw1NC4zMiw1Mi4wNCw4Ni43LDEyLjMyLDQwLjY1LTcuMDgsODMuOTYtMzAuNDEsMTE5LjQ1LTIzLjM0LDM1LjQ5LTUxLjgsNjkuNTgtNjAuNDcsMTExLjE2LTguMDEsMzguMzgsMi43Miw3OC4wMiwyNC4wNSwxMTEuMzhhMTk3LjM0NDY4LDE5Ny4zNDQ2OCwwLDAsMCwzNS43NCw0MS42MWM0My4wOSwzNy45MSw5OC43Nyw1OC4xNSwxNTQuMTcsNzMuMTMsMjAwLjI3LDU0LjE3LDQxNi4xMyw0OS4yOSw2MTMuNzUtMTMuODgsMzQuOTktMTEuMTgsNjkuOTUtMjQuNDMsOTkuMzItNDYuNDgsMTkuMTYtMTQuMzgsMzUuODMtMzMuMDIsNDYuMzktNTQuMzVhMTE0LjEwNTc0LDExNC4xMDU3NCwwLDAsMCwxMS4xMy0zNi4xODAwNUMxMTA0LjQzOTE3LDYxMC4xNzgxOSwxMDcyLjk2OTIsNTYyLjA1ODE5LDEwNTAuNjk5MTgsNTE0LjUwODJaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzZjNjNmZiIvPjxnIG9wYWNpdHk9IjAuMTciPjxwYXRoIGQ9Ik04OTAuNzUwMzIsMjQ2LjQ1MTQ1YzkuNjQxNzEtNC4yMDM5NC05LjkxMTYzLTYuNjUxMTktMzIuMDk1ODUtNy40NTU4MnMtNDkuMDIwNjEtLjc2MDExLTYzLjE5NzU2LTMuMDQ4NzVjLTEzLjcxMTE0LTIuMjEzNDMtMTIuNzAwOS02LjE0OTA3LTEzLjg1NDI3LTkuNzE0ODlzLTYuNDI0NDYtNy4yMjItMjcuODE5MjgtOC4wMTQ3Yy0yNi42NjA3LS45ODc3NC03MC42MjU4MSwyLjgxNDM0LTkwLjc1MTcxLjUzMTczLTE4Ljc4MTIxLTIuMTMwMTEtNy42MTcyMy04LjgxMTgyLTM1LjAwMzQ0LTkuMDY3NTUtMTUuNjM4MzctLjE0Ni0zNS43ODQ5LDIuMDU2ODItNTMuMTg1NzcsMi41ODg0NC0xNi4zMzY0Ny40OTkwOS0yOC40MjIxNi0uNTM0NDEtMzYuOTAzNTctMS45MjRzLTE0LjM4ODc1LTMuMTUxMjYtMjMuOTM0MTMtNC4zNzg2NGMtMjUuMDYwNjgtMy4yMjI0LTc0LjA5MTMzLTIuMTM5MjUtMTE3Ljg1MywxLjk5MDcxcy04MS4yNzM0NCwxMC44OTgxNi0xMDIuNDI4ODksMTcuNjAxNzUtMjcuMDAwMjksMTMuMzAzNzYtMjIuMDcyMzksMTguOTAwNzFjMy4xNDY3NCwzLjU3NCwxMS4xOTkxNSw2LjkxNTg1LDMwLjczMjM1LDguMzUyLDM2LjUzNTU1LDIuNjg2MjEsMTAxLjU4Mzg3LTEuOTM3NSwxMzkuMzM3MTMuNTA2NDUsMjEuMDQxNSwxLjM2MjEzLDMwLjM3NjQsNC43MzkyNCw0OC44MzgxMiw2LjU4NzE2LDE5LjgzNDA3LDEuOTg1MjgsNDguODY5MzUsMi4wOTA1MSw3Ny4zOTY1NiwyLjA0MzQxLDU5LjM5NzIxLS4wOTgwNywxMjAuMzEzNy0uNzA4MjksMTgyLjQyOTk0LTEuODI3NDcsMjUuOTQ0ODYtLjQ2NzQ1LDUzLjEzLTEuMDc1Miw4MC43Mzc2MS0zLjMwMjg5czU1Ljc2NjIzLTYuNTI1OTEsNjEuNTkwNzYtMTAuNTU1MyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiNmZmYiLz48L2c+PHBhdGggZD0iTTEwOTkuMjU5MTEsMTcyLjA0ODE4Yy0uNDYtMS4xOC0uOTYtMi4zNS0xLjQ4LTMuNDkuODQuMzMsMS42ODAwNi42OSwyLjUxLDEuMDhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzZjNjNmZiIvPjxwYXRoIGQ9Ik02NDguNzQ0ODIsMzE0LjU4NDNjLTcuNjY5MzUtMTIuNjg0NDUtMTYuNzU3MjEtMjYuMjI3NjctMzAuOTg5NTUtMzAuMzY5NTMtMTYuNDgyLTQuNzk2NS0zMy40MTMxOSw0LjczMTkzLTQ3Ljc3NDczLDE0LjEzNDUzYTEzOTIuMTU2OTIsMTM5Mi4xNTY5MiwwLDAsMC0xMjMuODkzMzgsOTEuMjgzMTFsLjA0MzMxLjQ5MjM5cTQ2LjIyNTU2LTMuMTg3ODEsOTIuNDUxLTYuMzc1NTVjMjIuMjY1MzItMS41MzU0Niw0NS4yOTU1Ny0zLjI4MjcsNjQuOTcxOTUtMTMuODE1Niw3LjQ2NjUyLTMuOTk2ODMsMTQuNzQ0NzUtOS4zMzU3OSwyMy4yMDU1NS05LjcwNzgyLDEwLjUxMTc1LS40NjIxNywxOS42NzczMyw2Ljg3OTIzLDI2Ljg4MDIsMTQuNTQ5MzEsNDIuNjA3MzIsNDUuMzcxLDU0LjkzNywxMTQuNzU0MSwxMDIuNzM4MTcsMTU0LjYxNTkyQTE1MTYuOTk0NTgsMTUxNi45OTQ1OCwwLDAsMCw2NDguNzQ0ODIsMzE0LjU4NDNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2YyZjJmMiIvPjxwYXRoIGQ9Ik05MTAuNjQ1NzYsNjk5LjQxMjdjLTQuNzExNjgtNS45NDk1OC02LjYzNjkxLTcuMzQzLTExLjI4NDU3LTEzLjM0NzYxUTg0Mi41OTY4LDYxMi42NDg3Miw3OTIuNjUzMjcsNTM0LjI3MjcycS0zMy45MjM1My01My4yMzAwNS02NC40ODI3NS0xMDguNTA0MzktMTQuNTQ4NjMtMjYuMjc4MDgtMjguMjk5NjEtNTIuOTY4NzItMTAuNjcwNDMtMjAuNjk1Mi0yMC44NjQ2LTQxLjYzNzkzYy0xLjk0MzU3LTMuOTg3ODEtMy44MzIwOS03Ljk5MzkzLTUuNzExMjItMTIuMDA5MjItNC40Mjc4OC05LjQ0MjMyLTguNzczNC0xOC45MzA0Ny0xMy40Mzk0Mi0yOC4yNDQ0OS01LjMxNjg3LTEwLjYxNTcxLTExLjc4OTA1LTIxLjc0NDg1LTIxLjU1MjU5LTI4Ljg3N2EyOS40MDQ5LDI5LjQwNDksMCwwLDAtMTUuMzE4NTUtNS44OTQ1N2MtNy45NDgtLjUxMzM3LTE1LjI4MTg1LDIuNzY4NTQtMjIuMTc1NjksNi4zNTI5NC01MC40Mzg1OCwyNi4zMDEtOTcuNjU5MjEsNTkuMjc1ODktMTQwLjM2OTU5LDk2Ljc5NzcxQTczMC43Nzc4MSw3MzAuNzc3ODEsMCwwLDAsMzQ2LjM5NzQ4LDQ4NS44Nzg0M2MtMS4wMDgsMS40MzkyNy0zLjM5MTYzLjA2NDE4LTIuMzc0MTktMS4zODQyMnE2LjAwOTM1LTguNDk4MTgsMTIuMjU2ODEtMTYuODEyODhBNzM0LjgxNzQyLDczNC44MTc0MiwwLDAsMSw1NDMuODc5NzIsMjkyLjY5NTZxMTguMjQ4MjUtMTEuODI1NzksMzcuMTgyNjktMjIuNTQyNDVjNi4zNjIwNi0zLjYwMjc1LDEyLjc1MTg4LTcuMTU5NjcsMTkuMjUxMzYtMTAuNDk2NTMsNi4zNzE0Ny0zLjI3Mjc0LDEzLjEzNjg0LTYuMjE1NDcsMjAuNDE1NjMtNi4zMjU0NywyNC43NzAxMS0uMzg1LDM3LjU5NTQsMjcuNjY3LDQ2LjQwNTA2LDQ2LjU0MjQ4cTQuMTUyODMsOC45MTA2LDguNDA2MzYsMTcuNzY2MjYsMTYuMDc0ODEsMzMuNjIxMDYsMzMuMzg3MjksNjYuNjI4LDEwLjY4NDUzLDIwLjM3OSwyMS44MzY4Myw0MC41MTk1NSwzNC43MDcxLDYyLjcxODE2LDczLjc3ODU0LDEyMi44OTdjMzQuNTA1OSw1My4xNDI5LDY4LjczNjUxLDEwMC4wODg3NCwxMDguMDQ1ODYsMTQ5Ljc4NDczQzkxMy42NzEyNCw2OTguODQ0MzMsOTExLjczNzA2LDcwMC44MDYxNSw5MTAuNjQ1NzYsNjk5LjQxMjdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2U0ZTRlNCIvPjxwYXRoIGQ9Ik00NTcuOTkxMiwzNDUuNDM1MmMtMS40MzkxMS0xLjYwNDI4LTIuODY5MjYtMy4yMDg1Ni00LjMxNzc3LTQuODEyODQtMTEuNDIyNDQtMTIuNjMyNTktMjMuNjc4OC0yNS4xMTg0Ny0zOS4zNjQ0LTMyLjM2MDY3YTU3LjExMDIxLDU3LjExMDIxLDAsMCwwLTIzLjkyNjc4LTUuNTQ2MjJjLTguNTYyMTMuMDI3NTMtMTYuOTMxNzgsMi4yNzM0OC0yNC44NDMwNyw1LjQxNzkyLTMuNzQwMzQsMS40OTQyOC03LjM5ODMxLDMuMTkwMjEtMTEuMDAwNzgsNC45OTYxNC00LjExNjM0LDIuMDcxODItOC4xNTkyNyw0LjI4MTE4LTEyLjE4MzQsNi41MDg4M3EtMTEuMzMxMTIsNi4yNzA0NC0yMi4zNjgxNiwxMy4wOTA5LTIxLjk2MDYsMTMuNTcyMi00Mi41NDU2NSwyOS4yMTYyMy0xMC42NzExMSw4LjExMzExLTIwLjkwMTc1LDE2Ljc1Nzg4LTkuNTE1NTcsOC4wMzA1Mi0xOC42NDYxOCwxNi40OTJjLTEuMzAxNjgsMS4yMDA5MS0zLjI0NTI2LS43NDI1NS0xLjk0MzU4LTEuOTQzNDcsMS42MDQyOC0xLjQ5NDI4LDMuMjI2OTItMi45NzkzOCw0Ljg0OTU1LTQuNDQ2MTJxNi44NzU0OS02LjIxNTQ3LDEzLjk3MTItMTIuMTkyNTgsMTIuOTM5MjEtMTAuOTE4MjcsMjYuNTQ4NTEtMjAuOTkzMTIsMjEuMTYyOTUtMTUuNjc2MTQsNDMuNzgyODktMjkuMjI1NCwxMS4zMDM2LTYuNzY1NDcsMjIuOTE4MjktMTIuOTYyNmMyLjMzNzkzLTEuMjQ2NzQsNC43MDMxNy0yLjQ2Niw3LjA5NTcxLTMuNjIxMWExMTMuMTE0MzUsMTEzLjExNDM1LDAsMCwxLDE2Ljg2Nzc4LTYuODY2MzEsNjAuMDA2MjYsNjAuMDA2MjYsMCwwLDEsMjUuNDc2LTIuNTAyNjYsNjYuMzI3MjUsNjYuMzI3MjUsMCwwLDEsMjMuNTA1MTIsOC4xMzE0YzE1LjQwMDkxLDguNjA4MTIsMjcuMzQ1NzMsMjEuOTE5LDM4Ljk3MDA1LDM0LjkwOTE2QzQ2MS4xMDg0NCwzNDQuODAyNjUsNDU5LjE3MzgyLDM0Ni43NTUyOSw0NTcuOTkxMiwzNDUuNDM1MloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjZTRlNGU0Ii8+PHBhdGggZD0iTTc3My41NTE2Niw0NzYuMzQyMTZsMzYuOTA0NjItMTMuNDk4LDE4LjMyMzI3LTYuNzAxODJjNS45Njc1OC0yLjE4MjY3LDExLjkyMDgyLTQuNjY3NDcsMTguMDg5ODktNi4yMzAzN2EyOC41Mzg2OCwyOC41Mzg2OCwwLDAsMSwxNi4zNzM1NS4yMDg2MiwzNy43MzczMSwzNy43MzczMSwwLDAsMSwxMi43NzEsNy45MTY2NywxMDMuNjM4NzEsMTAzLjYzODcxLDAsMCwxLDEwLjQ3NDg4LDExLjE4NjQyYzMuOTg5MzIsNC43OTQyNiw3LjkxOTcsOS42Mzg3OCwxMS44Njc3MiwxNC40NjcwNnEyNC40NDEzNSwyOS44OTA5Myw0OC41NjMwNiw2MC4wNDEzNCwyNC4xMjExOCwzMC4xNDk5MSw0Ny45MTk4MSw2MC41NTYsMjMuODU2ODEsMzAuNDgwNDIsNDcuMzg1NDgsNjEuMjE1NzMsMi44ODIzLDMuNzY1MTksNS43NTk2Nyw3LjUzNDE1YzEuMDU5OCwxLjM4ODA5LDMuNDQ5NDguMDE5NjIsMi4zNzQ3MS0xLjM4ODA3cS0yMy43MDIyNS0zMS4wNDQ0MS00Ny43MzQ5MS02MS44MzQ2NC0yNC4wOTE3Ny0zMC44NjM4My00OC41MTY0Ni02MS40NjU4Ni0yNC40MjQyMy0zMC42MDE0Mi00OS4xNzg1NC02MC45Mzc0NC02LjE2Ny03LjU1NzYtMTIuMzU0NDQtMTUuMDk4NThjLTMuNDc5NTQtNC4yNDA3Mi02LjkxOTg0LTguNTI3MTgtMTAuNzM2MjktMTIuNDc0MjYtNy4wMDUzOC03LjI0NTE2LTE1Ljc1NzcyLTEzLjY0Nzk0LTI2LjIzNDM3LTEzLjgyMTY3LTYuMTU5NzItLjEwMjE0LTEyLjEyMSwxLjg1MjQ4LTE3Ljg0NCwzLjkyMjg4LTYuMTY5NjcsMi4yMzItMTIuMzI0NTUsNC41MDU3MS0xOC40ODYzMiw2Ljc1OTRMNzgyLjExMTIzLDQ3MC4yOTIxbC05LjI5MDY4LDMuMzk4MTFjLTEuNjQ4NzQuNjAzLS45MzY1LDMuMjYxODkuNzMxMTEsMi42NTE5NVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjZTRlNGU0Ii8+PHBhdGggZD0iTTQwOS40NTI0OCwzMjQuMTU3MzNjLTE4Ljc1NDExLTkuNjM4NjYtNDIuNzcxMzctNy43NTA4Ny02MC4wMDUwNyw0LjI5MTE5QTg1NS44NDUzMiw4NTUuODQ1MzIsMCwwLDEsNDQ2LjgxOCwzNTEuMTc0MzRDNDMzLjUzNTM3LDM0My4zOTA0LDQyMy4xNDUyMSwzMzEuMTk0NzUsNDA5LjQ1MjQ4LDMyNC4xNTczM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjZjJmMmYyIi8+PHBhdGggZD0iTTM0OS4yNjI4MiwzMjguNDE1MzQsMzQ1LjY1MjQsMzMxLjM1YzEuMjIxMjMtMS4wMjcxMywyLjQ5MDgtMS45OTAxMywzLjc5NS0yLjkwMTQ0QzM0OS4zODU4LDMyOC40Mzc4OSwzNDkuMzI0NDIsMzI4LjQyNiwzNDkuMjYyODIsMzI4LjQxNTM0WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiNmMmYyZjIiLz48cGF0aCBkPSJNODc0LjYyNDM2LDQ3Ni40NzdjLTMuNjMyNzktNC40MjIwNi03LjU2MDQ2LTkuMDUyMjItMTIuOTk0MjEtMTAuODQ4MzZsLTUuMDczMDguMjAwMDlhNTc1LjQzNjI5LDU3NS40MzYyOSwwLDAsMCwxNTMuMjY3MjksMTc1LjIyMDU2UTk0Mi4yMjQzNyw1NTguNzYzMTcsODc0LjYyNDM2LDQ3Ni40NzdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2YyZjJmMiIvPjxwYXRoIGQ9Ik0xMDg2LjY2OTE1LDY5OC40NDgyYy0xMC41NjAwNiwyMS4zMy0yNy4yMywzOS45Ny00Ni4zOSw1NC4zNS0yOS4zNywyMi4wNS02NC4zMywzNS4zLTk5LjMyLDQ2LjQ4LTE5Ny42Miw2My4xNy00MTMuNDgsNjguMDUtNjEzLjc1LDEzLjg4LTU1LjQtMTQuOTgtMTExLjA4LTM1LjIyLTE1NC4xNy03My4xM2ExOTcuMzQ0NjgsMTk3LjM0NDY4LDAsMCwxLTM1Ljc0LTQxLjYxYzU3LjM1LTMxLjUyLDEyNi44Ni00My40LDE5My4xOS00MS45NSw5NS4wOSwyLjA4LDE4Ny45NiwyNy40NiwyODIuMTYsNDAuNTlhMTEwMi42NjksMTEwMi42NjksMCwwLDAsMzM0LjA0LTQuNmMzOC4zMTk5NC02LjQzLDc3Ljk4LTE0Ljg0LDExNS40OS00LjY2QTk1LjE0OTU0LDk1LjE0OTU0LDAsMCwxLDEwODYuNjY5MTUsNjk4LjQ0ODJaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzNmM2Q1NiIvPjxjaXJjbGUgY3g9IjE3OS4zMTgyOCIgY3k9IjUxIiByPSI1MSIgZmlsbD0iI2NjYyIvPjxwYXRoIGQ9Ik0zNjIuMzA4OTIsOTcuODQwNDJDMzQ4LjgxMTg1LDgzLjY4MTYsMzMzLjEzNjQzLDcwLjc2NSwzMTQuNTc5NjEsNjMuOTM5NDhhNzYuNzE1MjEsNzYuNzE1MjEsMCwwLDAtMTUuOTg2MzMtNC4wMTczNGMtLjA0Mzg4LS4wMDYtLjA4NTQ1LjAwMjg3LS4xMjkwOS0uMDAwNjdhMi4zNTU3NiwyLjM1NTc2LDAsMCwwLS4yNjk2NS0uMDUyOTIsNjEuNTM4OCw2MS41Mzg4LDAsMCwwLTIyLjg0MTMxLDEuMzc5LDYzLjEwNzM1LDYzLjEwNzM1LDAsMCwwLTEwLjYzNTE5LDMuNzA0OSw5My4wMDQ2Nyw5My4wMDQ2NywwLDAsMC05Ljk3OTQzLDUuNjU1NTdBNjQuOTA4MzIsNjQuOTA4MzIsMCwwLDEsMjMyLjY4NjMsNzguODM0OGE3NC4xODc3LDc0LjE4NzcsMCwwLDEtMTEuODQ0MDYsMS4xNjI0OGMtMy40NDcxNC4wNjkxNS02LjY5OC4xODg5LTkuOTY0LDEuNDM0MjZhMjMuOTE1NzMsMjMuOTE1NzMsMCwwLDAtMTQuNTY0OTQsMTUuNzcwNTEsMS41NTA3OCwxLjU1MDc4LDAsMCwwLC42ODkzMywxLjY5NGMuODgzNDkuNjMyNzUsMS43NDQ3NiwxLjM1MDY1LDIuNjczLDEuOTE0MzdhOC4zMzkyMiw4LjMzOTIyLDAsMCwwLDIuNjExLjcxMjA5cTIuMjEzNjYuNDY3MTEsNC40MzI5Mi45MDY5Myw4LjE3NTg0LDEuNjE5OTIsMTYuNDE5NjIsMi44Njc5MiwxNi42ODEsMi41MjUyLDMzLjU0MjE3LDMuNTU3NTVhMzczLjQ4MTMyLDM3My40ODEzMiwwLDAsMCw2Ny41MTAyNi0yLjAyOUEzNzQuNzcxNDQsMzc0Ljc3MTQ0LDAsMCwwLDM2MS42NDcsMTAwLjM0NzUsMS41MTM5LDEuNTEzOSwwLDAsMCwzNjIuMzA4OTIsOTcuODQwNDJaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2YwZjBmMCIvPjxwYXRoIGQ9Ik0yMDguNTc5NjEsMTMxLjkzOTQ4YTc2LjcxNTIxLDc2LjcxNTIxLDAsMCwwLTE1Ljk4NjMzLTQuMDE3MzRjLS4wNDM4OC0uMDA2LS4wODU0NS4wMDI4Ny0uMTI5MDktLjAwMDY3YTIuMzU1NzYsMi4zNTU3NiwwLDAsMC0uMjY5NjUtLjA1MjkyLDYxLjUzODgsNjEuNTM4OCwwLDAsMC0yMi44NDEzMSwxLjM3OSw2My4xMDczNSw2My4xMDczNSwwLDAsMC0xMC42MzUxOSwzLjcwNDksOTMuMDA0NjcsOTMuMDA0NjcsMCwwLDAtOS45Nzk0Myw1LjY1NTU3LDY0LjkwODMyLDY0LjkwODMyLDAsMCwxLTIyLjA1MjMxLDguMjI2ODEsNzQuMTg3Nyw3NC4xODc3LDAsMCwxLTExLjg0NDA2LDEuMTYyNDhjLTMuNDQ3MTQuMDY5MTUtNi42OTguMTg4OS05Ljk2NCwxLjQzNDI2YTIzLjkxNTczLDIzLjkxNTczLDAsMCwwLTE0LjU2NDk0LDE1Ljc3MDUxLDEuNTUwNzgsMS41NTA3OCwwLDAsMCwuNjg5MzMsMS42OTRjLjg4MzQ5LjYzMjc1LDEuNzQ0NzYsMS4zNTA2NSwyLjY3MywxLjkxNDM3YTguMzM5MjIsOC4zMzkyMiwwLDAsMCwyLjYxMS43MTIwOXEyLjIxMzY2LjQ2NzEyLDQuNDMyOTIuOTA2OTMsOC4xNzU4NCwxLjYxOTkyLDE2LjQxOTYyLDIuODY3OTIsMTYuNjgxLDIuNTI1MiwzMy41NDIxNywzLjU1NzU1YTM3My40ODEzMiwzNzMuNDgxMzIsMCwwLDAsNjcuNTEwMjYtMi4wMjlBMzc0Ljc3MTQ0LDM3NC43NzE0NCwwLDAsMCwyNTUuNjQ3LDE2OC4zNDc1YTEuNTEzOSwxLjUxMzksMCwwLDAsLjY2MTkzLTIuNTA3MDhDMjQyLjgxMTg1LDE1MS42ODE2LDIyNy4xMzY0MywxMzguNzY1LDIwOC41Nzk2MSwxMzEuOTM5NDhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iI2YwZjBmMCIvPjxwb2x5Z29uIHBvaW50cz0iMTA0Ny40MTEgNTg4LjE0MiAxMDc0LjU3NiA1NjcuNTE4IDEwODcuODE2IDU4MC43NTkgMTA0My41NjMgNjExLjA0MiAxMDQ3LjQxMSA1ODguMTQyIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTEwNDguOTE2MzUsNjk0LjQyNzgxSDk1NS45OTI2OWwzLjI1OTA3LTEwLjU1OTg3LDAsMGMyMC4xOTkzLTcuMzEyMjcsOC44NTMzMy0yMy4wMjk1NywyOC4wNjc1MS0zMi42MzY2Niw0Ni45OTY4LTIzLjQ5ODQsNjUuMTkxMTgtOTMuNjIwMDYsNTguMzA5MzItMTIxLjMzOTM1bDMwLjc5OC0xLjMwMjIxUzExMTguOTU4NzcsNjQ5LjM3NDc2LDEwNDguOTE2MzUsNjk0LjQyNzgxWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMyZjJlNDEiLz48cGF0aCBkPSJNMTEyOC4yNDY1Myw2NDQuNzg4ODhhMTUuNjE4OTMsMTUuNjE4OTMsMCwwLDEtMjAuMTgyNzIuMzc3NTlsLS4wNjA0LS4wNDk2MS0uMDAyMDctLjA3NzY3YTE0Ljk2NDgzLDE0Ljk2NDgzLDAsMCwwLS42LTMuODE5MzYsMTAuNjkwNzcsMTAuNjkwNzcsMCwwLDEtLjM4ODE4LDIuNjQzNjZsLS4wNzc4NC4yODk5MS0uMjA4NzMtLjIxNTQ5Yy0uMTgwMjctLjE4NTg5LS4zNTQ3NC0uMzc0NzItLjUxODU5LS41NjFhMTUuNzUwODgsMTUuNzUwODgsMCwwLDEtMi4zOTktMy42MzI2OSw0NS45MTYyMyw0NS45MTYyMywwLDAsMC0xMi43NC0xNS44Nzk3MiwyMi4yOTIzNywyMi4yOTIzNywwLDAsMS0yLjY3MjctMi41NzE3MiwyMi4wMzQxNSwyMi4wMzQxNSwwLDAsMSwyNy42Njk1NS0zMy41NjkxMWwuMTM3NjcuMDgwNi0uMDcxNDguMTQyNWExMS40Nzc1NiwxMS40Nzc1NiwwLDAsMS0yLjA0Nzg4LDIuOTU0LDE0Ljk2ODI5LDE0Ljk2ODI5LDAsMCwwLDMuMTUzOTUtMi4yNzg2NWwuMTAwMDYtLjA5NDM2LjExMzM3LjA3ODE4YTIyLjEyNzkzLDIyLjEyNzkzLDAsMCwxLDQuMDI5NCwzLjU4NjdsLjEyODQ0LjE0NzI2YTkuODM2NDMsOS44MzY0MywwLDAsMCw3LjI4Mzc1LDMuMzYxMjMsMTUuNjE0LDE1LjYxNCwwLDAsMSwxNS4xMTk0NywxOC4yOTI5MWwtLjAxNzY5LjEwMzE1LS4xMDAzNC4wMzA0YTEzLjM5ODY2LDEzLjM5ODY2LDAsMCwxLTUuNDU2OTQuNjgwODgsMTUuMjIyMDgsMTUuMjIyMDgsMCwwLDAsNC44NjA2MSwxLjIxNzRsLjIxNjU0LjAxNzE4LS4wNjg3NC4yMDYxOWExNS42MDM1LDE1LjYwMzUsMCwwLDEtNC41MDMzOSw2Ljc5bC0uMDU5MjguMDUxODctLjA2Mjk0LjA1NTA5YTE1LjMzMjksMTUuMzMyOSwwLDAsMC01LjI5NywxMC42NDI3MkExNS43MzM0NSwxNS43MzM0NSwwLDAsMSwxMTI4LjI0NjUzLDY0NC43ODg4OFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PHBhdGggZD0iTTExMzEuMDg5LDYzOS43NjkzNGExNS41NzQxOCwxNS41NzQxOCwwLDAsMS0uMTc1NiwxLjY3ODk0LDE1Ljc4NTIxLDE1Ljc4NTIxLDAsMCwwLDIuNTM3NzItNy44MjA0N2MuMDIwNzEtLjQyNjM3LjA2NTQ2LS44NTExLjEyNTQ5LTEuMjczOTNBMTQuODE0MSwxNC44MTQxLDAsMCwwLDExMzEuMDg5LDYzOS43NjkzNFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTExMzYuMDAzMzEsNjIwLjc4OWExNS4xOTgxNSwxNS4xOTgxNSwwLDAsMCwzLjg4NDE4LDEuMDk4MjIsMTUuNjMsMTUuNjMsMCwwLDAsMS40MjMyMi0xLjczNjQ3QTEzLjI0MzYzLDEzLjI0MzYzLDAsMCwxLDExMzYuMDAzMzEsNjIwLjc4OVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTExNDEuNzI3MzYsNjE1LjY2MDgyYTE1LjcwOTA3LDE1LjcwOTA3LDAsMCwxLS4xMTExMiw0LjA1MTk0LDE1LjUyOTA4LDE1LjUyOTA4LDAsMCwwLDEuNzU3NTgtMy42MjQ1NWwuMDY4NzQtLjIwNjItLjIxNjU1LS4wMTcxOEExNS4wOTQ3MiwxNS4wOTQ3MiwwLDAsMSwxMTQxLjcyNzM2LDYxNS42NjA4MloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTExNDAuMjgyNDEsNjAwLjgzOTY3YTE1LjY1MDc5LDE1LjY1MDc5LDAsMCwwLTExLjQ2MTQ5LTUuMjk5NTgsOS44MzY0OSw5LjgzNjQ5LDAsMCwxLTcuMjgzNzgtMy4zNjEyNGwtLjEyODQzLS4xNDcyNmEyMi4xMjc4NSwyMi4xMjc4NSwwLDAsMC00LjAyOTM5LTMuNTg2NjlsLS4xMTMzOC0uMDc4MTctLjEwMDA1LjA5NDM0YTE0Ljk2NzYsMTQuOTY3NiwwLDAsMS0zLjE1NCwyLjI3ODY1LDExLjQ3ODMyLDExLjQ3ODMyLDAsMCwwLDIuMDQ3OTQtMi45NTRsLjA3MTQ2LS4xNDI1LS4xMzc2Ni0uMDgwNTlhMjIuMDE3NzcsMjIuMDE3NzcsMCwwLDAtMzIuNjIxMTMsMTQuMjU0MiwyMi4wMjE4MiwyMi4wMjE4MiwwLDAsMSwzMC4yNTktOC4xMTI2OGwuMTM3NjUuMDgwNTktLjA3MTQ1LjE0MjVhMTEuNDc4MTQsMTEuNDc4MTQsMCwwLDEtMi4wNDc5NCwyLjk1NCwxNC45Njc1NCwxNC45Njc1NCwwLDAsMCwzLjE1NC0yLjI3ODY1bC4xMDAwNi0uMDk0MzQuMTEzMzguMDc4MTdhMjIuMTI4NTcsMjIuMTI4NTcsMCwwLDEsNC4wMjkzOSwzLjU4NjdsLjEyODQzLjE0NzI1YTkuODM2NDMsOS44MzY0MywwLDAsMCw3LjI4Mzc3LDMuMzYxMjQsMTUuNjE2NzUsMTUuNjE2NzUsMCwwLDEsMTUuMTAzNDcsMTIuODM0ODgsMTguOTI3MTQsMTguOTI3MTQsMCwwLDAsMi4yNjAwNS0uNTVsLjEwMDM0LS4wMzAzOS4wMTc3Ni0uMTAzMTRBMTUuNTU0LDE1LjU1NCwwLDAsMCwxMTQwLjI4MjQxLDYwMC44Mzk2N1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTExNzMuMTU5MTMsNTM2LjU0MDY1YTUwLjI5MTQxLDUwLjI5MTQxLDAsMCwxLTQyLjAwNyw0OS41OTk2NWwtLjI0ODQuMDQwNTMtLjE5MjE5LS4xNjAxNmE0OC4xODU2NSw0OC4xODU2NSwwLDAsMC0xMC41MTAwOC02LjY3MTU5LDM0LjQyMzE2LDM0LjQyMzE2LDAsMCwxLDUuNTY2Miw2LjU2MDQ3bC41MzUzNy44MDQ2OS0uOTY0ODUuMDQ2NDFjLS44MzI4LjA0MDUzLTEuNjYwMzguMDYwOC0yLjQ1OTE5LjA2MDhhNTAuNzE1NTQsNTAuNzE1NTQsMCwwLDEtMTMuODg0NDUtMS45MjUxM2MtMjAuNTE3NDgtNS44Mzc0OC00Mi41NTAyMi02LjgzNTY3LTY1LjQ4NTcxLTIuOTY3MTFhNzEuNzc4NTYsNzEuNzc4NTYsMCwwLDEtMTEuOTAxNDcuOTkzQTcwLjk0Nzg3LDcwLjk0Nzg3LDAsMCwxLDEwMDkuMjg3LDQ0NC42MzcyM2wuNDg3NjUtLjE2MTQ2LjE5MjUxLjQ3NTg5YTM2Ljk1NjU5LDM2Ljk1NjU5LDAsMCwxLDIuNzg3LDExLjIzMzA2LDQ4LjE5NjM1LDQ4LjE5NjM1LDAsMCwwLDEuMTk3ODktMTIuNDcxMTZsLS4wMTUzNi0uNDQyNTUuNDMwMTMtLjEwNzg2YTcxLjI0OTM5LDcxLjI0OTM5LDAsMCwxLDE3LjI0MDUxLTIuMTE0N2wuNjI5MTguMDAyNjJhMzEuNjcyMjgsMzEuNjcyMjgsMCwwLDAsMjMuNjE2LTEwLjQ2MjM3LDUwLjI3NTY4LDUwLjI3NTY4LDAsMCwxLDc2LjM4MDE2LDIuMzQ2MTFsLjIxMTguMjYyMTMtLjEzOTkuMzA3MjNjLTIuOTM3NjksNi40NzQ4NC02LjEzODE4LDExLjE5MTg5LTkuOTU4MzYsMTQuNjQxNDNhNDkuMDEzNDMsNDkuMDEzNDMsMCwwLDAsMTMuMjc5NzgtOS4xNjI4MmwuNTAyLS40ODcuMzUyMzQuNjA0NjZBNTAuMjQyMTQsNTAuMjQyMTQsMCwwLDEsMTE0My4zMiw0NjQuNDI3OGwtLjAwMDY1LjI1MzYzYy0uMDAwNjUuMDg5NTYtLjAwMDY1LjE3OTc3LS4wMDA2NS4yNjkzMiwwLDEzLjYxMzE3LDUuMjY0MTksMjYuNTE1NzcsMTQuNDY2ODksMzUuNDM5MzRBNTAuNjYwMjEsNTAuNjYwMjEsMCwwLDEsMTE3My4xNTkxMyw1MzYuNTQwNjVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzNmM2Q1NiIvPjxnIG9wYWNpdHk9IjAuMTUiPjxwYXRoIGQ9Ik0xMTExLjY4ODY4LDQxNy43MTcxM2EzNS41MTksMzUuNTE5LDAsMCwxLTYuMzM1MDksNy43NzE1OSw0OC44ODkyOSw0OC44ODkyOSwwLDAsMCw5Ljg5ODIzLTYuMTg2NVExMTEzLjUwMjI4LDQxOC40NDAzOCwxMTExLjY4ODY4LDQxNy43MTcxM1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PHBhdGggZD0iTTExNDAuNzkyOTMsNDc3LjczMzIzYTUwLjQ4MTkxLDUwLjQ4MTkxLDAsMCwxLDcuMjI5ODEsOC44MDc3NSw1MS4zOTI4OCw1MS4zOTI4OCwwLDAsMS00LjcwNDA1LTIxLjU5MDIyYzAtLjA4OTU3LDAtLjE3OTc4LjAwMDY1LS4yNjkzMmwuMDAwNjQtLjI1MzY0YTUwLjI0MjQ1LDUwLjI0MjQ1LDAsMCwwLTYuODM5NTYtMjUuMzI3MzVsLS4zNTIzNS0uNjA0NjgtLjUwMjA3LjQ4N2E0OS4xMjYxNiw0OS4xMjYxNiwwLDAsMS05LjE3MDQzLDYuOTgzQTQ4Ljk3MTg1LDQ4Ljk3MTg1LDAsMCwwLDExNDAuNzkyOTMsNDc3LjczMzIzWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiLz48cGF0aCBkPSJNMTEyNi4zMjczMyw0NDEuNzcwOTNsLS4wMDA2NS4yNTM2NGMtLjAwMDY0LjA4OTU0LS4wMDA2NC4xNzk3NS0uMDAwNjQuMjY5MzEsMCwuNDkzNTUuMDA4OTQuOTg1ODUuMDIyNzIsMS40NzczOWE1Mi4zNjQ4LDUyLjM2NDgsMCwwLDAsNS45NTU4Ny0xMC4yNjcwOWwuMTM5ODUtLjMwNzI1LS4yMTE3Ni0uMjYyMTJhNTAuNjg4MTEsNTAuNjg4MTEsMCwwLDAtOS4wOTYtOC43OTczM0E1MC4zNTYyMSw1MC4zNTYyMSwwLDAsMSwxMTI2LjMyNzMzLDQ0MS43NzA5M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PHBhdGggZD0iTTExNTcuNzg1NTksNTAwLjM5MDFhNDUuNDU5MzQsNDUuNDU5MzQsMCwwLDEtNi40MDgzOC03Ljc5NjY2LDUwLjIyOTcsNTAuMjI5NywwLDAsMS0zNy4yMTc3Miw3MC44OWwtLjI0ODQxLjA0MDU0LS4xOTIxNy0uMTYwMTZhNDguMTg4LDQ4LjE4OCwwLDAsMC0xMC41MTAxLTYuNjcxNTksMzQuNDIyNjIsMzQuNDIyNjIsMCwwLDEsNS41NjYxNyw2LjU2MDQ2bC41MzU0LjgwNDcxLS45NjQ4Mi4wNDY0Yy0uODMyODYuMDQwNTQtMS42NjA0MS4wNjA4LTIuNDU5Mi4wNjA4YTUwLjcxNTQ5LDUwLjcxNTQ5LDAsMCwxLTEzLjg4NDQ4LTEuOTI1MTRjLTIwLjUxNzQ5LTUuODM3NDctNDIuNTUwMjItNi44MzU2Ni02NS40ODU3LTIuOTY3MWE3MS43NzkzLDcxLjc3OTMsMCwwLDEtMTEuOTAxNDUuOTkzLDcwLjYyMzg5LDcwLjYyMzg5LDAsMCwxLTQ3LjEyLTE3Ljk2OSw3MS4wMTExOCw3MS4wMTExOCwwLDAsMCw2NC4xMTI3LDQwLjYyNTksNzEuNzc5NDcsNzEuNzc5NDcsMCwwLDAsMTEuOTAxNDUtLjk5Mjk0YzIyLjkzNTQ3LTMuODY4NTcsNDQuOTY4MjEtMi44NzAzNyw2NS40ODU3LDIuOTY3MDlhNTAuNzE1NDMsNTAuNzE1NDMsMCwwLDAsMTMuODg0NDgsMS45MjUxNGMuNzk4NzgsMCwxLjYyNjM0LS4wMjAyNiwyLjQ1OTE5LS4wNjA4bC45NjQ4My0uMDQ2NC0uNTM1NC0uODA0NzFhMzQuNDIyNjMsMzQuNDIyNjMsMCwwLDAtNS41NjYxOC02LjU2MDQ1LDQ4LjE4Nzc0LDQ4LjE4Nzc0LDAsMCwxLDEwLjUxMDExLDYuNjcxNTlsLjE5MjE3LjE2MDE2LjI0ODQxLS4wNDA1NWE1MC4yNTM5Miw1MC4yNTM5MiwwLDAsMCwyNi42MzM0NC04NS43NTAxOVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PC9nPjxwb2x5Z29uIHBvaW50cz0iMTM0LjAzNSA1NjAuOTczIDk3LjIyMyA1MzMuMDI1IDc5LjI4IDU1MC45NjggMTM5LjI1IDU5Mi4wMDcgMTM0LjAzNSA1NjAuOTczIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTE5NS4yMSw2ODcuNDI3ODFoMTI1LjkyNjZMMzE2LjcyLDY3My4xMTc0N2wwLDBjLTI3LjM3MzMyLTkuOTA5My0xMS45OTc2OS0zMS4yMDg3OS0zOC4wMzYtNDQuMjI4LTYzLjY4ODI3LTMxLjg0NDE0LTg4LjM0NDYtMTI2Ljg3MDM1LTc5LjAxODU2LTE2NC40MzQ0N2wtNDEuNzM2MjUtMS43NjQ3MVMxMDAuMjkxMTMsNjI2LjM3MzY0LDE5NS4yMSw2ODcuNDI3ODFaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik04MC41NTM2NSw2MDUuMjUyMTlhMjAuNzc4NiwyMC43Nzg2LDAsMCwwLTcuMTc4MzMtMTQuNDIyNjFjLS4wMjgzLS4wMjQ4OS0uMDU2ODEtLjA1LS4wODUyOS0uMDc0NjVsLS4wODAzNC0uMDcwM2EyMS4xNDUzOSwyMS4xNDUzOSwwLDAsMS02LjEwMjgzLTkuMjAxNDhsLS4wOTMxNS0uMjc5NDIuMjkzNDUtLjAyMzI5YTIwLjYyODMsMjAuNjI4MywwLDAsMCw2LjU4NjkxLTEuNjQ5NzcsMTguMTU3MjYsMTguMTU3MjYsMCwwLDEtNy4zOTUtLjkyMjdsLS4xMzYtLjA0MTItLjAyNC0uMTM5NzlhMjEuMTU5NTMsMjEuMTU5NTMsMCwwLDEsMjAuNDg5MzItMjQuNzg5ODUsMTMuMzI5ODcsMTMuMzI5ODcsMCwwLDAsOS44NzA2Ni00LjU1NWwuMTc0MDYtLjE5OTU2YTI5Ljk4NjgsMjkuOTg2OCwwLDAsMSw1LjQ2MDQ5LTQuODYwNTVsLjE1MzY0LS4xMDYuMTM1NTkuMTI3ODZhMjAuMjg0NSwyMC4yODQ1LDAsMCwwLDQuMjc0MTEsMy4wODgsMTUuNTU0LDE1LjU1NCwwLDAsMS0yLjc3NTE5LTQuMDAzMTJsLS4wOTY4OC0uMTkzMTIuMTg2NTctLjEwOTIzQTI5Ljg1OTg0LDI5Ljg1OTg0LDAsMCwxLDE0MS43MDgxOCw1ODguMzE4YTMwLjIwOSwzMC4yMDksMCwwLDEtMy42MjE5NSwzLjQ4NTExLDYyLjIyNCw2Mi4yMjQsMCwwLDAtMTcuMjY0ODMsMjEuNTE5NTksMjEuMzQ0NDcsMjEuMzQ0NDcsMCwwLDEtMy4yNTEsNC45MjI4OWMtLjIyMi4yNTI0NC0uNDU4NDguNTA4MzQtLjcwMjc3Ljc2MDI2bC0uMjgyODYuMjkyLS4xMDU0OS0uMzkyODdhMTQuNDg3NDIsMTQuNDg3NDIsMCwwLDEtLjUyNi0zLjU4MjU5LDIwLjI3OTYxLDIwLjI3OTYxLDAsMCwwLS44MTMsNS4xNzU4NWwtLjAwMjgxLjEwNTI1LS4wODE4NS4wNjcyNGEyMS4xNTAzNywyMS4xNTAzNywwLDAsMS0zNC41MDE5Mi0xNS40MTg1M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PHBhdGggZD0iTTgzLjg1MjY2LDYxMy4zNTY3M2EyMS4xMDM3NCwyMS4xMDM3NCwwLDAsMCwuMjM4LDIuMjc1MjQsMjEuMzkxNTYsMjEuMzkxNTYsMCwwLDEtMy40MzktMTAuNTk4Yy0uMDI4MDYtLjU3NzgxLS4wODg3MS0xLjE1MzM5LS4xNzAwNi0xLjcyNjM5QTIwLjA3NTYyLDIwLjA3NTYyLDAsMCwxLDgzLjg1MjY2LDYxMy4zNTY3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTc3LjE5Myw1ODcuNjM1MjRhMjAuNTk2ODEsMjAuNTk2ODEsMCwwLDEtNS4yNjM3LDEuNDg4MjYsMjEuMTgwMjksMjEuMTgwMjksMCwwLDEtMS45Mjg2OC0yLjM1MzJBMTcuOTQ3MzEsMTcuOTQ3MzEsMCwwLDAsNzcuMTkzLDU4Ny42MzUyNFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTY5LjQzNiw1ODAuNjg1NzlhMjEuMjg4OTMsMjEuMjg4OTMsMCwwLDAsLjE1MDYsNS40OTEsMjEuMDQzODksMjEuMDQzODksMCwwLDEtMi4zODE4LTQuOTExODZsLS4wOTMxNi0uMjc5NDMuMjkzNDYtLjAyMzI5QTIwLjQ1MTcsMjAuNDUxNywwLDAsMCw2OS40MzYsNTgwLjY4NTc5WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIG9wYWNpdHk9IjAuMTUiLz48cGF0aCBkPSJNNzEuMzk0MTUsNTYwLjYwMDczYTIxLjIwOTMxLDIxLjIwOTMxLDAsMCwxLDE1LjUzMjE4LTcuMTgxNzksMTMuMzMsMTMuMzMsMCwwLDAsOS44NzA2OS00LjU1NWwuMTc0LS4xOTk1NWEyOS45ODcxNywyOS45ODcxNywwLDAsMSw1LjQ2MDQ4LTQuODYwNTZsLjE1MzY0LS4xMDU5My4xMzU1OS4xMjc4NWEyMC4yODM3NywyMC4yODM3NywwLDAsMCw0LjI3NDE1LDMuMDg3OTQsMTUuNTU0NzQsMTUuNTU0NzQsMCwwLDEtMi43NzUyOS00LjAwMzEybC0uMDk2ODMtLjE5MzEyLjE4NjU1LS4xMDkyMUEyOS44Mzc2NCwyOS44Mzc2NCwwLDAsMSwxNDguNTE2MjcsNTYxLjkyNWEyOS44NDMxNSwyOS44NDMxNSwwLDAsMC00MS4wMDU4NS0xMC45OTRsLS4xODY1NS4xMDkyMS4wOTY4My4xOTMxMWExNS41NTQ4LDE1LjU1NDgsMCwwLDAsMi43NzUyOSw0LjAwMzEzLDIwLjI4NDEyLDIwLjI4NDEyLDAsMCwxLTQuMjc0MTUtMy4wODc5NGwtLjEzNTU5LS4xMjc4Ni0uMTUzNjQuMTA1OTRhMjkuOTg3MTEsMjkuOTg3MTEsMCwwLDAtNS40NjA0OCw0Ljg2MDU1bC0uMTc0LjE5OTU2YTEzLjMzLDEzLjMzLDAsMCwxLTkuODcwNjksNC41NTVBMjEuMTYzMTYsMjEuMTYzMTYsMCwwLDAsNjkuNjU5NzUsNTc5LjEzNWEyNS42NDg0NSwyNS42NDg0NSwwLDAsMS0zLjA2MjczLS43NDUyOWwtLjEzNi0uMDQxMTgtLjAyNDA3LS4xMzk3OEEyMS4wNzgyNCwyMS4wNzgyNCwwLDAsMSw3MS4zOTQxNSw1NjAuNjAwNzNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgb3BhY2l0eT0iMC4xNSIvPjxwYXRoIGQ9Ik00Ny42NzQ1NCw0MjQuNDc1MjljMTIuNDcxMTQtMTIuMDkyODksMTkuNjA1LTI5LjU3OCwxOS42MDUtNDguMDI2LDAtLjEyMTM2LDAtLjI0MzYxLS4wMDA4OS0uMzY1bC0uMDAwODgtLjM0MzcyYTY4LjA4NjExLDY4LjA4NjExLDAsMCwxLDkuMjY4NzYtMzQuMzIyNjZsLjQ3NzQ4LS44MTk0Mi42ODAzNC42NmE2Ni40MjEyMiw2Ni40MjEyMiwwLDAsMCwxNy45OTYyNSwxMi40MTcxMWMtNS4xNzctNC42NzQ2OS05LjUxNDE0LTExLjA2NzA2LTEzLjQ5NTItMTkuODQxNWwtLjE4OTU3LS40MTYzNi4yODctLjM1NTIzYTY4LjEzMTY4LDY4LjEzMTY4LDAsMCwxLDEwMy41MDc0OS0zLjE3OTM1LDQyLjkyMTEsNDIuOTIxMSwwLDAsMCwzMi4wMDM0OCwxNC4xNzgybC44NTI2NC0uMDAzNTVhOTYuNTU0NjcsOTYuNTU0NjcsMCwwLDEsMjMuMzYzNjksMi44NjU3NmwuNTgyODkuMTQ2MTctLjAyMDgxLjU5OTczYTY1LjMxMzA3LDY1LjMxMzA3LDAsMCwwLDEuNjIzMzQsMTYuOTAwNDQsNTAuMDgyMjcsNTAuMDgyMjcsMCwwLDEsMy43NzY4Ni0xNS4yMjI2MmwuMjYwODktLjY0NDkxLjY2MDg1LjIxODgxYTk2LjE0NTg1LDk2LjE0NTg1LDAsMCwxLTMwLjI0NzcxLDE4Ny4zOTg0OEE5Ny4yNzE5Miw5Ny4yNzE5MiwwLDAsMSwyMDIuNTM4LDUzNC45NzRjLTMxLjA4MTMtNS4yNDI1My02MC45MzkyMy0zLjg4OTgyLTg4Ljc0Mzc0LDQuMDIwOTJhNjguNzI3ODcsNjguNzI3ODcsMCwwLDEtMTguODE1NjcsMi42MDg4NmMtMS4wODI1MiwwLTIuMjA0LS4wMjc0Ny0zLjMzMjYxLS4wODIzOWwtMS4zMDc1My0uMDYyOUw5MS4wNjQsNTQwLjM2OGE0Ni42NDk2OCw0Ni42NDk2OCwwLDAsMSw3LjU0MzEtOC44OTA1LDY1LjI5OTgxLDY1LjI5OTgxLDAsMCwwLTE0LjI0Mjg2LDkuMDQxMWwtLjI2MDQ1LjIxNy0uMzM2NjItLjA1NDkyQTY4LjEwMjE5LDY4LjEwMjE5LDAsMCwxLDQ3LjY3NDU0LDQyNC40NzUyOVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PGcgb3BhY2l0eT0iMC4xNSI+PHBhdGggZD0iTTExMC4xNDMyOCwzMTIuNDRhNDguMTM0MzgsNDguMTM0MzgsMCwwLDAsOC41ODUwOCwxMC41MzE3Niw2Ni4yNTI4Myw2Ni4yNTI4MywwLDAsMS0xMy40MTM3LTguMzgzNzFRMTA3LjY4NTU2LDMxMy40MjAxNiwxMTAuMTQzMjgsMzEyLjQ0WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiLz48cGF0aCBkPSJNNzAuNzAyMzEsMzkzLjc3MTU3YTY4LjQxMSw2OC40MTEsMCwwLDAtOS43OTc1NiwxMS45MzU5Miw2OS42NDU3Nyw2OS42NDU3NywwLDAsMCw2LjM3NDc1LTI5LjI1ODI1YzAtLjEyMTM3LDAtLjI0MzYyLS4wMDA4OC0uMzY1bC0uMDAwODctLjM0MzcyYTY4LjA4NjYxLDY4LjA4NjYxLDAsMCwxLDkuMjY4NzEtMzQuMzIyNjZsLjQ3NzUtLjgxOTQ0LjY4MDM5LjY2YTY2LjU3MzgsNjYuNTczOCwwLDAsMCwxMi40Mjc0MSw5LjQ2MzA1Qzg4Ljk3MTk0LDM2Ny4zMTA0OSw4Mi4wNDYsMzgyLjc3MTg5LDcwLjcwMjMxLDM5My43NzE1N1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PHBhdGggZD0iTTkwLjMwNTU1LDM0NS4wMzY4M2wuMDAwODcuMzQzNzJjLjAwMDg4LjEyMTM0LjAwMDg4LjI0MzU5LjAwMDg4LjM2NSwwLC42Njg4NC0uMDEyMTIsMS4zMzYtLjAzMDgsMi4wMDIxQTcwLjk2MjQsNzAuOTYyNCwwLDAsMSw4Mi4yMDUzNCwzMzMuODM0bC0uMTg5NTMtLjQxNjM3LjI4Ny0uMzU1MjJhNjguNjkwNDQsNjguNjkwNDQsMCwwLDEsMTIuMzI2NTktMTEuOTIxODFBNjguMjQwODYsNjguMjQwODYsMCwwLDAsOTAuMzA1NTUsMzQ1LjAzNjgzWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiLz48cGF0aCBkPSJNNDcuNjc0NTEsNDI0LjQ3NTNhNjEuNjA1MjUsNjEuNjA1MjUsMCwwLDAsOC42ODQ0LTEwLjU2NTc1LDY4LjA2OTM4LDY4LjA2OTM4LDAsMCwwLDUwLjQzNiw5Ni4wNjc0MWwuMzM2NjQuMDU0OTQuMjYwNDItLjIxN2E2NS4zMDI1Myw2NS4zMDI1MywwLDAsMSwxNC4yNDI4OS05LjA0MTA4LDQ2LjY0NzY3LDQ2LjY0NzY3LDAsMCwwLTcuNTQzMDYsOC44OTA0N2wtLjcyNTU2LDEuMDkwNTIsMS4zMDc1LjA2Mjg3YzEuMTI4NjUuMDU0OTQsMi4yNTAxMi4wODIzOSwzLjMzMjYxLjA4MjM5YTY4LjcyNzYyLDY4LjcyNzYyLDAsMCwwLDE4LjgxNTcyLTIuNjA4ODZjMjcuODA0NTEtNy45MTA3Miw1Ny42NjI0NC05LjI2MzQ0LDg4Ljc0MzcyLTQuMDIwOWE5Ny4yNzI2Miw5Ny4yNzI2MiwwLDAsMCwxNi4xMjgzOSwxLjM0NTYsOTUuNzA2OSw5NS43MDY5LDAsMCwwLDYzLjg1NTMtMjQuMzUwOTQsOTYuMjMxNjUsOTYuMjMxNjUsMCwwLDEtODYuODgzMDksNTUuMDU0NjdBOTcuMjcyNDUsOTcuMjcyNDUsMCwwLDEsMjAyLjUzOCw1MzQuOTc0Yy0zMS4wODEyOS01LjI0MjU0LTYwLjkzOTIyLTMuODg5ODItODguNzQzNzMsNC4wMjA5YTY4LjcyNzYzLDY4LjcyNzYzLDAsMCwxLTE4LjgxNTcyLDIuNjA4ODdjLTEuMDgyNDksMC0yLjIwNC0uMDI3NDYtMy4zMzI2MS0uMDgyNGwtMS4zMDc0OS0uMDYyODdMOTEuMDY0LDU0MC4zNjhhNDYuNjQ4MzQsNDYuNjQ4MzQsMCwwLDEsNy41NDMwNi04Ljg5MDQ3LDY1LjMwMjUzLDY1LjMwMjUzLDAsMCwwLTE0LjI0Mjg5LDkuMDQxMDhsLS4yNjA0Mi4yMTctLjMzNjYzLS4wNTQ5NEE2OC4xMDIxOSw2OC4xMDIxOSwwLDAsMSw0Ny42NzQ1MSw0MjQuNDc1M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIi8+PC9nPjxjaXJjbGUgY3g9IjQ2MC4zMTgyOCIgY3k9IjE4NSIgcj0iNSIgZmlsbD0iI2ZmZiIvPjxjaXJjbGUgY3g9IjgzNC4zMTgyOCIgY3k9IjMwNSIgcj0iMyIgZmlsbD0iI2ZmZiIvPjxjaXJjbGUgY3g9Ijg5Mi4zMTgyOCIgY3k9IjE3MCIgcj0iMyIgZmlsbD0iI2ZmZiIvPjxjaXJjbGUgY3g9IjM1NS4zMTgyOCIgY3k9IjgwIiByPSIzIiBmaWxsPSIjZmZmIi8+PGNpcmNsZSBjeD0iMzI1LjMxODI4IiBjeT0iMjAxIiByPSIzIiBmaWxsPSIjZmZmIi8+PGNpcmNsZSBjeD0iMTc5LjMxODI4IiBjeT0iMTcwIiByPSIzIiBmaWxsPSIjZmZmIi8+PGNpcmNsZSBjeD0iNjk2LjMxODI4IiBjeT0iMTk1IiByPSIzIiBmaWxsPSIjZmZmIi8+PGNpcmNsZSBjeD0iMTAwMy4zMTgyOCIgY3k9Ijk4IiByPSIzIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTMyOC45NTkyOSw0MTMuNTYzMjdjLTMuNzk5NTgtNy4wMzUtNC4zMy0xNi4yNTUzNy4zMzUzMS0yMi43NDg1OWEzNi44Mzg0MywzNi44Mzg0MywwLDAsMCwxNC42NzUwNywyMC41OTkzYzIuNzcxODEsMS44ODcxOSw2LjA1MTI0LDMuNjk3NTgsNi45OTk0Nyw2LjkxNGE4LjIzNDg4LDguMjM0ODgsMCwwLDEtLjg1ODY0LDYuMDQ0NDUsMjQuNDU3MSwyNC40NTcxLDAsMCwxLTMuNzk1MDUsNC45NTQ5NGwtLjEzNDMzLjUwMzI1QzMzOS4zMDI2OCw0MjUuNzU0NDMsMzMyLjc1ODg2LDQyMC41OTgyOSwzMjguOTU5MjksNDEzLjU2MzI3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMzZjNkNTYiLz48cGF0aCBkPSJNOTEwLjk1OTI5LDYxMi41NjMyN2MtMy43OTk1OC03LjAzNS00LjMzLTE2LjI1NTM3LjMzNTMxLTIyLjc0ODU5YTM2LjgzODQzLDM2LjgzODQzLDAsMCwwLDE0LjY3NTA3LDIwLjU5OTNjMi43NzE4MSwxLjg4NzE5LDYuMDUxMjQsMy42OTc1OCw2Ljk5OTQ3LDYuOTE0YTguMjM0ODgsOC4yMzQ4OCwwLDAsMS0uODU4NjQsNi4wNDQ0NSwyNC40NTcxLDI0LjQ1NzEsMCwwLDEtMy43OTUsNC45NTQ5NGwtLjEzNDMzLjUwMzI1QzkyMS4zMDI2OCw2MjQuNzU0NDMsOTE0Ljc1ODg2LDYxOS41OTgyOSw5MTAuOTU5MjksNjEyLjU2MzI3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMzZjNkNTYiLz48cGF0aCBkPSJNNTkxLjk1OTI5LDQ0OS41NjMyN2MtMy43OTk1OC03LjAzNS00LjMzLTE2LjI1NTM3LjMzNTMxLTIyLjc0ODU5YTM2LjgzODQzLDM2LjgzODQzLDAsMCwwLDE0LjY3NTA3LDIwLjU5OTNjMi43NzE4MSwxLjg4NzE5LDYuMDUxMjQsMy42OTc1OCw2Ljk5OTQ3LDYuOTE0YTguMjM0ODgsOC4yMzQ4OCwwLDAsMS0uODU4NjQsNi4wNDQ0NSwyNC40NTcxLDI0LjQ1NzEsMCwwLDEtMy43OTUsNC45NTQ5NGwtLjEzNDMzLjUwMzI1QzYwMi4zMDI2OCw0NjEuNzU0NDMsNTk1Ljc1ODg2LDQ1Ni41OTgyOSw1OTEuOTU5MjksNDQ5LjU2MzI3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMzZjNkNTYiLz48cGF0aCBkPSJNMjg3Ljk1OTI5LDU2NS41NjMyN2MtMy43OTk1OC03LjAzNS00LjMzLTE2LjI1NTM3LjMzNTMxLTIyLjc0ODU5YTM2LjgzODQzLDM2LjgzODQzLDAsMCwwLDE0LjY3NTA3LDIwLjU5OTNjMi43NzE4MSwxLjg4NzE5LDYuMDUxMjQsMy42OTc1OCw2Ljk5OTQ3LDYuOTE0YTguMjM0ODgsOC4yMzQ4OCwwLDAsMS0uODU4NjQsNi4wNDQ0NSwyNC40NTcxLDI0LjQ1NzEsMCwwLDEtMy43OTUwNSw0Ljk1NDk0bC0uMTM0MzMuNTAzMjVDMjk4LjMwMjY4LDU3Ny43NTQ0MywyOTEuNzU4ODYsNTcyLjU5ODI5LDI4Ny45NTkyOSw1NjUuNTYzMjdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzNmM2Q1NiIvPjxwYXRoIGQ9Ik0yNDkuOTU5MjksNjUxLjU2MzI3Yy0zLjc5OTU4LTcuMDM1LTQuMzMtMTYuMjU1MzcuMzM1MzEtMjIuNzQ4NTlhMzYuODM4NDMsMzYuODM4NDMsMCwwLDAsMTQuNjc1MDcsMjAuNTk5M2MyLjc3MTgxLDEuODg3MTksNi4wNTEyNCwzLjY5NzU4LDYuOTk5NDcsNi45MTRhOC4yMzQ4OCw4LjIzNDg4LDAsMCwxLS44NTg2NCw2LjA0NDQ1LDI0LjQ1NzEsMjQuNDU3MSwwLDAsMS0zLjc5NTA1LDQuOTU0OTRsLS4xMzQzMy41MDMyNUMyNjAuMzAyNjgsNjYzLjc1NDQzLDI1My43NTg4Niw2NTguNTk4MjksMjQ5Ljk1OTI5LDY1MS41NjMyN1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PHJlY3QgeD0iODQzLjMxODI4IiB5PSI2OCIgd2lkdGg9IjExIiBoZWlnaHQ9IjU4OSIgZmlsbD0iIzNmM2Q1NiIvPjxyZWN0IHg9IjgxMy4zMTgyOCIgeT0iMjAiIHdpZHRoPSI3MiIgaGVpZ2h0PSI3MiIgcng9IjM1Ljk5OTk2IiBmaWxsPSIjZmY2NTgyIi8+PHBhdGggZD0iTTQxOC42NDI2Myw0MjQuMTM4NWMwLDExLjQ3NzcxLDEyLjUxNTcyLDIxLjY3ODIzLDIzLjk5MzQ0LDIxLjY3ODIzczE3LjU3MS0xMC4yMDA1MiwxNy41NzEtMjEuNjc4MjNhMjAuNzgyMjQsMjAuNzgyMjQsMCwwLDAtNDEuNTY0NDgsMFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjMmYyZTQxIi8+PHBvbHlnb24gcG9pbnRzPSIzOTguNDcxIDQ4NC40ODkgNDM3LjA2NyA0ODMuMDA1IDQzOS4yOTQgNDQyLjkyNSAzOTQuNzYgNDQyLjkyNSAzOTguNDcxIDQ4NC40ODkiIGZpbGw9IiNmZmI4YjgiLz48cGF0aCBkPSJNNDAwLjgxMzY0LDU2MS40OTI4YTYuMTgyMzEsNi4xODIzMSwwLDAsMC0uMzY0OTQtOS40NzI4bDcuMDA3MzktMjAuODIyMzUtMTEuMDM3NzUsMi45MTctNC45NjIxMywxOS4zMjYwNWE2LjIxNTgxLDYuMjE1ODEsMCwwLDAsOS4zNTc0Myw4LjA1MjE1WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiNmZmI2YjYiLz48Y2lyY2xlIGN4PSI0MTUuNzU4MzUiIGN5PSIzODEuNjI0NzgiIHI9IjE0LjY5ODA0IiBmaWxsPSIjZmZiOGI4Ii8+PHBhdGggZD0iTTQ0Mi45NjA0Nyw0MjkuNjQzNzlsLTEwLjczMjUzLS4yODQyNmExLjUwNCwxLjUwNCwwLDAsMS0xLjI4MDE0LS43ODczOGwtMy41ODc4Ny02LjY1NTE0YTEuNDk3ODMsMS40OTc4MywwLDAsMSwuMzk1NjMtMS44OTEzOEw0NDEuNzk4MTgsNDA5LjA0N2ExLjQ5Njc5LDEuNDk2NzksMCwwLDEsMS4yNTYxOC0uMjgwMzdsMTEuMzQxODQsMi41ODQyMmExLjQ5OSwxLjQ5OSwwLDAsMSwxLjEwNjYsMS4wNDMxNGw0LjQ0MTMsMTUuMjk0OTJhMS40OTkzNSwxLjQ5OTM1LDAsMCwxLTEuNTEzODksMS45MTZsLTUuNTYwMi0uMjc3NzlhMS41MDcyNCwxLjUwNzI0LDAsMCwxLTEuMzQ3NDctMS4wMjc2bC0uMjMwNTItLjY5ODY3YS4xNzM0Mi4xNzM0MiwwLDAsMC0uMzM4LjA1NDM5LDEuNDk5NzQsMS40OTk3NCwwLDAsMS0xLjU3MzQ2LDEuNDk3N2wtMS44NDA4OC0uMDkxOTRhMS40OTU0LDEuNDk1NCwwLDAsMS0xLjM5Ni0xLjIwNWwtLjc5Mzg1LTMuOTkyNTZhLjE3MzIuMTczMiwwLDAsMC0uMzQxODguMDEzNTlsLS41MTg2Niw0LjQ0MmExLjQ5MiwxLjQ5MiwwLDAsMS0xLjQ4NzM0LDEuMzI1NDZaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik00MzIuMjUxNSw0NDkuNTgwNzlsMTkuMDAzMjMuMjUzMzEsNi4xODQ4MSw3Ljg1MzQ2LDkuOTU2ODQsMi4zNDgxLDIuNTg3OCwxNC45NTQyN2MxLjI5Mzc1LDcuNDc2MjQtLjA3OTc5LDEyLjIxMDg5LTMuODgwNzYsMTguNzc3NTFsMCwwLS40NTUyMiwxMi45MTc3MS41MDMuOTE0MjZhMi4wOTM2NCwyLjA5MzY0LDAsMCwxLS42MzExOSwyLjcyMjY3aDBhNC4yNzcyNiw0LjI3NzI2LDAsMCwxLC4xMTc1MiwyLjgxNDkxbC0uMjQ1MjguODEwNDZzLS43MDc4Myw1LjY2MjYxLTQwLjgzMjM5LS4yOTI5M2EzLjk1NjMyLDMuOTU2MzIsMCwwLDEtMy4zNDM0NS0zLjM5ODZoMGEyLjk1NDA2LDIuOTU0MDYsMCwwLDEtLjU0Ny0zLjQwMzhsLjA4MTc1LS4xNjM0OC0uNDEyLS40ODUyOWEzLjE3NywzLjE3NywwLDAsMS0uMTYwOC0zLjkwNjU5aDBsLTUuNzY2NTItNDEuMjUyMTcsMTEuOTExOTItMy43MVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTQxOS4xNjg2Miw0NjQuOTkyODhsLTQuNzU2ODQtMy45NDgyOHMtNC4yMjk1MiwxLjI1MDEzLTcuMTgzMzQsOS41ODA3Ny0xMy4wODk1Nyw3MS41MjY1Ni0xMy4wODk1Nyw3MS41MjY1NmwxMS44NzU1Ny01LjkzNzc4LDE2LjgzOTItNDYuNDMwODVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik01MjQuODE5NDYsNTMyLjI3NGE2LjE4MjI4LDYuMTgyMjgsMCwwLDEtNy4wOTExNi02LjI5MTQ3bC0yMC41NDE0Ny03Ljc5MjQyLDkuMjU3LTYuNjgyLDE4LjA4NzMzLDguNDI0MjRhNi4yMTU4MSw2LjIxNTgxLDAsMCwxLC4yODgzMSwxMi4zNDE2MloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjZmZiNmI2Ii8+PHBhdGggZD0iTTQ2MS44ODA2MSw0NjQuNjMyNTNsMy4yMjQ3MS01LjI3NDI1czQuNDA2NTUtLjE4NDU2LDkuODk1MjgsNi43NDM1M2MyLjgxMzczLDMuNTUxNjEsMjEuMDQ4NzQsMzQuMDE3MTksMjEuMDQ4NzQsMzQuMDE3MTlsMTYuODYzMTEsMTQuMDU1NDYtMTMuODA2MjgsNC45MzA4MS0xNi4yNzE2OS02LjkwMzE0LTE4LjI0NC0zMC4wNzhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwb2x5Z29uIHBvaW50cz0iNDM1LjU1NSA2NjYuODEgNDQ0LjczOSA2NjYuODEgNDQ5LjEwOCA2MzEuMzg1IDQzNS41NTMgNjMxLjM4NiA0MzUuNTU1IDY2Ni44MSIgZmlsbD0iI2ZmYjZiNiIvPjxwb2x5Z29uIHBvaW50cz0iMzU1LjE1NyA2NjEuMDk5IDM2NC4wNDQgNjYzLjQxNSAzNzcuMjA4IDYzMC4yMzggMzY0LjA5MSA2MjYuODE5IDM1NS4xNTcgNjYxLjA5OSIgZmlsbD0iI2ZmYjZiNiIvPjxwYXRoIGQ9Ik00NjAuMTE3ODcsNzExLjc3NzYzbDE0LjUxODI2LS44NjY1NXY2LjIyMDI2bDEzLjgwMjkzLDkuNTMyNzlhMy44ODU0MSwzLjg4NTQxLDAsMCwxLTIuMjA3ODIsNy4wODI3NEg0NjguOTQ2N2wtMi45NzkyNS02LjE1Mjc5LTEuMTYzMjUsNi4xNTI3OWgtNi41MTdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjYuODQwODYgLTQ5LjQ5ODE5KSIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik0zODAuMTMxMTEsNzA1LjQyODU4bDE0LjI2NzQsMi44MjM1LTEuNTY5LDYuMDE5MTMsMTAuOTUyMTEsMTIuNzA2MTVhMy44ODU0MSwzLjg4NTQxLDAsMCwxLTMuOTIzLDYuMjk2ODNMMzgzLjEzMyw3MjguOTE0NDFsLTEuMzMxLTYuNzA1MzEtMi42Nzc1OSw1LjY2MDQzLTYuMzA2MjQtMS42NDM4MVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTM4My4xMjQ4LDY4OC4zMTkzMWwyNi45MjA4MS01NS4zMzAyMSwyLjExMzUzLTY1LjQ5MDkxQzQwNi4zMzIzMyw1NTYuNjc3LDQyMy40OTEsNTMyLjgwNSw0MjMuNDkxLDUzMi44MDV2LTkuMjQ0OTFsNDEuOTE4NTIsNy45MDgxMnYwYTIwMS4yMTQ4OSwyMDEuMjE0ODksMCwwLDEsMTIuMjYxNTEsNzMuMDYwMjZMNDc1Ljk4Miw2OTQuMDQ3MzRoLjUyOTg3YTMuMzE1MjcsMy4zMTUyNywwLDEsMSwwLDYuNjMwNTNINDU5LjkzNTVhMy4zMTUyNywzLjMxNTI3LDAsMSwxLDAtNi42MzA1M2guNDI3NEw0NDguNDYzMSw1ODAuMTYzNTFsLTEzLjgzNjU0LDU2LjE5ODgxTDQwMS4xODksNjg4LjEwNjZhMy4zMDY5LDMuMzA2OSwwLDAsMS0uMjY1MjQsNi42MDM3OUgzODQuMzQ3MzlhMy4zMTE4MiwzLjMxMTgyLDAsMCwxLTEuMjIyNTktNi4zOTEwOFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTM4Mi43NTg0MSw0MjYuMjk2NDdjNi4xOTM5NS02LjA1OTM1LDEwLjA5Mjc5LTE0LjAyNzczLDE1LjIyMjU1LTIxLjAxMTA4LDUuMTI5Ni02Ljk4MzI3LDEyLjM1NDcyLTEzLjM4MjQsMjEuMDEwODMtMTMuNzcwMjZhMTMuMDM3ODYsMTMuMDM3ODYsMCwwLDEsOC4xNjU3OSwyLjEyOSw4LjMwNTQxLDguMzA1NDEsMCwwLDEsMy42MDQ1NSw3LjM2NzQxYy45MTM4LTIuNTY2NzQsNC45OTcxOC0zLjE0NTMsNi41ODgtLjkzMzMxLDEuNTkwNjIsMi4yMTE5MS0uMjU3MjIsNS44OTg5My0yLjk4MTE1LDUuOTQ4MzhsLS4yNjcxLTEuMDU2NjZhMTguMjQ4NzcsMTguMjQ4NzcsMCwwLDEtMTEuODAxNDEsNy44MzYxMywyLjk3ODMsMi45NzgzLDAsMCwxLTMuMzU1MjYtMy44NTQyNUM0MDkuNTkwODcsNDEwLjgwNjY2LDQxMi41NjA1Miw0MjguMjUyMzQsNDA3LDQzNnMtMjEuNDUyNTksNi45OTU1MS0zMC44MjkwNyw4LjczNTNjLTkuMDU0NjYsMS42OC0xNy44NTg1Ny0zLjM0NzU2LTI1LjY5OTMxLTguMTc4QTM4LjI3MTUsMzguMjcxNSwwLDAsMCwzODIuNzU4NDEsNDI2LjI5NjQ3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI2Ljg0MDg2IC00OS40OTgxOSkiIGZpbGw9IiMyZjJlNDEiLz48cGF0aCBkPSJNNzMyLjY4OTg5LDYzNi45MDM3Myw3MDQuNDcyNzUsNjI0LjQ1NVY2MTMuNzUyNjVsMTAuMDU2MS0uMDU2NTFhNy40NjkxOCw3LjQ2OTE4LDAsMCwwLDcuMDQ0LTUuMTA3MTRsNy4wNjQzNy0yMS4xOTMwNWE3LjQ2OTI0LDcuNDY5MjQsMCwwLDAtNy4wODYtOS44MzEyMkg3MDQuNDcyNzV2LTkuOTU5SDcyNS45MTNhNy40NjkyNSw3LjQ2OTI1LDAsMCwwLDcuMjc5MzctNS43OTU4NGw0Ljg2NS0yMS4xNjI4NmE3LjQ2OTIzLDcuNDY5MjMsMCwwLDAtNy4yNzkzNy05LjE0MjY1SDcwNC40NzI3NXYtMi40ODk3NWE0Ljk3OTQ5LDQuOTc5NDksMCwwLDAtOS45NTksMHYyLjQ4OTc1SDUxOC4xNTY2di0yLjQ4OTc1YTQuOTc5NSw0Ljk3OTUsMCwwLDAtOS45NTksMHYyLjQ4OTc1SDQ4Ny4yODY4YTcuNDY5MjMsNy40NjkyMywwLDAsMC03LjI3OTM3LDkuMTQyNjVsNC44NjUsMjEuMTYyODZhNy40NjkyNSw3LjQ2OTI1LDAsMCwwLDcuMjc5MzcsNS43OTU4NEg1MDguMTk3NnY5Ljk1OUg0OTYuNTEzMjhhNy40NjkyMyw3LjQ2OTIzLDAsMCwwLTcuMTA5MjcsOS43Nmw3LjIxMDQxLDIyLjM3NzExYTcuNDY5MjUsNy40NjkyNSwwLDAsMCw3LjE1MTIzLDUuMTc4MzdsNC40MzItLjAyNDlWNjI0LjQ1NWwtMjIuODIyNjksMTIuNDQ4NzRhNy40NjkyMiw3LjQ2OTIyLDAsMCwwLTcuNDY5MjQsNy40NjkyMnYwYTcuNDY5MjUsNy40NjkyNSwwLDAsMCw3LjQ2OTI0LDcuNDY5MjVINTA4LjE5NzZ2NTQuNzc0NDZhNC45Nzk1LDQuOTc5NSwwLDAsMCw5Ljk1OSwwVjY1MS44NDIyMkg2OTQuNTEzNzZ2NTQuNzc0NDZhNC45Nzk0OSw0Ljk3OTQ5LDAsMCwwLDkuOTU5LDBWNjUxLjg0MjIyaDI4LjIxNzE0YTcuNDY5MjUsNy40NjkyNSwwLDAsMCw3LjQ2OTI1LTcuNDY5MjV2MEE3LjQ2OTIyLDcuNDY5MjIsMCwwLDAsNzMyLjY4OTg5LDYzNi45MDM3M1ptLTIxNC41MzMyOS02OS4yOThINjk0LjUxMzc2djkuOTU5SDUxOC4xNTY2Wm0wLDU2Ljg0OTI1di05LjY1NTYzbDE3Ni4zNTcxNi0uOTkwNzZWNjI0LjQ1NVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44NDA4NiAtNDkuNDk4MTkpIiBmaWxsPSIjM2YzZDU2Ii8+PC9zdmc+"; -var darkBackground = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGRhdGEtbmFtZT0iTGF5ZXIgMSIgd2lkdGg9Ijg1NS45Mzk1OCIgaGVpZ2h0PSI2MzAuMDY2MDgiIHZpZXdCb3g9IjAgMCA4NTUuOTM5NTggNjMwLjA2NjA4IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PHBhdGggZD0iTTkzNS40MzIzNCw0NzIuNTU3NjdjLTMuNzMsNDMuMDgtMjIuNTEsODQuNzEtNDkuMywxMTkuMTRxLTEuNjgsMi4xNi0zLjQsNC4yOC0zLjg3LDQuNzctNy45NCw5LjM2LTQuOTgsNS42NTUtMTAuMjUsMTEuMDUwMDUtNC4yOSw0LjQzOTk0LTguNzgsOC42ODk5NC0zLjQ2NSwzLjMxNS03LjAxLDYuNWMtMjguNDMsMjUuNjktNjEuMDksNDYuODktOTQuNzQsNjUuNDMwMDUtNjUuNjcsMzYuMTctMTM3LjY1LDYzLjU2OTk1LTIxMi41Miw2Ny41Ni03NC44NiwzLjk4LTE1My4wMS0xNy40Ni0yMDcuOTEtNjguNTItNzMuOTktNjguODEtOTQuNjM5OTUtMTgzLjU4LTY0LjYtMjgwLjA1LDE5Ljk4LTY0LjE4LDYwLjc2LTEyMi4yNCwxMTYuMjYtMTYwLjE2LDU1LjAyLTM3LjU5LDEyNC40My01NC41MSwxOTAuMTItNDMuNDQ5OTUsNTIuNDQtMzEuODcwMDYsMTIxLjA5LTMyLjQ4LDE3OC4xLTguODksMzAuNDIsMTIuNTksNTcuNzIsMzEuMzEsODEuNjcsNTMuOTNhMzM5LjM0MzM3LDMzOS4zNDMzNywwLDAsMSwzMC43MiwzMy4yM3ExLjQ1NSwxLjc4NSwyLjg4LDMuNiw1Ljk3LDcuNTQ1LDExLjU1LDE1LjQsOC4wMSwxMS4yNjUsMTUuMjEsMjMuMDNjMS4zMiwyLjE2LDIuNjMsNC4zMywzLjkxLDYuNTIuODYsMS40NywxLjczLDIuOTUsMi41OCw0LjQ0YS4yOTc3Ni4yOTc3NiwwLDAsMSwuMDQuMWMxMy4zMSwyMy40MSwyNC4xOSw0OC4zOSwyOS44NjAwNSw3NC41LDEsNC42MiwxLjg0LDkuMjYsMi40OSwxMy45NHYuMDFxLjg1NSw1Ljk1NSwxLjI5LDExLjk3QTE3Ni45NzcxMSwxNzYuOTc3MTEsMCwwLDEsOTM1LjQzMjM0LDQ3Mi41NTc2N1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiMzZjNkNTYiLz48cGF0aCBkPSJNNzQwLjA3Mzg2LDUzNy42ODQxMiw1OTEuNjEyMzMsNDE0LjAwNjI3LDczNS44NDAyNyw1NDIuNjM4YTMuNDQxNjEsMy40NDE2MSwwLDEsMCw0LjIzMzU5LTQuOTUzODZaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjZjBmMGYwIiBvcGFjaXR5PSIwLjMiLz48Y2lyY2xlIGN4PSIyMjcuNTgyMTIiIGN5PSIyNTAuNzgwNzEiIHI9Ijg5IiBmaWxsPSIjZjJmMmYyIi8+PHBhdGggZD0iTTQ3OC42MTIzMywzNzkuNzQ3NjdhODAuOTkzNjksODAuOTkzNjksMCwwLDEtODEsODEsODEuNTcxNjEsODEuNTcxNjEsMCwwLDEtMjcuOC00LjksODEuMDU0ODksODEuMDU0ODksMCwxLDEsMTA4LjgtNzYuMVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiNmZmYiLz48Y2lyY2xlIGN4PSIyMTEuNTgyMTIiIGN5PSIyMTcuNzgwNzEiIHI9IjI1IiBmaWxsPSIjZTRlNGU0Ii8+PHBhdGggZD0iTTQ3NS40NTIzNiwzNTcuMjc3NjRhMjUuMDAxMTUsMjUuMDAxMTUsMCwwLDEtMjcuNi00MS4wOEE4MS4wNTI3OSw4MS4wNTI3OSwwLDAsMSw0NzUuNDUyMzYsMzU3LjI3NzY0WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE3Mi4wMzAyMSAtMTM0Ljk2Njk2KSIgZmlsbD0iI2YyZjJmMiIvPjxjaXJjbGUgY3g9IjI1Mi41ODIxMiIgY3k9IjI3MS43ODA3MSIgcj0iOSIgZmlsbD0iI2U0ZTRlNCIvPjxwYXRoIGQ9Ik0zODcuNjEyMzMsNDU3Ljc0NzY3YTkuMDQ1ODEsOS4wNDU4MSwwLDAsMS0uMzEsMi4zNCw3OS41Mjc3NCw3OS41Mjc3NCwwLDAsMS0xNy40OS00LjI0LDkuMDAxNTcsOS4wMDE1NywwLDAsMSwxNy44LDEuOVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiNmMmYyZjIiLz48cGF0aCBkPSJNMzM0LjYxMjMzLDM3NS43NDc2N2ExOC4wMDIsMTguMDAyLDAsMCwxLTE2LjgsMTcuOTYsODEuNTQ3NzMsODEuNTQ3NzMsMCwwLDEsMS43Ni0zNS43MUExOC4wMDAyNiwxOC4wMDAyNiwwLDAsMSwzMzQuNjEyMzMsMzc1Ljc0NzY3WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE3Mi4wMzAyMSAtMTM0Ljk2Njk2KSIgZmlsbD0iI2YyZjJmMiIvPjxjaXJjbGUgY3g9IjYwNi40NTY1MyIgY3k9IjIwOC40ODMwNSIgcj0iMy43MDIzNCIgZmlsbD0iIzZjNjNmZiIvPjxjaXJjbGUgY3g9IjU3Mi4zMDIzMSIgY3k9IjExOS45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjIyNS4zMDIzMSIgY3k9IjU0My45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjU4NC41ODE0NCIgY3k9IjMzMS41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjMwNS40NTY1MyIgY3k9IjM1MC40ODMwNSIgcj0iMy43MDIzNCIgZmlsbD0iIzZjNjNmZiIvPjxjaXJjbGUgY3g9IjE3MS40NTY1MyIgY3k9IjQxNi40ODMwNSIgcj0iMTcuNDgzMDUiIGZpbGw9IiM2YzYzZmYiLz48Y2lyY2xlIGN4PSIyNjcuMzAyMzEiIGN5PSI0MzUuOTQ4NTEiIHI9IjIuMTYzMDciIGZpbGw9IiNmMGYwZjAiLz48Y2lyY2xlIGN4PSI0ODcuMzAyMzEiIGN5PSI5Ny45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjM1OC4zMDIzMSIgY3k9IjU1OC45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjMyNi4zMDIzMSIgY3k9IjExNy45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjM4Mi4zMDIzMSIgY3k9IjIyMi45NDg1MSIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjI5Ni41ODE0NCIgY3k9IjQ4MC41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjU0OS41ODE0NCIgY3k9IjQ5NC41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjQzNy41ODE0NCIgY3k9IjM2OC41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjQ5NC41ODE0NCIgY3k9IjIyMi41OTQwMiIgcj0iMi4xNjMwNyIgZmlsbD0iI2YwZjBmMCIvPjxjaXJjbGUgY3g9IjU5OC4yMTIwNCIgY3k9IjI5Mi42NTQ3MyIgcj0iNC4yODg4OSIgZmlsbD0iI2ZmNjU4NCIvPjxjaXJjbGUgY3g9IjQyNC4yMTIwNCIgY3k9IjE1MC42NTQ3MyIgcj0iNC4yODg4OSIgZmlsbD0iI2ZmNjU4NCIvPjxjaXJjbGUgY3g9IjQyNC4yMTIwNCIgY3k9IjQ0NS42NTQ3MyIgcj0iNC4yODg4OSIgZmlsbD0iI2ZmNjU4NCIvPjxwYXRoIGQ9Ik04NjMuNDUyMzYsNjA1LjMzNzY0YTcuNjk0LDcuNjk0LDAsMCwwLTcuMzksNS41OCw3LjM4OTYsNy4zODk2LDAsMCwwLS4zLDIuMTJ2MTIuMDRxNC40ODUtNC4yNDQ5NCw4Ljc4LTguNjg5OTQsNS4yNjUtNS40MDAwNiwxMC4yNS0xMS4wNTAwNVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiM2YzYzZmYiLz48cGF0aCBkPSJNODkwLjY4MTE4LDY2Ny44OTgwNnEtMTkuMzY4MTYsMC00Mi40NTY1NC0xLjQ2Mzg2Yy03OS42MTM3Ny01LjA1NTY3LTE4Mi43Mzc4LTIyLjYzMjgyLTI5MC4zNzYtNDkuNDkyMTktMTA3LjYzNzctMjYuODU5MzgtMjA2LjkzMDE4LTU5Ljc5Mzk1LTI3OS41ODU0NS05Mi43MzQzOC0zNS4zOTI1OC0xNi4wNDY4Ny02Mi41NTYxNS0zMS4yMzYzMi04MC43MzUzNS00NS4xNDc0Ni0xOS4yNDcwNy0xNC43MjcwNS0yNy42NjYtMjcuNTY0LTI1LjAyMzkzLTM4LjE1MjgzLDUuMTQ4LTIwLjYyODkxLDUwLjczMS0yNS4xNDIwOSw4OC4wNjQtMjUuMjk1NDFsLjAxMjY5LDNjLTUxLjI2ODA2LjIxMDQ1LTgxLjUxMzY3LDguMzg2NzItODUuMTY1NTIsMjMuMDIyLTQuNjUxODYsMTguNjQwMTQsMzMuMjg2NjIsNDcuNzQwNzMsMTA0LjA4NjkxLDc5Ljg0MTMxLDcyLjQ5NTYxLDMyLjg2ODE3LDE3MS42MDU0Nyw2NS43MzkyNiwyNzkuMDczMjQsOTIuNTU2NjQsMTA3LjQ2NzI5LDI2LjgxNjQxLDIxMC40MDEzNyw0NC4zNjMyOCwyODkuODM5ODUsNDkuNDA4MjEsNzcuNTc4NjEsNC45Mjc3MywxMjQuNzQzMTYtMi45Mzc1LDEyOS4zOTQ1My0yMS41NzgxMywzLjg2MTgxLTE1LjQ3NjU2LTIxLjU5ODE1LTM4LjI3NTM5LTcxLjY4OTQ2LTY0LjE5ODI0bDEuMzc4OTEtMi42NjQwNmMzNi4zOTcsMTguODM1OTMsNzguNjQ1NTEsNDUuODUxNTYsNzMuMjIxNjgsNjcuNTg4ODYtMi42NDI1OCwxMC41ODg4Ny0xNi4xMDU0NywxNy45NjQ4NS00MC4wMTUxNCwyMS45MjI4NUM5MjcuMDc2Miw2NjYuNzY3Miw5MTAuMzM1NDgsNjY3Ljg5ODA2LDg5MC42ODExOCw2NjcuODk4MDZaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjNmM2M2ZmIi8+PGNpcmNsZSBjeD0iNzE0LjU4MjEyIiBjeT0iMjA4Ljc4MDcxIiByPSIxMDAuNSIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik04ODYuNjEyMzMsMjQxLjc0NzY3YTEwMiwxMDIsMCwxLDAsMTAyLDEwMkExMDEuNjM1LDEwMS42MzUsMCwwLDAsODg2LjYxMjMzLDI0MS43NDc2N1ptMCwyMDFhOTksOTksMCwxLDEsOTktOTlBOTguNjE3NjcsOTguNjE3NjcsMCwwLDEsODg2LjYxMjMzLDQ0Mi43NDc2N1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiMyZjJlNDEiLz48cGF0aCBkPSJNNzk4LjQxNywzNjcuODE4NDdhMi4wMDA3OCwyLjAwMDc4LDAsMCwxLTEuOTU3LTEuNTk3NjUsOTcuNjY5MjQsOTcuNjY5MjQsMCwwLDEsMjIuMzQwODItODMuMTM1MjYsMiwyLDAsMCwxLDIuOTg2MzMsMi42NjExNEE5My41OTY4Miw5My41OTY4MiwwLDAsMCw4MDAuMzc4LDM2NS40MTUxNWEyLjAwMjI4LDIuMDAyMjgsMCwwLDEtMS45NjA5NCwyLjQwMzMyWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE3Mi4wMzAyMSAtMTM0Ljk2Njk2KSIgZmlsbD0iIzJmMmU0MSIvPjxjaXJjbGUgY3g9IjcxNC41MTkyNCIgY3k9IjIzOC4yNzM3MyIgcj0iNjMuODc3MDIiIGZpbGw9IiM2YzYzZmYiLz48cGF0aCBkPSJNODY2LjI0ODA1LDM5Ny4zNTY2NmMtNC4xNDA2Mi0uMTE1LTkuMjkzODUtLjI1ODY5LTEzLjI2Mzg0LTMuMTU4NzRhMTAuMTg2MTgsMTAuMTg2MTgsMCwwLDEtNC4wMDgwNi03LjYwNjA3LDYuODUyMTMsNi44NTIxMywwLDAsMSwyLjMzMDA3LTUuNjI3NjNjMi4wNzM1Mi0xLjc1MjE2LDUuMTAxMzktMi4xNjMxMyw4LjM2NDQxLTEuMjA0MmwtMy4zODA3Ni0yNC43MDYxLDIuNDgxNzQtLjM0LDMuOTc0NDQsMjkuMDQ1MTgtMi4wNzI0NS0uOTUxYy0yLjQwMjctMS4xMDIwNS01LjcwMDg4LTEuNjYyODUtNy43NTA0LjA2OTExYTQuNDAyNjMsNC40MDI2MywwLDAsMC0xLjQ0Mzc1LDMuNjI2NTksNy42OTg4Nyw3LjY5ODg3LDAsMCwwLDIuOTgyNDYsNS42NzEwN2MzLjA4OTQ5LDIuMjU2NjgsNy4xOTcwOCwyLjU0Nzc5LDExLjg1NTg1LDIuNjc4WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE3Mi4wMzAyMSAtMTM0Ljk2Njk2KSIgZmlsbD0iIzJmMmU0MSIvPjxyZWN0IHg9IjY1OC40OTQ5MyIgeT0iMjIyLjIxNzY3IiB3aWR0aD0iMTMuNDkxMzMiIGhlaWdodD0iMi41MDQ5OCIgZmlsbD0iIzJmMmU0MSIvPjxyZWN0IHg9IjcwMS4wNzk2MSIgeT0iMjIyLjIxNzY1IiB3aWR0aD0iMTMuNDkxMzMiIGhlaWdodD0iMi41MDQ5OCIgZmlsbD0iIzJmMmU0MSIvPjxwYXRoIGQ9Ik04ODkuMjMyMzMsNDUyLjkwNzY1aC01Ny45YTguMTQ3MTYsOC4xNDcxNiwwLDAsMC04LjEzOTk1LDguMTR2MTI4LjMzYTQ3LjY2OTU1LDQ3LjY2OTU1LDAsMCwwLDI1LjU2LDQyLjE5OTk1cTMuNTU1LTMuMTgsNy4wMS02LjUsNC40ODUtNC4yNDQ5NCw4Ljc4LTguNjg5OTQsNS4yNjUtNS40MDAwNiwxMC4yNS0xMS4wNTAwNSw0LjA4MDA2LTQuNTksNy45NC05LjM2LDEuNzI1LTIuMTE1LDMuNC00LjI4YzI2Ljc5LTM0LjQzLDQ1LjU3LTc2LjA2LDQ5LjMtMTE5LjE0QTY0LjA0ODU0LDY0LjA0ODU0LDAsMCwwLDg4OS4yMzIzMyw0NTIuOTA3NjVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjMmYyZTQxIi8+PHBhdGggZD0iTTg5MS4zNDIzMSw0NzkuNjg3NjdhMTQuNjExMzYsMTQuNjExMzYsMCwwLDAtMTAuNDMtNC4xNywxNC40NjUsMTQuNDY1LDAsMCwwLTkuMTYsMy4zNjAwNSwxMy4xMjI2MywxMy4xMjI2MywwLDAsMC0xLjE3LDEuMDdsLTQ3LjM4OTk1LDQ4LjYtMzQuMzcsMzUuMjVhNi44MDA2MSw2LjgwMDYxLDAsMCwwLTEuMjgsMS44LDcuMjk1NzMsNy4yOTU3MywwLDAsMC0uNzcsMy4zMiw3LjE2NzUxLDcuMTY3NTEsMCwwLDAsMi4xODAwNiw1LjA3bDEuMzUsMS4zMiw5LjgsOS41NS4wMS0uMDFhNy4yOTA3Myw3LjI5MDczLDAsMCwwLDQuNjYsMS42Myw3LjE2Nyw3LjE2NywwLDAsMCw1LjA3LTIuMThsMS41OS0xLjYyLDExLjM4LTExLjY3LjM4LS4zOSw2OC40MS03MC4xNmExNC42OTEyOCwxNC42OTEyOCwwLDAsMC0uMjYtMjAuNzdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjNmM2M2ZmIi8+PHBhdGggZD0iTTg5MC44NjE1MiwzNDMuNDRjMi4xMTI0LTQuNDY2NTgtLjA1MzQ5LTkuMjM3NjEtMy43NjM3OC0xMi4wOTA3Mi00LjY3NTU3LTMuNTk1MzktMTAuNzIyMS0zLjAwMDg1LTE2LjA0MDA4LTEuMjk5MDUtNS44MjIzOCwxLjg2MzItMTEuNTEzNjYsNS4yMTYwOC0xNy44MDM4Myw1LjAyMzM3YTExLjEzMDU4LDExLjEzMDU4LDAsMCwxLTEwLjI0NDA3LTcuMjc3NjRjLTMuMzY4Ny04LjYzOS40MzU2MS0xOC4yOTQ4OCw2LjI5OTcxLTI0Ljg0NjgxYTM0LjI2NzY2LDM0LjI2NzY2LDAsMCwxLDI2LjU0NC0xMS41ODYsMzQuNjQ5ODksMzQuNjQ5ODksMCwwLDEsMjguMDY4LDE2LjkwMjYsMS41NDA3OSwxLjU0MDc5LDAsMCwwLDIuMDUyMjkuNTM4MTMsMzYuODgyMjUsMzYuODgyMjUsMCwwLDEsMjguMzkzNzctLjcxNDMyLDM2LjI4OTg0LDM2LjI4OTg0LDAsMCwxLDIyLjU4MDQyLDM0LjQ5MTg4Yy0uMDUsMS45MzEyMiwyLjk1MDA1LDEuOTMwMSwzLDBhMzkuODkxNTUsMzkuODkxNTUsMCwwLDAtMTAuNTk5MjgtMjcuODEyNDksMzguNzE4NzEsMzguNzE4NzEsMCwwLDAtMjcuNTY2ODEtMTIuMTY3NzIsMzkuMzM2NDEsMzkuMzM2NDEsMCwwLDAtMTcuMzIyMjYsMy42MTIyM2wyLjA1MjI5LjUzODEzYTM3LjY5ODg2LDM3LjY5ODg2LDAsMCwwLTI1LjA5ODgtMTcuNzI4LDM2LjQ4NTQyLDM2LjQ4NTQyLDAsMCwwLTI5LjQyMzg0LDcuMzI3NzJjLTcuNzAxNjUsNi4wMjcwNy0xMy41Mzg0OSwxNS4zODAxNi0xMy4xNzUxOSwyNS40MTA3MS4xNTcyMSw0LjM0MDQ3LDEuNDQ3MTMsOC43OTYsNC40NjA2LDEyLjAzMDUxLDMuODU5ODEsNC4xNDI4Nyw5LjYyMjI5LDQuODU5NDQsMTQuOTQ2MzEsMy43OTgsNy4wNzU1NC0xLjQxMDcxLDEzLjUzNTMzLTYuMDY0NDksMjAuOTExMzMtNS45MjExM2ExMC4yMTE2NCwxMC4yMTE2NCwwLDAsMSw3LjY0MTcsMy40NDUzYzEuNjI0NTUsMS44MzMzNSwyLjYwNDIsNC40NzA0MiwxLjQ5NzE2LDYuODExMjItLjgyMDk0LDEuNzM1ODUsMS43NjQ2MywzLjI2MDI2LDIuNTkwNDEsMS41MTQxNloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzIuMDMwMjEgLTEzNC45NjY5NikiIGZpbGw9IiMyZjJlNDEiLz48cGF0aCBkPSJNNDEyLjA5NDI2LDcwNC4zMjI4N2MtMzUuNTk5MTIuMDAxLTY4LjY5NDMzLTEuMjIwNzEtOTguMzIyMjYtMy42ODU1NS0zOC43MjY1Ni0zLjIyMjY2LTY5LjQxNDU1LTguNDAzMzItOTEuMjEwNDUtMTUuMzk2NDgtMjMuMDc2NjYtNy40MDUyOC0zNS4zMTkzNC0xNi42NjctMzYuMzg4MTgtMjcuNTI4MzItMi4wODMtMjEuMTU4MjEsMzkuMzM0LTQwLjcyNDYxLDc0LjQ0NTMxLTUzLjQxMzA5bDEuMDE5NTMsMi44MjIyN2MtNDguMjE2OCwxNy40MjM4Mi03My45NTcsMzUuMjg2MTMtNzIuNDc5NDksNTAuMjk3ODUsMS44ODE4MywxOS4xMTkxNCw0Ny4zOTIwOSwzMy43ODEyNSwxMjQuODYxODEsNDAuMjI3NTQsNzkuMzI1Miw2LjYwMDU4LDE4My43MTcyOSw0LjI2MTcyLDI5My45NDcyNy02LjU4OTg1LDExMC4yMy0xMC44NDg2MywyMTMuMDc1NjgtMjguOTA2MjUsMjg5LjU5MTMxLTUwLjg0NTcsNzQuNzI2MDctMjEuNDI1NzgsMTE2LjUwNDg4LTQ0LjY3OTY5LDExNC42MjMtNjMuNzk4ODMtMS41NjI1LTE1Ljg3NC0zMy4yMDI2NC0yOC43OTMtODkuMDkxOC0zNi4zNzg5bC40MDMzMi0yLjk3MjY2YzQwLjYwOTg2LDUuNTExNzIsODkuNDc5NDksMTYuNzYxNzIsOTEuNjczODMsMzkuMDU3NjIsMS4wNjkzMywxMC44NjEzMi05LjEzMzMsMjIuMzMyLTMwLjMyMjc2LDM0LjA5Mzc1LTIwLjAxNDY1LDExLjEwOTM3LTQ5LjEwMzUxLDIyLjE3Mjg1LTg2LjQ1ODQ5LDMyLjg4MjgxLTc2LjY4NTA2LDIxLjk4ODI4LTE3OS43MTk3Myw0MC4wODEwNS0yOTAuMTI0NTEsNTAuOTQ4MjRDNTM5LjAwMjQ3LDcwMC44Niw0NzIuMDE2NjMsNzA0LjMyMjg3LDQxMi4wOTQyNiw3MDQuMzIyODdaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcyLjAzMDIxIC0xMzQuOTY2OTYpIiBmaWxsPSIjNmM2M2ZmIi8+PGNpcmNsZSBjeD0iODM4LjQ1NjUzIiBjeT0iNDM0LjQ4MzA1IiByPSIxNy40ODMwNSIgZmlsbD0iIzZjNjNmZiIvPjxjaXJjbGUgY3g9IjMzMS40NTY1MyIgY3k9IjE3LjQ4MzA1IiByPSIxNy40ODMwNSIgZmlsbD0iI2U2ZTZlNiIvPjxjaXJjbGUgY3g9IjE5LjQ1NjUzIiBjeT0iNDMzLjQ4MzA1IiByPSIxNy40ODMwNSIgZmlsbD0iI2U2ZTZlNiIvPjxjaXJjbGUgY3g9IjEyNy40NTY1MyIgY3k9IjEwOC40ODMwNSIgcj0iMTAuNzAyMzQiIGZpbGw9IiNmZjY1ODQiLz48Y2lyY2xlIGN4PSI3Ny40NTY1MyIgY3k9IjUxNC40ODMwNSIgcj0iMTAuNzAyMzQiIGZpbGw9IiNmZjY1ODQiLz48Y2lyY2xlIGN4PSI4MDcuNDU2NTMiIGN5PSIzMzkuNDgzMDUiIHI9IjEwLjcwMjM0IiBmaWxsPSIjZmY2NTg0Ii8+PGNpcmNsZSBjeD0iNjQ1LjQ1NjUzIiBjeT0iNTk4LjQ4MzA1IiByPSIxNy40ODMwNSIgZmlsbD0iI2U2ZTZlNiIvPjwvc3ZnPg=="; -const getPathOfImage$3 = (vault, image2) => { - return vault.getResourcePath(image2); -}; -const detectWikiInternalLink$3 = (lineText) => { - var _a, _b; - const { - metadataCache, - vault - } = appStore.getState().dailyNotesState.app; - const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1]; - const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5]; - const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); - if (file === null) { - return { - linkText: internalFileName, - altText: internalAltName, - path: "", - filePath: "" - }; - } else { - const imagePath = getPathOfImage$3(vault, file); - if (internalAltName) { - return { - linkText: internalFileName, - altText: internalAltName, - path: imagePath, - filePath: file.path - }; - } else { - return { - linkText: internalFileName, - altText: "", - path: imagePath, - filePath: file.path - }; - } - } -}; -const detectMDInternalLink$3 = (lineText) => { - var _a, _b; - const { - metadataCache, - vault - } = appStore.getState().dailyNotesState.app; - const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5]; - const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2]; - const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); - if (file === null) { - return { - linkText: internalFileName, - altText: internalAltName, - path: "", - filePath: "" - }; - } else { - const imagePath = getPathOfImage$3(vault, file); - if (internalAltName) { - return { - linkText: internalFileName, - altText: internalAltName, - path: imagePath, - filePath: file.path - }; - } else { - return { - linkText: internalFileName, - altText: "", - path: imagePath, - filePath: file.path - }; +const checkShouldShowMemoWithFilters = (memo2, filters) => { + let shouldShow = true; + for (const f2 of filters) { + const { relation } = f2; + const r2 = checkShouldShowMemo(memo2, f2); + if (relation === "OR") { + shouldShow = shouldShow || r2; + } else { + shouldShow = shouldShow && r2; } } + return shouldShow; }; -const ShareMemoImageDialog = (props) => { - var _a; - const { - memo: propsMemo, - destroy - } = props; +const checkShouldShowMemo = (memo2, filter) => { + var _a, _b; const { - memos - } = appStore.getState().memoState; - let memosLength; - let createdDays; - if (memos.length) { - memosLength = memos.length - 1; - createdDays = memos ? Math.ceil((Date.now() - utils$1.getTimeStampByDate(memos[memosLength].createdAt)) / 1e3 / 3600 / 24) : 0; + type, + value: { operator, value } + } = filter; + if (value === "") { + return true; } - const memo2 = __spreadProps(__spreadValues({}, propsMemo), { - createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt) - }); - const footerEnd = ShareFooterEnd.replace("{UserName}", UserName); - const footerStart = ShareFooterStart.replace("{MemosNum}", memos.length.toString()).replace("{UsedDay}", createdDays.toString()); - let externalImageUrls = []; - let internalImageUrls = []; - let allMarkdownLink = []; - let allInternalLink = []; - if (IMAGE_URL_REG.test(memo2.content)) { - let allExternalImageUrls = []; - let anotherExternalImageUrls = []; - if (MARKDOWN_URL_REG.test(memo2.content)) { - allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG)); + let shouldShow = true; + if (type === "TAG") { + let contained = true; + const tagsSet = /* @__PURE__ */ new Set(); + for (const t2 of Array.from((_a = memo2.content.match(TAG_REG)) != null ? _a : [])) { + const tag = t2.replace(TAG_REG, "$1").trim(); + const items = tag.split("/"); + let temp = ""; + for (const i of items) { + temp += i; + tagsSet.add(temp); + temp += "/"; + } } - if (WIKI_IMAGE_URL_REG.test(memo2.content)) { - allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG)); + for (const t2 of Array.from((_b = memo2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) { + const tag = t2.replace(NOP_FIRST_TAG_REG, "$1").trim(); + const items = tag.split("/"); + let temp = ""; + for (const i of items) { + temp += i; + tagsSet.add(temp); + temp += "/"; + } } - if (MARKDOWN_WEB_URL_REG.test(memo2.content)) { - allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG)); + if (!tagsSet.has(value)) { + contained = false; } - if (allInternalLink.length) { - for (let i = 0; i < allInternalLink.length; i++) { - let one = allInternalLink[i]; - internalImageUrls.push(detectWikiInternalLink$3(one)); - } + if (operator === "NOT_CONTAIN") { + contained = !contained; } - if (allMarkdownLink.length) { - for (let i = 0; i < allMarkdownLink.length; i++) { - let two = allMarkdownLink[i]; - if (/(.*)http[s]?(.*)/.test(two)) { - anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _a[5]); - } else { - internalImageUrls.push(detectMDInternalLink$3(two)); - } - } + shouldShow = contained; + } else if (type === "TYPE") { + let matched = false; + if (value === "NOT_TAGGED" && memo2.content.match(TAG_REG) === null) { + matched = true; + } else if (value === "LINKED" && memo2.content.match(LINK_REG) !== null) { + matched = true; + } else if (value === "IMAGED" && memo2.content.match(IMAGE_URL_REG) !== null) { + matched = true; + } else if (value === "CONNECTED" && memo2.content.match(MEMO_LINK_REG) !== null) { + matched = true; } - externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls); - } - const [shortcutImgUrl, setShortcutImgUrl] = _react_17_0_2_react.exports.useState(""); - const [imgAmount, setImgAmount] = _react_17_0_2_react.exports.useState(externalImageUrls.length); - const memoElRef = _react_17_0_2_react.exports.useRef(null); - _react_17_0_2_react.exports.useEffect(() => { - if (imgAmount > 0) { - return; + if (operator === "IS_NOT") { + matched = !matched; } - changeBackgroundImage(); - setTimeout(() => { - if (!memoElRef.current) { - return; + shouldShow = matched; + } else if (type === "TEXT") { + let contained = memo2.content.includes(value); + if (operator === "NOT_CONTAIN") { + contained = !contained; + } + shouldShow = contained; + } else if (type === "DATE") { + if (!app.plugins.enabledPlugins.has("nldates-obsidian")) { + new require$$0.Notice(t$1("OBSIDIAN_NLDATES_PLUGIN_NOT_ENABLED")); + } else { + const nldatesPlugin = app.plugins.getPlugin("nldates-obsidian"); + const parsedResult = nldatesPlugin.parseDate(value); + let contained; + if (parsedResult.date !== null) { + contained = parsedResult.moment.isBefore(require$$0.moment(memo2.createdAt), "day"); } - let shareDialogBackgroundColor; - if (document.body.className.contains("theme-dark")) { - shareDialogBackgroundColor = "#727171"; - } else { - shareDialogBackgroundColor = "#eaeaea"; + if (operator === "NOT_CONTAIN") { + contained = !contained; } - toImage(memoElRef.current, { - backgroundColor: shareDialogBackgroundColor, - pixelRatio: window.devicePixelRatio * 2 - }).then((url) => { - setShortcutImgUrl(url); - }).catch(() => { + shouldShow = contained; + } + } + shouldShow = memo2.linkId === "" ? shouldShow : false; + return shouldShow; +}; +var selector = ""; +const nullItem = { + text: t$1("SELECT"), + value: "" +}; +const Selector = (props) => { + const { + className, + dataSource, + handleValueChanged, + value + } = props; + const [showSelector, toggleSelectorStatus] = useToggle(false); + const seletorElRef = _react_17_0_2_react.exports.useRef(null); + let currentItem = nullItem; + for (const d of dataSource) { + if (d.value === value) { + currentItem = d; + break; + } + } + _react_17_0_2_react.exports.useEffect(() => { + if (showSelector) { + const handleClickOutside = (event) => { + var _a; + if (!((_a = seletorElRef.current) == null ? void 0 : _a.contains(event.target))) { + toggleSelectorStatus(false); + } + }; + window.addEventListener("click", handleClickOutside, { + capture: true, + once: true }); - }, ANIMATION_DURATION); - }, [imgAmount]); - const handleCloseBtnClick = () => { - destroy(); - }; - const convertBase64ToBlob = (base64, type) => { - const bytes = window.atob(base64); - const ab2 = new ArrayBuffer(bytes.length); - const ia2 = new Uint8Array(ab2); - for (var i = 0; i < bytes.length; i++) { - ia2[i] = bytes.charCodeAt(i); } - return new Blob([ab2], { - type - }); + }, [showSelector]); + const handleItemClick = (item) => { + if (handleValueChanged) { + handleValueChanged(item.value); + } + toggleSelectorStatus(false); }; - const convertBackgroundToBase64 = async (path) => { - const { - vault - } = dailyNotesService.getState().app; - const buffer = await vault.adapter.readBinary(path); - const arr = new Uint8Array(buffer); - const blob = new Blob([arr], { - type: "image/png" - }); - return new Promise((resolve) => { - const reader = new FileReader(); - reader.onloadend = () => { - const base64Url = reader.result; - resolve(base64Url); - }; - reader.readAsDataURL(blob); - }); + const handleCurrentValueClick = (event) => { + event.stopPropagation(); + toggleSelectorStatus(); }; - const changeBackgroundImage = async () => { - const { - app: app2 - } = dailyNotesService.getState(); - let imageUrl; - let imagePath; - const lightBackgroundImage = encodeURI(lightBackground); - const darkBackgroundImage = encodeURI(darkBackground); - if (document.body.className.contains("theme-light")) { - if (await app2.vault.adapter.exists(DefaultLightBackgroundImage) && /\.(png|svg|jpg|jpeg)/g.test(DefaultLightBackgroundImage)) { - imagePath = DefaultLightBackgroundImage; - imageUrl = await convertBackgroundToBase64(imagePath); - } else { - imageUrl = lightBackgroundImage; - } - } else if (document.body.className.contains("theme-dark")) { - if (await app2.vault.adapter.exists(DefaultDarkBackgroundImage) && /\.(png|svg|jpg|jpeg)/g.test(DefaultDarkBackgroundImage)) { - imagePath = DefaultDarkBackgroundImage; - imageUrl = await convertBackgroundToBase64(imagePath); - } else { - imageUrl = darkBackgroundImage; + return /* @__PURE__ */ jsxs("div", { + className: `selector-wrapper ${className != null ? className : ""}`, + ref: seletorElRef, + children: [/* @__PURE__ */ jsxs("div", { + className: `current-value-container ${showSelector ? "active" : ""}`, + onClick: handleCurrentValueClick, + children: [/* @__PURE__ */ jsx("span", { + className: "value-text", + children: currentItem.text + }), /* @__PURE__ */ jsx("span", { + className: "arrow-text", + children: /* @__PURE__ */ jsx(SvgArrowRight, { + className: "icon-img" + }) + })] + }), /* @__PURE__ */ jsx("div", { + className: `items-wrapper ${showSelector ? "" : "hidden"}`, + children: dataSource.map((d) => { + return /* @__PURE__ */ jsx("div", { + className: `item-container ${d.value === value ? "selected" : ""}`, + onClick: () => { + handleItemClick(d); + }, + children: d.text + }, d.value); + }) + })] + }); +}; +var Selector$1 = _react_17_0_2_react.exports.memo(Selector); +var createQueryDialog = ""; +const CreateQueryDialog = (props) => { + const { + destroy, + queryId + } = props; + const [title, setTitle] = _react_17_0_2_react.exports.useState(""); + const [filters, setFilters] = _react_17_0_2_react.exports.useState([]); + const requestState = useLoading(false); + const shownMemoLength = memoService.getState().memos.filter((memo2) => { + return checkShouldShowMemoWithFilters(memo2, filters); + }).length; + _react_17_0_2_react.exports.useEffect(() => { + const queryTemp = queryService.getQueryById(queryId != null ? queryId : ""); + if (queryTemp) { + setTitle(queryTemp.title); + const temp = JSON.parse(queryTemp.querystring); + if (Array.isArray(temp)) { + setFilters(temp); } } - const memoShareDiv = document.querySelector(".dialog-wrapper .memo-background .property-image"); - memoShareDiv.style.backgroundImage = "url('" + imageUrl + "')"; - if (document.body.className.contains("theme-dark")) { - memoShareDiv.style.backgroundColor = "#1f1f1f"; - } + }, [queryId]); + const handleTitleInputChange = (e) => { + const text = e.target.value; + setTitle(text); }; - const handleCopytoClipboardBtnClick = async () => { - const { - vault - } = appStore.getState().dailyNotesState.app; - const divs = document.querySelector(".memo-shortcut-img"); - const myBase64 = divs.getAttribute("src").split("base64,")[1]; - const blobInput = convertBase64ToBlob(myBase64, "image/png"); - let aFile; - if (AutoSaveWhenOnMobile && require$$0.Platform.isMobile) { - blobInput.arrayBuffer().then(async (buffer) => { - const ext = "png"; - const dailyNotes = getAllDailyNotes_1(); - for (const string in dailyNotes) { - if (dailyNotes[string] instanceof require$$0.TFile) { - aFile = dailyNotes[string]; - break; - } - } - if (aFile !== void 0) { - await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, aFile), buffer); - } - }); + const handleSaveBtnClick = async () => { + if (!title) { + new require$$0.Notice(t$1("TITLE CANNOT BE NULL!")); + return; } - const clipboardItemInput = new ClipboardItem({ - "image/png": blobInput - }); - window.navigator["clipboard"].write([clipboardItemInput]); - new require$$0.Notice("Send to clipboard successfully"); + if (filters.length === 0) { + new require$$0.Notice(t$1("FILTER CANNOT BE NULL!")); + return; + } + try { + if (queryId) { + const editedQuery = await queryService.updateQuery(queryId, title, JSON.stringify(filters)); + queryService.editQuery(editedQuery); + queryService.getMyAllQueries(); + } else { + const query = await queryService.createQuery(title, JSON.stringify(filters)); + queryService.pushQuery(query); + queryService.getMyAllQueries(); + } + } catch (error) { + new require$$0.Notice(error.message); + } + destroy(); }; - const handleImageOnLoad = (ev) => { - if (ev.type === "error") { - new require$$0.Notice("\u6709\u4E2A\u56FE\u7247\u52A0\u8F7D\u5931\u8D25\u4E86\u{1F61F}"); - ev.target.remove(); + const handleAddFilterBenClick = () => { + if (filters.length > 0) { + const lastFilter = filters[filters.length - 1]; + if (lastFilter.value.value === "") { + new require$$0.Notice(t$1("Please finish the last filter setting first")); + return; + } } - setImgAmount(imgAmount - 1); + setFilters([...filters, getDefaultFilter()]); }; + const handleFilterChange = _react_17_0_2_react.exports.useCallback((index, filter) => { + setFilters((filters2) => { + const temp = [...filters2]; + temp[index] = filter; + return temp; + }); + }, []); + const handleFilterRemove = _react_17_0_2_react.exports.useCallback((index) => { + setFilters((filters2) => { + const temp = filters2.filter((_, i) => i !== index); + return temp; + }); + }, []); return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", { className: "dialog-header-container", @@ -19423,2885 +15211,3965 @@ const ShareMemoImageDialog = (props) => { className: "title-text", children: [/* @__PURE__ */ jsx("span", { className: "icon-text", - children: "\u{1F970}" - }), t("Share Memo Image")] - }), /* @__PURE__ */ jsxs("div", { - className: "btn-group", - children: [/* @__PURE__ */ jsx("button", { - className: "btn copy-btn", - onClick: handleCopytoClipboardBtnClick, - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: share - }) - }), /* @__PURE__ */ jsx("button", { - className: "btn close-btn", - onClick: handleCloseBtnClick, - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: close - }) - })] - })] - }), /* @__PURE__ */ jsxs("div", { - className: "dialog-content-container", - children: [/* @__PURE__ */ jsx("div", { - className: `tip-words-container ${shortcutImgUrl ? "finish" : "loading"}`, - children: /* @__PURE__ */ jsx("p", { - className: "tip-text", - children: shortcutImgUrl ? t("\u2197Click the button to save") : t("Image is generating...") - }) - }), /* @__PURE__ */ jsxs("div", { - className: "memo-container", - ref: memoElRef, - children: [/* @__PURE__ */ jsx(Only, { - when: shortcutImgUrl !== "", - children: /* @__PURE__ */ jsx("img", { - className: "memo-shortcut-img", - src: shortcutImgUrl - }) - }), /* @__PURE__ */ jsxs("div", { - className: "memo-background", - children: [/* @__PURE__ */ jsx("div", { - className: "property-image", - style: { - backgroundSize: "cover", - backgroundRepeat: "no-repeat" - } - }), /* @__PURE__ */ jsx("span", { - className: "background-container" - }), /* @__PURE__ */ jsx("div", { - className: "memo-content-text", - dangerouslySetInnerHTML: { - __html: formatMemoContent(memo2.content) - } - }), /* @__PURE__ */ jsx(Only, { - when: externalImageUrls.length > 0, - children: /* @__PURE__ */ jsx("div", { - className: "images-container", - children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", { - src: imgUrl, - alt: "", - referrerPolicy: "no-referrer", - onLoad: handleImageOnLoad, - onError: handleImageOnLoad - }, idx)) - }) - }), /* @__PURE__ */ jsx(Only, { - when: internalImageUrls.length > 0, - children: /* @__PURE__ */ jsx("div", { - className: "images-container internal-embed image-embed is-loaded", - children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", { - className: "memo-img", - src: imgUrl.path, - alt: imgUrl.altText, - path: imgUrl.filePath - }, idx)) - }) - }), /* @__PURE__ */ jsxs("div", { - className: "watermark-container", - children: [/* @__PURE__ */ jsxs("span", { - className: "normal-text footer-start", - children: [/* @__PURE__ */ jsx("div", { - className: "property-social-icons" - }), /* @__PURE__ */ jsx("span", { - className: "name-text", - children: footerStart - })] - }), /* @__PURE__ */ jsx("span", { - className: "normal-text footer-end", - children: /* @__PURE__ */ jsx("span", { - className: "name-text", - children: footerEnd - }) - })] - })] - })] - })] - })] - }); -}; -function showShareMemoImageDialog(memo2) { - showDialog({ - className: "share-memo-image-dialog" - }, ShareMemoImageDialog, { - memo: memo2 - }); -} -var memo = ""; -const showMemoInDailyNotes = async (memoId) => { - const { app: app2, dailyNotes } = dailyNotesService.getState(); - const lineNum = parseInt(memoId.slice(14)); - const memoDateString = memoId.slice(0, 14); - const date = require$$0.moment(memoDateString, "YYYYMMDDHHmmss"); - const file = getDailyNote_1(date, dailyNotes); - if (!require$$0.Platform.isMobile) { - const leaf = app2.workspace.splitActiveLeaf(); - leaf.openFile(file, { eState: { line: lineNum } }); - } else { - let leaf = app2.workspace.activeLeaf; - if (leaf === null) { - leaf = app2.workspace.getLeaf(true); - } - leaf.openFile(file, { eState: { line: lineNum } }); - } - return; -}; -var more = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTYgMTBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0xMiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptLTYgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6Ii8+PC9zdmc+"; -var taskBlank = "data:image/svg+xml;base64,PHN2ZyB0PSIxNjQyNDA3MDQzMTQ2IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE4ODEiIHdpZHRoPSIyNiIgaGVpZ2h0PSIyNiIgZmlsbD0iIzEyOTZkYiI+PHBhdGggZD0iTTIyNCA4MDAuMjU2TDIyMy43MTIgMjI0SDMyMHYzMS42OGMwIDM1LjQ1NiAyOC42NCA2NC4zMiA2My44NzIgNjQuMzJoMjU2LjI1NkE2NC4xNiA2NC4xNiAwIDAgMCA3MDQgMjU1LjY4VjIyNGw5Ni0wLjI1Nkw4MDAuMjU2IDgwMCAyMjQgODAwLjI1NnpNNjQwIDE5Mi4zMkw2NDAuMTI4IDI1NiAzODQgMjU1LjY4VjE5Mi4zMkwzODMuODcyIDE5MiA2NDAgMTkyLjMyek03OTkuODQgMTYwSDY5NS4wNGMtMTEuMDcyLTE5LjA0LTMxLjQyNC0zMi01NC45MTItMzJoLTI1Ni4yNTZjLTIzLjQ4OCAwLTQzLjgwOCAxMi45MjgtNTQuOTEyIDMySDIyMy43MTJBNjMuNzc2IDYzLjc3NiAwIDAgMCAxNjAgMjIzLjc0NHY1NzYuNTEyQzE2MCA4MzUuMzkyIDE4OC42MDggODY0IDIyMy43NDQgODY0aDU3Ni41MTJBNjMuODQgNjMuODQgMCAwIDAgODY0IDgwMC4yNTZWMjIzLjc0NEE2NCA2NCAwIDAgMCA3OTkuODQgMTYweiIgcC1pZD0iMTg4MiI+PC9wYXRoPjwvc3ZnPg0K"; -const getPathOfImage$2 = (vault, image2) => { - return vault.getResourcePath(image2); -}; -const detectWikiInternalLink$2 = (lineText) => { - var _a, _b; - const { - metadataCache, - vault - } = appStore.getState().dailyNotesState.app; - const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1]; - const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5]; - const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); - if (file === null) { - return { - linkText: internalFileName, - altText: internalAltName, - path: "", - filepath: "" - }; - } else { - const imagePath = getPathOfImage$2(vault, file); - const filePath = file.path; - if (internalAltName) { - return { - linkText: internalFileName, - altText: internalAltName, - path: imagePath, - filepath: filePath - }; - } else { - return { - linkText: internalFileName, - altText: "", - path: imagePath, - filepath: filePath - }; - } - } -}; -const detectMDInternalLink$2 = (lineText) => { - var _a, _b; - const { - metadataCache, - vault - } = appStore.getState().dailyNotesState.app; - const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5]; - const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2]; - const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); - if (file === null) { - return { - linkText: internalFileName, - altText: internalAltName, - path: "", - filepath: "" - }; - } else { - const imagePath = getPathOfImage$2(vault, file); - const filePath = file.path; - if (internalAltName) { - return { - linkText: internalFileName, - altText: internalAltName, - path: imagePath, - filepath: filePath - }; - } else { - return { - linkText: internalFileName, - altText: "", - path: imagePath, - filepath: filePath - }; - } - } + children: "\u{1F516}" + }), queryId ? t$1("EDIT QUERY") : t$1("CREATE QUERY")] + }), /* @__PURE__ */ jsx("button", { + className: "btn close-btn", + onClick: destroy, + children: /* @__PURE__ */ jsx(SvgClose, { + className: "icon-img" + }) + })] + }), /* @__PURE__ */ jsxs("div", { + className: "dialog-content-container", + children: [/* @__PURE__ */ jsxs("div", { + className: "form-item-container input-form-container", + children: [/* @__PURE__ */ jsx("span", { + className: "normal-text", + children: t$1("TITLE") + }), /* @__PURE__ */ jsx("input", { + className: "title-input", + type: "text", + value: title, + onChange: handleTitleInputChange + })] + }), /* @__PURE__ */ jsxs("div", { + className: "form-item-container filter-form-container", + children: [/* @__PURE__ */ jsx("span", { + className: "normal-text", + children: t$1("FILTER") + }), /* @__PURE__ */ jsxs("div", { + className: "filters-wrapper", + children: [filters.map((f2, index) => { + return /* @__PURE__ */ jsx(MemoFilterInputer, { + index, + filter: f2, + handleFilterChange, + handleFilterRemove + }, index); + }), /* @__PURE__ */ jsx("div", { + className: "create-filter-btn", + onClick: handleAddFilterBenClick, + children: t$1("ADD FILTER TERMS") + })] + })] + })] + }), /* @__PURE__ */ jsxs("div", { + className: "dialog-footer-container", + children: [/* @__PURE__ */ jsx("div", {}), /* @__PURE__ */ jsxs("div", { + className: "btns-container", + children: [/* @__PURE__ */ jsxs("span", { + className: `tip-text ${filters.length === 0 && "hidden"}`, + children: [t$1("MATCH"), " Memo ", /* @__PURE__ */ jsx("strong", { + children: shownMemoLength + }), " ", t$1("TIMES")] + }), /* @__PURE__ */ jsx("button", { + className: `btn save-btn ${requestState.isLoading ? "requesting" : ""}`, + onClick: handleSaveBtnClick, + children: "SAVE" + })] + })] + })] + }); }; -const Memo = (props) => { - var _a, _b; +const FilterInputer = (props) => { const { - memo: propsMemo + index, + filter, + handleFilterChange, + handleFilterRemove } = props; - const memo2 = __spreadProps(__spreadValues({}, propsMemo), { - createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt) - }); - const [showConfirmDeleteBtn, toggleConfirmDeleteBtn] = useToggle(false); - let externalImageUrls = []; - let internalImageUrls = []; - let allMarkdownLink = []; - let allInternalLink = []; - if (IMAGE_URL_REG.test(memo2.content)) { - let allExternalImageUrls = []; - let anotherExternalImageUrls = []; - if (MARKDOWN_URL_REG.test(memo2.content)) { - allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG)); - } - if (WIKI_IMAGE_URL_REG.test(memo2.content)) { - allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG)); - } - if (MARKDOWN_WEB_URL_REG.test(memo2.content)) { - allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG)); + const { + type + } = filter; + const [inputElements, setInputElements] = _react_17_0_2_react.exports.useState(/* @__PURE__ */ jsx(Fragment, {})); + _react_17_0_2_react.exports.useEffect(() => { + let operatorElement = /* @__PURE__ */ jsx(Fragment, {}); + if (Object.keys(filterConsts).includes(type)) { + operatorElement = /* @__PURE__ */ jsx(Selector$1, { + className: "operator-selector", + dataSource: Object.values(filterConsts[type].operators), + value: filter.value.operator, + handleValueChanged: handleOperatorChange + }); } - if (allInternalLink.length) { - for (let i = 0; i < allInternalLink.length; i++) { - let one = allInternalLink[i]; - internalImageUrls.push(detectWikiInternalLink$2(one)); + let valueElement = /* @__PURE__ */ jsx(Fragment, {}); + switch (type) { + case "TYPE": { + valueElement = /* @__PURE__ */ jsx(Selector$1, { + className: "value-selector", + dataSource: filterConsts["TYPE"].values, + value: filter.value.value, + handleValueChanged: handleValueChange + }); + break; + } + case "TAG": { + valueElement = /* @__PURE__ */ jsx(Selector$1, { + className: "value-selector", + dataSource: memoService.getState().tags.sort().map((t2) => { + return { + text: t2, + value: t2 + }; + }), + value: filter.value.value, + handleValueChanged: handleValueChange + }); + break; + } + case "TEXT": { + valueElement = /* @__PURE__ */ jsx("input", { + type: "text", + className: "value-inputer", + value: filter.value.value, + onChange: (event) => { + handleValueChange(event.target.value); + event.target.focus(); + } + }); + break; + } + case "DATE": { + valueElement = /* @__PURE__ */ jsx("input", { + type: "text", + className: "value-inputer", + value: filter.value.value, + onChange: (event) => { + handleValueChange(event.target.value); + event.target.focus(); + } + }); + break; } } - if (allMarkdownLink.length) { - for (let i = 0; i < allMarkdownLink.length; i++) { - let two = allMarkdownLink[i]; - if (/(.*)http[s]?(.*)/.test(two)) { - anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _a[5]); - } else { - internalImageUrls.push(detectMDInternalLink$2(two)); + setInputElements(/* @__PURE__ */ jsxs(Fragment, { + children: [operatorElement, valueElement] + })); + }, [type, filter]); + const handleRelationChange = _react_17_0_2_react.exports.useCallback((value) => { + if (["AND", "OR"].includes(value)) { + handleFilterChange(index, __spreadProps(__spreadValues({}, filter), { + relation: value + })); + } + }, [filter]); + const handleTypeChange = _react_17_0_2_react.exports.useCallback((value) => { + if (filter.type !== value) { + const ops = Object.values(filterConsts[value].operators); + handleFilterChange(index, __spreadProps(__spreadValues({}, filter), { + type: value, + value: { + operator: ops[0].value, + value: "" } - } + })); } - externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls); - } - const handleShowMemoStoryDialog = () => { - showMemoCardDialog(memo2); + }, [filter]); + const handleOperatorChange = _react_17_0_2_react.exports.useCallback((value) => { + handleFilterChange(index, __spreadProps(__spreadValues({}, filter), { + value: __spreadProps(__spreadValues({}, filter.value), { + operator: value + }) + })); + }, [filter]); + const handleValueChange = _react_17_0_2_react.exports.useCallback((value) => { + handleFilterChange(index, __spreadProps(__spreadValues({}, filter), { + value: __spreadProps(__spreadValues({}, filter.value), { + value + }) + })); + }, [filter]); + const handleRemoveBtnClick = () => { + handleFilterRemove(index); }; - const handleMarkMemoClick = () => { - if (UseButtonToShowEditor && DefaultEditorLocation === "Bottom") { - let elem = document.querySelector("div[data-type='memos_view'] .view-content .memo-show-editor-button"); - if (typeof elem.onclick == "function" && elem !== void 0) { - elem.onclick.apply(elem); + return /* @__PURE__ */ jsxs("div", { + className: "memo-filter-input-wrapper", + children: [index > 0 ? /* @__PURE__ */ jsx(Selector$1, { + className: "relation-selector", + dataSource: relationConsts, + value: filter.relation, + handleValueChanged: handleRelationChange + }) : null, /* @__PURE__ */ jsx(Selector$1, { + className: "type-selector", + dataSource: Object.values(filterConsts), + value: filter.type, + handleValueChanged: handleTypeChange + }), inputElements, /* @__PURE__ */ jsx(SvgClose, { + className: "remove-btn", + onClick: handleRemoveBtnClick + })] + }); +}; +const MemoFilterInputer = _react_17_0_2_react.exports.memo(FilterInputer); +function showCreateQueryDialog(queryId) { + showDialog({ + className: "create-query-dialog" + }, CreateQueryDialog, { + queryId + }); +} +var queryList = ""; +function SvgMoreWhite(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + xmlns: "http://www.w3.org/2000/svg", + height: "24px", + viewBox: "0 0 24 24", + width: "24px", + fill: "#FFFFFF" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M0 0h24v24H0V0z", + fill: "none" + }), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z" + })); +} +const QueryList = () => { + const { + queryState: { + queries + }, + locationState: { + query: { + filter } } - globalStateService.setMarkMemoId(memo2.id); + } = _react_17_0_2_react.exports.useContext(appContext); + const loadingState = useLoading(); + const sortedQueries = queries.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)).sort((a, b) => { + var _a, _b; + return utils$1.getTimeStampByDate((_a = b.pinnedAt) != null ? _a : 0) - utils$1.getTimeStampByDate((_b = a.pinnedAt) != null ? _b : 0); + }); + _react_17_0_2_react.exports.useEffect(() => { + queryService.getMyAllQueries().catch(() => { + }).finally(() => { + loadingState.setFinish(); + }); + }, []); + return /* @__PURE__ */ jsxs("div", { + className: "queries-wrapper", + children: [/* @__PURE__ */ jsxs("p", { + className: "title-text", + children: [/* @__PURE__ */ jsx("span", { + className: "normal-text", + children: t$1("QUERY") + }), /* @__PURE__ */ jsx("span", { + className: "btn", + onClick: () => showCreateQueryDialog(), + children: "+" + })] + }), /* @__PURE__ */ jsx(Only, { + when: loadingState.isSucceed && sortedQueries.length === 0, + children: /* @__PURE__ */ jsx("div", { + className: "create-query-btn-container", + children: /* @__PURE__ */ jsx("span", { + className: "btn", + onClick: () => showCreateQueryDialog(), + children: t$1("CREATE FILTER") + }) + }) + }), /* @__PURE__ */ jsx("div", { + className: "queries-container", + children: sortedQueries.map((q2) => { + return /* @__PURE__ */ jsx(QueryItemContainer, { + query: q2, + isActive: q2.id === filter + }, q2.id); + }) + })] + }); +}; +const QueryItemContainer = (props) => { + const { + query, + isActive + } = props; + const [showActionBtns, toggleShowActionBtns] = useToggle(false); + const [showConfirmDeleteBtn, toggleConfirmDeleteBtn] = useToggle(false); + const handleQueryClick = () => { + if (isActive) { + locationService.setMemoFilter(""); + } else { + locationService.setMemoFilter(query.id); + } }; - const handleEditMemoClick = () => { - if (UseButtonToShowEditor && DefaultEditorLocation === "Bottom") { - let elem = document.querySelector("div[data-type='memos_view'] .view-content .memo-show-editor-button"); - if (typeof elem.onclick == "function" && elem !== void 0) { - elem.onclick.apply(elem); - } - } - globalStateService.setEditMemoId(memo2.id); + const handleShowActionBtnClick = (event) => { + event.stopPropagation(); + toggleShowActionBtns(); }; - const handleSourceMemoClick = () => { - showMemoInDailyNotes(memo2.id); + const handleActionBtnContainerMouseLeave = () => { + toggleShowActionBtns(false); }; - const handleDeleteMemoClick = async () => { + const handleDeleteMemoClick = async (event) => { + event.stopPropagation(); if (showConfirmDeleteBtn) { try { - await memoService.hideMemoById(memo2.id); + await queryService.deleteQuery(query.id); } catch (error) { new require$$0.Notice(error.message); } - if (globalStateService.getState().editMemoId === memo2.id) { - globalStateService.setEditMemoId(""); - } } else { toggleConfirmDeleteBtn(); } }; - const handleMouseLeaveMemoWrapper = () => { - if (showConfirmDeleteBtn) { - toggleConfirmDeleteBtn(false); - } - }; - const handleGenMemoImageBtnClick = () => { - showShareMemoImageDialog(memo2); - }; - const handleMemoTypeShow = () => { - if (!ShowTaskLabel) { - return; - } - if (memo2.memoType === "TASK-TODO") { - return taskBlank; - } else if (memo2.memoType === "TASK-DONE") { - return task; - } + const handleEditQueryBtnClick = (event) => { + event.stopPropagation(); + showCreateQueryDialog(query.id); }; - const handleMemoKeyDown = _react_17_0_2_react.exports.useCallback((event) => { - if (event.ctrlKey || event.metaKey) { - handleSourceMemoClick(); - } - }, []); - const handleMemoDoubleClick = _react_17_0_2_react.exports.useCallback((event) => { - if (event) { - handleEditMemoClick(); - } - }, []); - const handleMemoContentClick = async (e) => { - var _a2; - const targetEl = e.target; - if (targetEl.className === "memo-link-text") { - const memoId = (_a2 = targetEl.dataset) == null ? void 0 : _a2.value; - const memoTemp = memoService.getMemoById(memoId != null ? memoId : ""); - if (memoTemp) { - showMemoCardDialog(memoTemp); + const handlePinQueryBtnClick = async (event) => { + event.stopPropagation(); + try { + if (query.pinnedAt) { + await queryService.unpinQuery(query.id); + queryService.editQuery(__spreadProps(__spreadValues({}, query), { + pinnedAt: "" + })); } else { - new require$$0.Notice("MEMO Not Found"); - targetEl.classList.remove("memo-link-text"); + await queryService.pinQuery(query.id); + queryService.editQuery(__spreadProps(__spreadValues({}, query), { + pinnedAt: utils$1.getDateTimeString(Date.now()) + })); } - } else if (targetEl.className === "todo-block") - ; + } catch (error) { + } }; - return /* @__PURE__ */ jsxs("div", { - className: `memo-wrapper ${"memos-" + memo2.id} ${memo2.memoType}`, - onMouseLeave: handleMouseLeaveMemoWrapper, - onMouseDown: handleMemoKeyDown, - onDoubleClick: handleMemoDoubleClick, - children: [/* @__PURE__ */ jsxs("div", { - className: "memo-top-wrapper", + const handleDeleteBtnMouseLeave = () => { + toggleConfirmDeleteBtn(false); + }; + return /* @__PURE__ */ jsx(Fragment, { + children: /* @__PURE__ */ jsxs("div", { + className: `query-item-container ${isActive ? "active" : ""}`, + onClick: handleQueryClick, children: [/* @__PURE__ */ jsxs("div", { - className: "memo-top-left-wrapper", + className: "query-text-container", children: [/* @__PURE__ */ jsx("span", { - className: "time-text", - onClick: handleShowMemoStoryDialog, - children: memo2.createdAtStr - }), /* @__PURE__ */ jsx("div", { - className: `memo-type-img ${(memo2.memoType === "TASK-TODO" || memo2.memoType === "TASK-DONE") && ShowTaskLabel ? "" : "hidden"}`, - children: /* @__PURE__ */ jsx("img", { - src: (_b = handleMemoTypeShow()) != null ? _b : "", - alt: "memo-type" - }) + className: "icon-text", + children: "#" + }), /* @__PURE__ */ jsx("span", { + className: "query-text", + children: query.title })] }), /* @__PURE__ */ jsxs("div", { className: "btns-container", children: [/* @__PURE__ */ jsx("span", { - className: "btn more-action-btn", - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: more - }) + className: "action-btn toggle-btn", + onClick: handleShowActionBtnClick, + children: isActive ? /* @__PURE__ */ jsx(SvgMoreWhite, {}) : /* @__PURE__ */ jsx(SvgMore, {}) }), /* @__PURE__ */ jsx("div", { - className: "more-action-btns-wrapper", + className: `action-btns-wrapper ${showActionBtns ? "" : "hidden"}`, + onMouseLeave: handleActionBtnContainerMouseLeave, children: /* @__PURE__ */ jsxs("div", { - className: "more-action-btns-container", + className: "action-btns-container", children: [/* @__PURE__ */ jsx("span", { className: "btn", - onClick: handleShowMemoStoryDialog, - children: t("READ") - }), /* @__PURE__ */ jsx("span", { - className: "btn", - onClick: handleMarkMemoClick, - children: t("MARK") - }), /* @__PURE__ */ jsx("span", { - className: "btn", - onClick: handleGenMemoImageBtnClick, - children: t("SHARE") - }), /* @__PURE__ */ jsx("span", { - className: "btn", - onClick: handleEditMemoClick, - children: t("EDIT") + onClick: handlePinQueryBtnClick, + children: query.pinnedAt ? t$1("UNPIN") : t$1("PIN") }), /* @__PURE__ */ jsx("span", { className: "btn", - onClick: handleSourceMemoClick, - children: t("SOURCE") + onClick: handleEditQueryBtnClick, + children: t$1("EDIT") }), /* @__PURE__ */ jsx("span", { className: `btn delete-btn ${showConfirmDeleteBtn ? "final-confirm" : ""}`, onClick: handleDeleteMemoClick, - children: showConfirmDeleteBtn ? t("CONFIRM\uFF01") : t("DELETE") + onMouseLeave: handleDeleteBtnMouseLeave, + children: showConfirmDeleteBtn ? t$1("CONFIRM\uFF01") : t$1("DELETE") })] }) })] })] - }), /* @__PURE__ */ jsx("div", { - className: "memo-content-text", - onClick: handleMemoContentClick, - dangerouslySetInnerHTML: { - __html: formatMemoContent(memo2.content, memo2.id) + }) + }); +}; +var tagList = ""; +const TagList = () => { + const { + locationState: { + query: { + tag: tagQuery } - }), /* @__PURE__ */ jsx(Only, { - when: externalImageUrls.length > 0, - children: /* @__PURE__ */ jsx("div", { - className: "images-wrapper", - children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, { - alt: "", - className: "memo-img", - imgUrl, - referrerPolicy: "no-referrer" - }, idx)) - }) - }), /* @__PURE__ */ jsx(Only, { - when: internalImageUrls.length > 0, - children: /* @__PURE__ */ jsx("div", { - className: "images-wrapper internal-embed image-embed is-loaded", - children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, { - className: "memo-img", - imgUrl: imgUrl.path, - alt: imgUrl.altText, - filepath: imgUrl.filepath - }, idx)) - }) + }, + memoState: { + tags: tagsText, + tagsNum: tagsCount, + memos + } + } = _react_17_0_2_react.exports.useContext(appContext); + const [tags, setTags] = _react_17_0_2_react.exports.useState([]); + _react_17_0_2_react.exports.useEffect(() => { + memoService.updateTagsState(); + }, [memos]); + _react_17_0_2_react.exports.useEffect(() => { + const sortedTags = Array.from(tagsText).sort(); + const root = { + subTags: [] + }; + for (const tag of sortedTags) { + const subtags = tag.split("/"); + let tempObj = root; + let tagText = ""; + for (let i = 0; i < subtags.length; i++) { + const key = subtags[i]; + if (i === 0) { + tagText += key; + } else { + tagText += "/" + key; + } + let obj = null; + for (const t2 of tempObj.subTags) { + if (t2.text === tagText) { + obj = t2; + break; + } + } + if (!obj) { + obj = { + key, + text: tagText, + count: tagsCount[tagText], + subTags: [] + }; + tempObj.subTags.push(obj); + } + tempObj = obj; + } + } + setTags(root.subTags); + }, [tagsText]); + return /* @__PURE__ */ jsxs("div", { + className: "tags-wrapper", + children: [/* @__PURE__ */ jsx("p", { + className: "title-text", + children: t$1("Frequently Used Tags") + }), /* @__PURE__ */ jsxs("div", { + className: "tags-container", + children: [tags.map((t2, idx) => /* @__PURE__ */ jsx(TagItemContainer, { + tag: t2, + tagQuery + }, t2.text + "-" + idx)), /* @__PURE__ */ jsx(Only, { + when: tags.length < 5 && memoService.initialized, + children: /* @__PURE__ */ jsxs("p", { + className: "tag-tip-container", + children: ["Input", /* @__PURE__ */ jsx("span", { + className: "code-text", + children: "#Tag " + }), "to create tag..."] + }) + })] })] }); }; -function formatMemoContent(content, memoid) { - var _a; - content = encodeHtml(content); - content = parseRawTextToHtml(content).split("
").map((t2) => { - return `

${t2 !== "" ? t2 : "
"}

`; - }).join(""); - const { - shouldUseMarkdownParser, - shouldHideImageUrl - } = globalStateService.getState(); - if (shouldUseMarkdownParser) { - content = parseMarkedToHtml(content, memoid); - } - if (shouldHideImageUrl) { - content = content.replace(WIKI_IMAGE_URL_REG, "").replace(MARKDOWN_URL_REG, "").replace(IMAGE_URL_REG, ""); - } - content = content.replace(TAG_REG, "#$1").replace(FIRST_TAG_REG, "

#$2").replace(LINK_REG, "$1$2").replace(MD_LINK_REG, "$1").replace(MEMO_LINK_REG, "$1"); - const tempDivContainer = document.createElement("div"); - tempDivContainer.innerHTML = content; - for (let i = 0; i < tempDivContainer.children.length; i++) { - const c = tempDivContainer.children[i]; - if (c.tagName === "P" && c.textContent === "" && ((_a = c.firstElementChild) == null ? void 0 : _a.tagName) !== "BR") { - c.remove(); - i--; - continue; - } +const TagItemContainer = (props) => { + const { + tag, + tagQuery + } = props; + const isActive = tagQuery === tag.text; + const hasSubTags = tag.subTags.length > 0; + const [showSubTags, toggleSubTags] = useToggle(false); + const handleTagClick = () => { + if (isActive) { + locationService.setTagQuery(""); + } else { + utils$1.copyTextToClipboard(`#${tag.text} `); + if (!["/", "/recycle"].includes(locationService.getState().pathname)) { + locationService.setPathname("/"); + } + locationService.setTagQuery(tag.text); + } + }; + const handleToggleBtnClick = (event) => { + event.stopPropagation(); + toggleSubTags(); + }; + return /* @__PURE__ */ jsxs(Fragment, { + children: [/* @__PURE__ */ jsxs("div", { + className: `tag-item-container ${isActive ? "active" : ""}`, + onClick: handleTagClick, + children: [/* @__PURE__ */ jsxs("div", { + className: "tag-text-container", + children: [/* @__PURE__ */ jsx("span", { + className: "icon-text", + children: "#" + }), /* @__PURE__ */ jsx("span", { + className: "tag-text", + children: tag.key + })] + }), /* @__PURE__ */ jsxs("div", { + className: "btns-container", + children: [/* @__PURE__ */ jsx("span", { + className: "tag-count", + children: tag.count + }), hasSubTags ? /* @__PURE__ */ jsx("span", { + className: `action-btn toggle-btn ${showSubTags ? "shown" : ""}`, + onClick: handleToggleBtnClick, + children: /* @__PURE__ */ jsx(SvgArrowRight, { + className: "icon-img" + }) + }) : null] + })] + }), hasSubTags ? /* @__PURE__ */ jsx("div", { + className: `subtags-container ${showSubTags ? "" : "hidden"}`, + children: tag.subTags.map((st, idx) => /* @__PURE__ */ jsx(TagItemContainer, { + tag: st, + tagQuery + }, st.text + "-" + idx)) + }) : null] + }); +}; +var usageHeatMap = ""; +const tableConfig = { + width: 12, + height: 7 +}; +const getInitialUsageStat = (usedDaysAmount, beginDayTimestamp) => { + const initialUsageStat = []; + for (let i = 0; i <= usedDaysAmount; i++) { + initialUsageStat.push({ + timestamp: parseInt(require$$0.moment(beginDayTimestamp).add(i, "days").format("x")), + count: 0 + }); } - return tempDivContainer.innerHTML; -} -var Memo$1 = _react_17_0_2_react.exports.memo(Memo); -var memolist = ""; -let copyShownMemos; -const MemoList = () => { + return initialUsageStat; +}; +const UsageHeatMap = () => { + const todayTimeStamp = parseInt(require$$0.moment().endOf("day").format("x")); + const todayDay = new Date(todayTimeStamp).getDay() || 7; + const nullCell = new Array(7 - todayDay).fill(0); + const usedDaysAmount = (tableConfig.width - 1) * tableConfig.height + todayDay; + const beginDayTimestamp = parseInt(require$$0.moment().startOf("day").subtract(usedDaysAmount, "days").format("x")); + const startDate = require$$0.moment().startOf("day").subtract(usedDaysAmount, "days"); const { - locationState: { - query - }, memoState: { memos } } = _react_17_0_2_react.exports.useContext(appContext); - const [isFetching, setFetchStatus] = _react_17_0_2_react.exports.useState(true); - const wrapperElement = _react_17_0_2_react.exports.useRef(null); - const { - tag: tagQuery, - duration, - type: memoContentType, - text: textQuery, - filter: queryId - } = query; - const queryFilter = queryService.getQueryById(queryId); - const showMemoFilter = Boolean(tagQuery || duration && duration.from < duration.to || memoContentType || textQuery || queryFilter); - const shownMemos = showMemoFilter || queryFilter || HideDoneTasks ? memos.filter((memo2) => { - var _a, _b, _c; - let shouldShow = true; - if (memo2.memoType !== void 0) { - if (HideDoneTasks && memo2.memoType === "TASK-DONE") { - shouldShow = false; + const newMemos = memos.filter((memo2) => memo2.linkId === ""); + const [allStat, setAllStat] = dist(getInitialUsageStat(usedDaysAmount, beginDayTimestamp)); + const [popupStat, setPopupStat] = dist(null); + const [currentStat, setCurrentStat] = dist(null); + const [fromTo, setFromTo, fromToRef] = dist(""); + const containerElRef = _react_17_0_2_react.exports.useRef(null); + const popupRef = _react_17_0_2_react.exports.useRef(null); + _react_17_0_2_react.exports.useEffect(() => { + const newStat = getInitialUsageStat(usedDaysAmount, beginDayTimestamp); + for (const m2 of newMemos) { + const creationDate = require$$0.moment(m2.createdAt.replaceAll("/", "-")).startOf("day"); + const index = creationDate.diff(startDate, "days"); + if (index >= 0 && index < newStat.length) { + newStat[index].count += 1; } } - if (queryFilter) { - const filters = JSON.parse(queryFilter.querystring); - if (Array.isArray(filters)) { - shouldShow = checkShouldShowMemoWithFilters(memo2, filters); - } + setAllStat([...newStat]); + }, [memos]); + const handleUsageStatItemMouseEnter = _react_17_0_2_react.exports.useCallback((event, item) => { + var _a, _b; + setPopupStat(item); + if (!popupRef.current) { + return; } - if (tagQuery) { - const tagsSet = new Set(); - for (const t2 of Array.from((_a = memo2.content.match(TAG_REG)) != null ? _a : [])) { - const tag2 = t2.replace(TAG_REG, "$1").trim(); - const items = tag2.split("/"); - let temp = ""; - for (const i of items) { - temp += i; - tagsSet.add(temp); - temp += "/"; + const { + isMobileView + } = globalStateService.getState(); + const targetEl = event.target; + const sidebarEl = document.querySelector(".memos-sidebar-wrapper"); + popupRef.current.style.left = targetEl.offsetLeft - ((_b = (_a = containerElRef.current) == null ? void 0 : _a.offsetLeft) != null ? _b : 0) + "px"; + let topValue = targetEl.offsetTop; + if (!isMobileView) { + topValue -= sidebarEl.scrollTop; + } + popupRef.current.style.top = topValue + "px"; + }, []); + const handleUsageStatItemMouseLeave = _react_17_0_2_react.exports.useCallback(() => { + setPopupStat(null); + }, []); + const handleUsageStatItemClick = _react_17_0_2_react.exports.useCallback((event, item) => { + var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r; + if (((_a = locationService.getState().query.duration) == null ? void 0 : _a.from) === item.timestamp && require$$0.moment((_b = locationService.getState().query.duration) == null ? void 0 : _b.from).diff((_c = locationService.getState().query.duration) == null ? void 0 : _c.to, "day") == 0) { + locationService.setFromAndToQuery(0, 0); + setCurrentStat(null); + setFromTo(null); + } else if (((_d = locationService.getState().query.duration) == null ? void 0 : _d.from) !== item.timestamp && ((_e = locationService.getState().query.duration) == null ? void 0 : _e.from) > 0 && event.shiftKey) { + const timeStampDays = require$$0.moment(item.timestamp).endOf("day").diff((_f = locationService.getState().query.duration) == null ? void 0 : _f.to, "day"); + if (timeStampDays > 0 && require$$0.moment((_g = locationService.getState().query.duration) == null ? void 0 : _g.from).diff((_h = locationService.getState().query.duration) == null ? void 0 : _h.to, "day") == 0) { + setFromTo("from"); + } else if (timeStampDays < 0 && require$$0.moment((_i = locationService.getState().query.duration) == null ? void 0 : _i.from).diff((_j = locationService.getState().query.duration) == null ? void 0 : _j.to, "day") == 0) { + setFromTo("to"); + } + if (require$$0.moment((_k = locationService.getState().query.duration) == null ? void 0 : _k.from).isBefore(item.timestamp)) { + if (fromToRef.current === "to") { + if (timeStampDays < 0) { + locationService.setFromAndToQuery(item.timestamp, (_l = locationService.getState().query.duration) == null ? void 0 : _l.to); + } else { + locationService.setFromAndToQuery(parseInt(require$$0.moment((_m = locationService.getState().query.duration) == null ? void 0 : _m.to).startOf("day").format("x")), parseInt(require$$0.moment(item.timestamp).endOf("day").format("x"))); + setFromTo("from"); + } + } else if (fromToRef.current === "from") { + if (timeStampDays < 0) { + locationService.setFromAndToQuery((_n = locationService.getState().query.duration) == null ? void 0 : _n.from, parseInt(require$$0.moment(item.timestamp).endOf("day").format("x"))); + } else { + locationService.setFromAndToQuery((_o = locationService.getState().query.duration) == null ? void 0 : _o.from, parseInt(require$$0.moment(item.timestamp).endOf("day").format("x"))); + } + } + } else { + if (fromToRef.current === "to") { + locationService.setFromAndToQuery(item.timestamp, (_p = locationService.getState().query.duration) == null ? void 0 : _p.to); + } else if (fromToRef.current === "from") { + locationService.setFromAndToQuery(item.timestamp, parseInt(require$$0.moment((_q = locationService.getState().query.duration) == null ? void 0 : _q.from).endOf("day").format("x"))); + setFromTo("to"); } } - for (const t2 of Array.from((_b = memo2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) { - const tag2 = t2.replace(NOP_FIRST_TAG_REG, "$1").trim(); - const items = tag2.split("/"); - let temp = ""; - for (const i of items) { - temp += i; - tagsSet.add(temp); - temp += "/"; + } else if (((_r = locationService.getState().query.duration) == null ? void 0 : _r.from) === 0 && event.shiftKey) { + locationService.setFromAndToQuery(item.timestamp, parseInt(require$$0.moment().endOf("day").format("x"))); + } else if (item.count > 0 && (event.ctrlKey || event.metaKey)) { + const { + app: app2, + dailyNotes + } = dailyNotesService.getState(); + const file = getDailyNote_1(require$$0.moment(item.timestamp), dailyNotes); + if (!require$$0.Platform.isMobile) { + const leaf = app2.workspace.splitActiveLeaf(); + leaf.openFile(file); + } else { + let leaf = app2.workspace.activeLeaf; + if (leaf === null) { + leaf = app2.workspace.getLeaf(true); } + leaf.openFile(file); + } + } else if (item.count > 0 && !event.shiftKey && !event.ctrlKey && !event.metaKey) { + if (!["/", "/recycle"].includes(locationService.getState().pathname)) { + locationService.setPathname("/"); + } + locationService.setFromAndToQuery(item.timestamp, utils$1.getTimeStampByDate(require$$0.moment(item.timestamp + DAILY_TIMESTAMP).subtract(1, "days").endOf("day").format("YYYY-MM-DD HH:mm:ss"))); + setCurrentStat(item); + } + }, []); + return /* @__PURE__ */ jsxs("div", { + className: "usage-heat-map-wrapper", + ref: containerElRef, + children: [/* @__PURE__ */ jsxs("div", { + className: "day-tip-text-container", + children: [/* @__PURE__ */ jsx("span", { + className: "tip-text", + children: t$1("weekDaysShort")[0] + }), /* @__PURE__ */ jsx("span", { + className: "tip-text" + }), /* @__PURE__ */ jsx("span", { + className: "tip-text", + children: t$1("weekDaysShort")[2] + }), /* @__PURE__ */ jsx("span", { + className: "tip-text" + }), /* @__PURE__ */ jsx("span", { + className: "tip-text", + children: t$1("weekDaysShort")[4] + }), /* @__PURE__ */ jsx("span", { + className: "tip-text" + }), /* @__PURE__ */ jsx("span", { + className: "tip-text", + children: t$1("weekDaysShort")[6] + })] + }), /* @__PURE__ */ jsxs("div", { + ref: popupRef, + className: "usage-detail-container pop-up " + (popupStat ? "" : "hidden"), + children: [popupStat == null ? void 0 : popupStat.count, " memos on", " ", /* @__PURE__ */ jsx("span", { + className: "date-text", + children: new Date(popupStat == null ? void 0 : popupStat.timestamp).toDateString() + })] + }), /* @__PURE__ */ jsxs("div", { + className: "usage-heat-map", + children: [allStat.map((v2, i) => { + const count = v2.count; + const colorLevel = count <= 0 ? "" : count <= 1 ? "stat-day-L1-bg" : count <= 2 ? "stat-day-L2-bg" : count <= 4 ? "stat-day-L3-bg" : "stat-day-L4-bg"; + return /* @__PURE__ */ jsx("span", { + className: `stat-container ${colorLevel} ${currentStat === v2 ? "current" : ""} ${todayTimeStamp === v2.timestamp ? "today" : ""}`, + onMouseEnter: (e) => handleUsageStatItemMouseEnter(e, v2), + onMouseLeave: handleUsageStatItemMouseLeave, + onClick: (e) => handleUsageStatItemClick(e, v2) + }, i); + }), nullCell.map((v2, i) => /* @__PURE__ */ jsx("span", { + className: "stat-container null" + }, i))] + })] + }); +}; +var siderbar = ""; +const Sidebar = () => { + const { + locationState, + globalState: { + isMobileView, + showSiderbarInMobileView + } + } = _react_17_0_2_react.exports.useContext(appContext); + const wrapperElRef = _react_17_0_2_react.exports.useRef(null); + const handleClickOutsideOfWrapper = _react_17_0_2_react.exports.useMemo(() => { + return (event) => { + var _a, _b, _c; + const siderbarShown = globalStateService.getState().showSiderbarInMobileView; + if (!siderbarShown) { + window.removeEventListener("click", handleClickOutsideOfWrapper, { + capture: true + }); + return; } - for (const t2 of Array.from((_c = memo2.content.match(FIRST_TAG_REG)) != null ? _c : [])) { - const tag2 = t2.replace(FIRST_TAG_REG, "$2").trim(); - const items = tag2.split("/"); - let temp = ""; - for (const i of items) { - temp += i; - tagsSet.add(temp); - temp += "/"; + if (!((_a = wrapperElRef.current) == null ? void 0 : _a.contains(event.target))) { + if ((_c = (_b = wrapperElRef.current) == null ? void 0 : _b.parentNode) == null ? void 0 : _c.contains(event.target)) { + if (siderbarShown) { + event.stopPropagation(); + } + globalStateService.setShowSiderbarInMobileView(false); + window.removeEventListener("click", handleClickOutsideOfWrapper, { + capture: true + }); } } - if (!tagsSet.has(tagQuery)) { - shouldShow = false; - } - } - if (duration && duration.from < duration.to && (utils$1.getTimeStampByDate(memo2.createdAt) < duration.from || utils$1.getTimeStampByDate(memo2.createdAt) > duration.to)) { - shouldShow = false; + }; + }, []); + _react_17_0_2_react.exports.useEffect(() => { + globalStateService.setShowSiderbarInMobileView(false); + }, [locationState]); + _react_17_0_2_react.exports.useEffect(() => { + if (showSiderbarInMobileView) { + document.body.classList.add(SHOW_SIDERBAR_MOBILE_CLASSNAME); + } else { + document.body.classList.remove(SHOW_SIDERBAR_MOBILE_CLASSNAME); } - if (memoContentType) { - if (memoContentType === "NOT_TAGGED" && (memo2.content.match(TAG_REG) !== null || memo2.content.match(NOP_FIRST_TAG_REG) !== null)) { - shouldShow = false; - } else if (memoContentType === "LINKED" && memo2.content.match(LINK_REG) === null) { - shouldShow = false; - } else if (memoContentType === "IMAGED" && memo2.content.match(IMAGE_URL_REG) === null) { - shouldShow = false; - } else if (memoContentType === "CONNECTED" && memo2.content.match(MEMO_LINK_REG) === null) { - shouldShow = false; - } + }, [showSiderbarInMobileView]); + _react_17_0_2_react.exports.useEffect(() => { + if (isMobileView && showSiderbarInMobileView) { + window.addEventListener("click", handleClickOutsideOfWrapper, { + capture: true + }); } - if (textQuery && !memo2.content.includes(textQuery)) { - shouldShow = false; + }, [isMobileView, showSiderbarInMobileView]); + return /* @__PURE__ */ jsxs("aside", { + className: "memos-sidebar-wrapper", + ref: wrapperElRef, + children: [/* @__PURE__ */ jsx(UserBanner, {}), /* @__PURE__ */ jsx(UsageHeatMap, {}), /* @__PURE__ */ jsx(QueryList, {}), /* @__PURE__ */ jsx(TagList, {})] + }); +}; +var home = ""; +function Home$1() { + const { + locationState: { + pathname } - return shouldShow; - }) : memos; - copyShownMemos = shownMemos; + } = _react_17_0_2_react.exports.useContext(appContext); + const loadingState = useLoading(); _react_17_0_2_react.exports.useEffect(() => { - memoService.fetchAllMemos().then(() => { - setFetchStatus(false); - }).catch(() => { - new require$$0.Notice("\u{1F62D} Fetch Error"); - }); - dailyNotesService.getMyAllDailyNotes().then(() => { - setFetchStatus(false); - }).catch(() => { - new require$$0.Notice("\u{1F62D} Fetch DailyNotes Error"); - }); - dailyNotesService.getState(); + loadingState.setFinish(); }, []); + return /* @__PURE__ */ jsx(Fragment, { + children: /* @__PURE__ */ jsxs("section", { + id: "page-wrapper", + children: [/* @__PURE__ */ jsx(Sidebar, {}), /* @__PURE__ */ jsx("main", { + className: "content-wrapper", + children: homeRouterSwitch(pathname) + })] + }) + }); +} +function Home() { + _react_17_0_2_react.exports.useContext(appContext); + const loadingState = useLoading(); _react_17_0_2_react.exports.useEffect(() => { - var _a; - (_a = wrapperElement.current) == null ? void 0 : _a.scrollTo({ - top: 0 - }); - }, [query]); - const handleMemoListClick = _react_17_0_2_react.exports.useCallback((event) => { - const { - workspace - } = appStore.getState().dailyNotesState.app; - const targetEl = event.target; - if (targetEl.tagName === "SPAN" && targetEl.className === "tag-span") { - const tagName = targetEl.innerText.slice(1); - const currTagQuery = locationService.getState().query.tag; - if (currTagQuery === tagName) { - locationService.setTagQuery(""); - } else { - locationService.setTagQuery(tagName); - } - } else if (targetEl.tagName === "A" && targetEl.className === "internal-link") { - const sourcePath = targetEl.getAttribute("data-filepath"); - if (require$$0.Platform.isMobile) { - workspace.openLinkText(sourcePath, sourcePath, false); + loadingState.setFinish(); + }, []); + return /* @__PURE__ */ jsx(Fragment, {}); +} +const appRouter = { + "/homeboard": /* @__PURE__ */ jsx(Home, {}), + "*": /* @__PURE__ */ jsx(Home$1, {}) +}; +var memoEditor = ""; +var selectDatePicker = ""; +function SvgTag(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + xmlns: "http://www.w3.org/2000/svg", + enableBackground: "new 0 0 24 24", + height: "24px", + viewBox: "0 0 24 24", + width: "24px", + fill: "#000000" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("g", null, /* @__PURE__ */ _react_17_0_2_react.exports.createElement("rect", { + fill: "none", + height: 24, + width: 24 + })), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("g", null, /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M20,10V8h-4V4h-2v4h-4V4H8v4H4v2h4v4H4v2h4v4h2v-4h4v4h2v-4h4v-2h-4v-4H20z M14,14h-4v-4h4V14z" + }))); +} +function SvgImage(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + xmlns: "http://www.w3.org/2000/svg", + height: "24px", + viewBox: "0 0 24 24", + width: "24px", + fill: "#000000" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M0 0h24v24H0V0z", + fill: "none" + }), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4.86 8.86l-3 3.87L9 13.14 6 17h12l-3.86-5.14z" + })); +} +function SvgJournal(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + t: 1642406967115, + className: "icon", + viewBox: "0 0 1024 1024", + xmlns: "http://www.w3.org/2000/svg", + "p-id": 1652, + width: 26, + height: 26, + fill: "#1296db" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M544 800.128l-320 0.16-0.064-96.32-0.064-160-0.032-64-0.096-160-0.032-96h576.128L800 223.776 800.256 800 544 800.128zM799.84 160H223.712A63.808 63.808 0 0 0 160 223.744v576.544c0 35.136 28.608 63.68 63.744 63.68h576.512A63.808 63.808 0 0 0 864 800.32V223.744A64 64 0 0 0 799.84 160z", + "p-id": 1653 + }), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M680.608 320h-224a32 32 0 0 0 0 64h224a32 32 0 0 0 0-64M680.608 480h-224a32 32 0 0 0 0 64h224a32 32 0 0 0 0-64M680.608 640h-224a32 32 0 0 0 0 64h224a32 32 0 0 0 0-64M352 320a32 32 0 1 0 0 64 32 32 0 0 0 0-64M352 480a32 32 0 1 0 0 64 32 32 0 0 0 0-64M352 640a32 32 0 1 0 0 64 32 32 0 0 0 0-64", + "p-id": 1654 + })); +} +function SvgCheckboxActive(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + xmlns: "http://www.w3.org/2000/svg", + height: "24px", + viewBox: "0 0 24 24", + width: "24px", + fill: "#37352f" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M0 0h24v24H0V0z", + fill: "none" + }), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14zM17.99 9l-1.41-1.42-6.59 6.59-2.58-2.57-1.42 1.41 4 3.99z" + })); +} +var showEditorSvg = "data:image/svg+xml;base64,PHN2ZyB0PSIxNjQyNTY0NDUyMjA4IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjYxOTQiIHdpZHRoPSIzNiIgaGVpZ2h0PSIzNiI+PHBhdGggZD0iTTUxMiAzMkMyNDggMzIgMzIgMjQ4IDMyIDUxMnMyMTYgNDgwIDQ4MCA0ODAgNDgwLTIxNiA0ODAtNDgwUzc3NiAzMiA1MTIgMzJ6IiBmaWxsPSIjRkZGRkZGIiBwLWlkPSI2MTk1Ij48L3BhdGg+PHBhdGggZD0iTTUxMiAwQzIyOC44IDAgMCAyMjguOCAwIDUxMnMyMjguOCA1MTIgNTEyIDUxMiA1MTItMjI4LjggNTEyLTUxMlM3OTUuMiAwIDUxMiAweiBtMCA5OTJDMjQ4IDk5MiAzMiA3NzYgMzIgNTEyUzI0OCAzMiA1MTIgMzJzNDgwIDIxNiA0ODAgNDgwLTIxNiA0ODAtNDgwIDQ4MHoiIGZpbGw9IiIgcC1pZD0iNjE5NiI+PC9wYXRoPjxwYXRoIGQ9Ik01MTIgNTEybS0zOTIgMGEzOTIgMzkyIDAgMSAwIDc4NCAwIDM5MiAzOTIgMCAxIDAtNzg0IDBaIiBmaWxsPSIjOURFOEY3IiBwLWlkPSI2MTk3Ij48L3BhdGg+PHBhdGggZD0iTTc4NCA0OTZINTI4VjI0MGgtMzJ2MjU2SDI0MHYzMmgyNTZ2MjU2aDMyVjUyOGgyNTZ6IiBmaWxsPSIjMUExNzE4IiBwLWlkPSI2MTk4Ij48L3BhdGg+PC9zdmc+"; +var fromEntries = function fromEntries2(entries) { + return entries.reduce(function(acc, _ref) { + var key = _ref[0], value = _ref[1]; + acc[key] = value; + return acc; + }, {}); +}; +var useIsomorphicLayoutEffect = typeof window !== "undefined" && window.document && window.document.createElement ? _react_17_0_2_react.exports.useLayoutEffect : _react_17_0_2_react.exports.useEffect; +var top = "top"; +var bottom = "bottom"; +var right = "right"; +var left = "left"; +var auto = "auto"; +var basePlacements = [top, bottom, right, left]; +var start = "start"; +var end = "end"; +var clippingParents = "clippingParents"; +var viewport = "viewport"; +var popper = "popper"; +var reference = "reference"; +var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) { + return acc.concat([placement + "-" + start, placement + "-" + end]); +}, []); +var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) { + return acc.concat([placement, placement + "-" + start, placement + "-" + end]); +}, []); +var beforeRead = "beforeRead"; +var read = "read"; +var afterRead = "afterRead"; +var beforeMain = "beforeMain"; +var main = "main"; +var afterMain = "afterMain"; +var beforeWrite = "beforeWrite"; +var write = "write"; +var afterWrite = "afterWrite"; +var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; +function getNodeName(element) { + return element ? (element.nodeName || "").toLowerCase() : null; +} +function getWindow(node) { + if (node == null) { + return window; + } + if (node.toString() !== "[object Window]") { + var ownerDocument = node.ownerDocument; + return ownerDocument ? ownerDocument.defaultView || window : window; + } + return node; +} +function isElement(node) { + var OwnElement = getWindow(node).Element; + return node instanceof OwnElement || node instanceof Element; +} +function isHTMLElement(node) { + var OwnElement = getWindow(node).HTMLElement; + return node instanceof OwnElement || node instanceof HTMLElement; +} +function isShadowRoot(node) { + if (typeof ShadowRoot === "undefined") { + return false; + } + var OwnElement = getWindow(node).ShadowRoot; + return node instanceof OwnElement || node instanceof ShadowRoot; +} +function applyStyles(_ref) { + var state = _ref.state; + Object.keys(state.elements).forEach(function(name) { + var style = state.styles[name] || {}; + var attributes = state.attributes[name] || {}; + var element = state.elements[name]; + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } + Object.assign(element.style, style); + Object.keys(attributes).forEach(function(name2) { + var value = attributes[name2]; + if (value === false) { + element.removeAttribute(name2); } else { - workspace.openLinkText(sourcePath, sourcePath, true); + element.setAttribute(name2, value === true ? "" : value); } - } - }, []); - return /* @__PURE__ */ jsxs("div", { - className: `memolist-wrapper ${isFetching ? "" : "completed"}`, - onClick: handleMemoListClick, - ref: wrapperElement, - children: [shownMemos.map((memo2) => /* @__PURE__ */ jsx(Memo$1, { - memo: memo2 - }, `${memo2.id}-${memo2.updatedAt}`)), /* @__PURE__ */ jsx("div", { - className: "status-text-container", - children: /* @__PURE__ */ jsx("p", { - className: "status-text", - children: isFetching ? t("Fetching data...") : shownMemos.length === 0 ? t("Noooop!") : showMemoFilter ? "" : t("All Data is Loaded \u{1F389}") - }) - })] + }); }); -}; -const getMemosByDate = (memos) => { - const dataArr = []; - memos.map((mapItem) => { - if (dataArr.length == 0) { - dataArr.push({ date: require$$0.moment(mapItem.createdAt, "YYYY/MM/DD HH:mm:ss").format("YYYY-MM-DD"), have: [mapItem] }); - } else { - const res = dataArr.some((item) => { - if (item.date == require$$0.moment(mapItem.createdAt, "YYYY/MM/DD HH:mm:ss").format("YYYY-MM-DD")) { - item.have.push(mapItem); - return true; - } - }); - if (!res) { - dataArr.push({ date: require$$0.moment(mapItem.createdAt, "YYYY/MM/DD HH:mm:ss").format("YYYY-MM-DD"), have: [mapItem] }); +} +function effect$2(_ref2) { + var state = _ref2.state; + var initialStyles = { + popper: { + position: state.options.strategy, + left: "0", + top: "0", + margin: "0" + }, + arrow: { + position: "absolute" + }, + reference: {} + }; + Object.assign(state.elements.popper.style, initialStyles.popper); + state.styles = initialStyles; + if (state.elements.arrow) { + Object.assign(state.elements.arrow.style, initialStyles.arrow); + } + return function() { + Object.keys(state.elements).forEach(function(name) { + var element = state.elements[name]; + var attributes = state.attributes[name] || {}; + var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); + var style = styleProperties.reduce(function(style2, property) { + style2[property] = ""; + return style2; + }, {}); + if (!isHTMLElement(element) || !getNodeName(element)) { + return; } - } - }); - return dataArr; + Object.assign(element.style, style); + Object.keys(attributes).forEach(function(attribute) { + element.removeAttribute(attribute); + }); + }); + }; +} +var applyStyles$1 = { + name: "applyStyles", + enabled: true, + phase: "write", + fn: applyStyles, + effect: effect$2, + requires: ["computeStyles"] }; -const transferMemosIntoText = (dailyMemos) => { - let outputText = ""; - let dataArr = []; - let indent = ""; - const { format: format2 } = getDailyNoteSettings_1(); - dailyMemos.map((mapItem) => { - dataArr = mapItem.have; - if (ShowDate) { - outputText = outputText + "- [[" + require$$0.moment(mapItem.date, "YYYY-MM-DD").format(format2) + "]]\n"; - indent = " "; +function getBasePlacement(placement) { + return placement.split("-")[0]; +} +var max = Math.max; +var min = Math.min; +var round = Math.round; +function getBoundingClientRect(element, includeScale) { + if (includeScale === void 0) { + includeScale = false; + } + var rect = element.getBoundingClientRect(); + var scaleX = 1; + var scaleY = 1; + if (isHTMLElement(element) && includeScale) { + var offsetHeight = element.offsetHeight; + var offsetWidth = element.offsetWidth; + if (offsetWidth > 0) { + scaleX = round(rect.width) / offsetWidth || 1; } - if (ShowTime) { - for (let i = 0; i < dataArr.length; i++) { - const time = require$$0.moment(dataArr[i].createdAt, "YYYY/MM/DD HH:mm:ss").format("HH:mm"); - let formatContent; - if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) { - formatContent = DefaultMemoComposition.replace(/{TIME}/g, time).replace(/{CONTENT}/g, dataArr[i].content); - } else { - formatContent = time + " " + dataArr[i].content; - } - if (dataArr[i].memoType === "JOURNAL") { - outputText = outputText + indent + "- " + formatContent + "\n"; - } else { - if (dataArr[i].memoType === "TASK-TODO") { - outputText = outputText + indent + "- [ ] " + formatContent + "\n"; - } else if (dataArr[i].memoType === "TASK-DONE") { - outputText = outputText + indent + "- [x] " + formatContent + "\n"; - } else { - const taskMark = dataArr[i].memoType.match(/TASK-(.*)?/g)[1]; - outputText = outputText + indent + "- [" + taskMark + "] " + formatContent + "\n"; - } - } + if (offsetHeight > 0) { + scaleY = round(rect.height) / offsetHeight || 1; + } + } + return { + width: rect.width / scaleX, + height: rect.height / scaleY, + top: rect.top / scaleY, + right: rect.right / scaleX, + bottom: rect.bottom / scaleY, + left: rect.left / scaleX, + x: rect.left / scaleX, + y: rect.top / scaleY + }; +} +function getLayoutRect(element) { + var clientRect = getBoundingClientRect(element); + var width = element.offsetWidth; + var height = element.offsetHeight; + if (Math.abs(clientRect.width - width) <= 1) { + width = clientRect.width; + } + if (Math.abs(clientRect.height - height) <= 1) { + height = clientRect.height; + } + return { + x: element.offsetLeft, + y: element.offsetTop, + width, + height + }; +} +function contains(parent, child) { + var rootNode = child.getRootNode && child.getRootNode(); + if (parent.contains(child)) { + return true; + } else if (rootNode && isShadowRoot(rootNode)) { + var next = child; + do { + if (next && parent.isSameNode(next)) { + return true; } + next = next.parentNode || next.host; + } while (next); + } + return false; +} +function getComputedStyle$1(element) { + return getWindow(element).getComputedStyle(element); +} +function isTableElement(element) { + return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0; +} +function getDocumentElement(element) { + return ((isElement(element) ? element.ownerDocument : element.document) || window.document).documentElement; +} +function getParentNode(element) { + if (getNodeName(element) === "html") { + return element; + } + return element.assignedSlot || element.parentNode || (isShadowRoot(element) ? element.host : null) || getDocumentElement(element); +} +function getTrueOffsetParent(element) { + if (!isHTMLElement(element) || getComputedStyle$1(element).position === "fixed") { + return null; + } + return element.offsetParent; +} +function getContainingBlock(element) { + var isFirefox = navigator.userAgent.toLowerCase().indexOf("firefox") !== -1; + var isIE = navigator.userAgent.indexOf("Trident") !== -1; + if (isIE && isHTMLElement(element)) { + var elementCss = getComputedStyle$1(element); + if (elementCss.position === "fixed") { + return null; + } + } + var currentNode = getParentNode(element); + while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) { + var css = getComputedStyle$1(currentNode); + if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") { + return currentNode; } else { - for (let i = 0; i < dataArr.length; i++) { - if (dataArr[i].memoType === "JOURNAL") { - outputText = outputText + indent + "- " + dataArr[i].content + "\n"; - } else { - if (dataArr[i].memoType === "TASK-TODO") { - outputText = outputText + indent + "- [ ] " + dataArr[i].content + "\n"; - } else if (dataArr[i].memoType === "TASK-DONE") { - outputText = outputText + indent + "- [x] " + dataArr[i].content + "\n"; - } else { - const taskMark = dataArr[i].memoType.match(/TASK-(.*)?/g)[1]; - outputText = outputText + indent + "- [" + taskMark + "] " + dataArr[i].content + "\n"; - } - } - } + currentNode = currentNode.parentNode; } - if (ShowDate && AddBlankLineWhenDate) { - outputText = outputText + "\n"; + } + return null; +} +function getOffsetParent(element) { + var window2 = getWindow(element); + var offsetParent = getTrueOffsetParent(element); + while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === "static") { + offsetParent = getTrueOffsetParent(offsetParent); + } + if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle$1(offsetParent).position === "static")) { + return window2; + } + return offsetParent || getContainingBlock(element) || window2; +} +function getMainAxisFromPlacement(placement) { + return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y"; +} +function within(min$1, value, max$1) { + return max(min$1, min(value, max$1)); +} +function withinMaxClamp(min2, value, max2) { + var v2 = within(min2, value, max2); + return v2 > max2 ? max2 : v2; +} +function getFreshSideObject() { + return { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; +} +function mergePaddingObject(paddingObject) { + return Object.assign({}, getFreshSideObject(), paddingObject); +} +function expandToHashMap(value, keys) { + return keys.reduce(function(hashMap, key) { + hashMap[key] = value; + return hashMap; + }, {}); +} +var toPaddingObject = function toPaddingObject2(padding, state) { + padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, { + placement: state.placement + })) : padding; + return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); +}; +function arrow(_ref) { + var _state$modifiersData$; + var state = _ref.state, name = _ref.name, options = _ref.options; + var arrowElement = state.elements.arrow; + var popperOffsets2 = state.modifiersData.popperOffsets; + var basePlacement = getBasePlacement(state.placement); + var axis = getMainAxisFromPlacement(basePlacement); + var isVertical = [left, right].indexOf(basePlacement) >= 0; + var len = isVertical ? "height" : "width"; + if (!arrowElement || !popperOffsets2) { + return; + } + var paddingObject = toPaddingObject(options.padding, state); + var arrowRect = getLayoutRect(arrowElement); + var minProp = axis === "y" ? top : left; + var maxProp = axis === "y" ? bottom : right; + var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len]; + var startDiff = popperOffsets2[axis] - state.rects.reference[axis]; + var arrowOffsetParent = getOffsetParent(arrowElement); + var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; + var centerToReference = endDiff / 2 - startDiff / 2; + var min2 = paddingObject[minProp]; + var max2 = clientSize - arrowRect[len] - paddingObject[maxProp]; + var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; + var offset2 = within(min2, center, max2); + var axisProp = axis; + state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$); +} +function effect$1(_ref2) { + var state = _ref2.state, options = _ref2.options; + var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element; + if (arrowElement == null) { + return; + } + if (typeof arrowElement === "string") { + arrowElement = state.elements.popper.querySelector(arrowElement); + if (!arrowElement) { + return; } - }); - const removeBrContent = outputText.replace(/
/g, "\n "); - return removeBrContent; + } + if (!contains(state.elements.popper, arrowElement)) { + return; + } + state.elements.arrow = arrowElement; +} +var arrow$1 = { + name: "arrow", + enabled: true, + phase: "main", + fn: arrow, + effect: effect$1, + requires: ["popperOffsets"], + requiresIfExists: ["preventOverflow"] }; -const MemoFilter = () => { - const { - locationState: { - query +function getVariation(placement) { + return placement.split("-")[1]; +} +var unsetSides = { + top: "auto", + right: "auto", + bottom: "auto", + left: "auto" +}; +function roundOffsetsByDPR(_ref) { + var x2 = _ref.x, y2 = _ref.y; + var win = window; + var dpr = win.devicePixelRatio || 1; + return { + x: round(x2 * dpr) / dpr || 0, + y: round(y2 * dpr) / dpr || 0 + }; +} +function mapToStyles(_ref2) { + var _Object$assign2; + var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed; + var _offsets$x = offsets.x, x2 = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y2 = _offsets$y === void 0 ? 0 : _offsets$y; + var _ref3 = typeof roundOffsets === "function" ? roundOffsets({ + x: x2, + y: y2 + }) : { + x: x2, + y: y2 + }; + x2 = _ref3.x; + y2 = _ref3.y; + var hasX = offsets.hasOwnProperty("x"); + var hasY = offsets.hasOwnProperty("y"); + var sideX = left; + var sideY = top; + var win = window; + if (adaptive) { + var offsetParent = getOffsetParent(popper2); + var heightProp = "clientHeight"; + var widthProp = "clientWidth"; + if (offsetParent === getWindow(popper2)) { + offsetParent = getDocumentElement(popper2); + if (getComputedStyle$1(offsetParent).position !== "static" && position === "absolute") { + heightProp = "scrollHeight"; + widthProp = "scrollWidth"; + } } - } = _react_17_0_2_react.exports.useContext(appContext); - const { - tag: tagQuery, - duration, - type: memoType, - text: textQuery, - filter - } = query; - const queryFilter = queryService.getQueryById(filter); - const showFilter = Boolean(tagQuery || duration && duration.from < duration.to || memoType || textQuery || queryFilter); - const handleCopyClick = async () => { - if (copyShownMemos.length > 0) { - const memosByDate = getMemosByDate(copyShownMemos); - const queryDailyMemos = transferMemosIntoText(memosByDate); - await utils$1.copyTextToClipboard(queryDailyMemos); + offsetParent = offsetParent; + if (placement === top || (placement === left || placement === right) && variation === end) { + sideY = bottom; + var offsetY = isFixed && win.visualViewport ? win.visualViewport.height : offsetParent[heightProp]; + y2 -= offsetY - popperRect.height; + y2 *= gpuAcceleration ? 1 : -1; + } + if (placement === left || (placement === top || placement === bottom) && variation === end) { + sideX = right; + var offsetX = isFixed && win.visualViewport ? win.visualViewport.width : offsetParent[widthProp]; + x2 -= offsetX - popperRect.width; + x2 *= gpuAcceleration ? 1 : -1; } + } + var commonStyles = Object.assign({ + position + }, adaptive && unsetSides); + var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ + x: x2, + y: y2 + }) : { + x: x2, + y: y2 }; - return /* @__PURE__ */ jsxs("div", { - className: `filter-query-container ${showFilter ? "" : "hidden"}`, - children: [/* @__PURE__ */ jsxs("div", { - className: "filter-query", - children: [/* @__PURE__ */ jsx("span", { - className: "tip-text", - children: "FILTER: " - }), /* @__PURE__ */ jsxs("div", { - className: "filter-item-container " + (queryFilter ? "" : "hidden"), - onClick: () => { - locationService.setMemoFilter(""); - }, - children: [/* @__PURE__ */ jsx("span", { - className: "icon-text", - children: "\u{1F516}" - }), " ", queryFilter == null ? void 0 : queryFilter.title] - }), /* @__PURE__ */ jsxs("div", { - className: "filter-item-container " + (tagQuery ? "" : "hidden"), - onClick: () => { - locationService.setTagQuery(""); - }, - children: [/* @__PURE__ */ jsx("span", { - className: "icon-text", - children: "\u{1F3F7}\uFE0F" - }), " ", tagQuery] - }), /* @__PURE__ */ jsxs("div", { - className: "filter-item-container " + (memoType ? "" : "hidden"), - onClick: () => { - locationService.setMemoTypeQuery(""); - }, - children: [/* @__PURE__ */ jsx("span", { - className: "icon-text", - children: "\u{1F4E6}" - }), " ", getTextWithMemoType(memoType)] - }), duration && duration.from < duration.to ? /* @__PURE__ */ jsxs("div", { - className: "filter-item-container", - onClick: () => { - locationService.setFromAndToQuery(0, 0); - }, - children: [/* @__PURE__ */ jsx("span", { - className: "icon-text", - children: "\u{1F5D3}\uFE0F" - }), " ", require$$0.moment(duration.from, "x").format("YYYY/MM/DD"), " ", t("to"), " ", require$$0.moment(duration.to, "x").add(1, "days").format("YYYY/MM/DD")] - }) : null, /* @__PURE__ */ jsxs("div", { - className: "filter-item-container " + (textQuery ? "" : "hidden"), - onClick: () => { - locationService.setTextQuery(""); - }, - children: [/* @__PURE__ */ jsx("span", { - className: "icon-text", - children: "\u{1F50D}" - }), " ", textQuery] - })] - }), /* @__PURE__ */ jsx("div", { - className: "copy-memo", - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: copy, - onClick: handleCopyClick - }) - })] + x2 = _ref4.x; + y2 = _ref4.y; + if (gpuAcceleration) { + var _Object$assign; + return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x2 + "px, " + y2 + "px)" : "translate3d(" + x2 + "px, " + y2 + "px, 0)", _Object$assign)); + } + return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y2 + "px" : "", _Object$assign2[sideX] = hasX ? x2 + "px" : "", _Object$assign2.transform = "", _Object$assign2)); +} +function computeStyles(_ref5) { + var state = _ref5.state, options = _ref5.options; + var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; + var commonStyles = { + placement: getBasePlacement(state.placement), + variation: getVariation(state.placement), + popper: state.elements.popper, + popperRect: state.rects.popper, + gpuAcceleration, + isFixed: state.options.strategy === "fixed" + }; + if (state.modifiersData.popperOffsets != null) { + state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.popperOffsets, + position: state.options.strategy, + adaptive, + roundOffsets + }))); + } + if (state.modifiersData.arrow != null) { + state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.arrow, + position: "absolute", + adaptive: false, + roundOffsets + }))); + } + state.attributes.popper = Object.assign({}, state.attributes.popper, { + "data-popper-placement": state.placement }); +} +var computeStyles$1 = { + name: "computeStyles", + enabled: true, + phase: "beforeWrite", + fn: computeStyles, + data: {} }; -function Memos$1() { - if (require$$0.Platform.isMobile && DefaultEditorLocation === "Bottom") { - return /* @__PURE__ */ jsxs(Fragment, { - children: [/* @__PURE__ */ jsx(MemosHeader, {}), /* @__PURE__ */ jsx(MemoFilter, {}), /* @__PURE__ */ jsx(MemoList, {}), /* @__PURE__ */ jsx(MemoEditor, {})] - }); - } else { - return /* @__PURE__ */ jsxs(Fragment, { - children: [/* @__PURE__ */ jsx(MemosHeader, {}), /* @__PURE__ */ jsx(MemoEditor, {}), /* @__PURE__ */ jsx(MemoFilter, {}), /* @__PURE__ */ jsx(MemoList, {})] +var passive = { + passive: true +}; +function effect(_ref) { + var state = _ref.state, instance = _ref.instance, options = _ref.options; + var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize; + var window2 = getWindow(state.elements.popper); + var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); + if (scroll) { + scrollParents.forEach(function(scrollParent) { + scrollParent.addEventListener("scroll", instance.update, passive); }); } -} -function useLoading(initialState = true) { - const [state, setState] = _react_17_0_2_react.exports.useState({ isLoading: initialState, isFailed: false, isSucceed: false }); - return __spreadProps(__spreadValues({}, state), { - setLoading: () => { - setState(__spreadProps(__spreadValues({}, state), { - isLoading: true, - isFailed: false, - isSucceed: false - })); - }, - setFinish: () => { - setState(__spreadProps(__spreadValues({}, state), { - isLoading: false, - isFailed: false, - isSucceed: true - })); - }, - setError: () => { - setState(__spreadProps(__spreadValues({}, state), { - isLoading: false, - isFailed: true, - isSucceed: false - })); + if (resize) { + window2.addEventListener("resize", instance.update, passive); + } + return function() { + if (scroll) { + scrollParents.forEach(function(scrollParent) { + scrollParent.removeEventListener("scroll", instance.update, passive); + }); + } + if (resize) { + window2.removeEventListener("resize", instance.update, passive); } + }; +} +var eventListeners = { + name: "eventListeners", + enabled: true, + phase: "write", + fn: function fn() { + }, + effect, + data: {} +}; +var hash$1 = { + left: "right", + right: "left", + bottom: "top", + top: "bottom" +}; +function getOppositePlacement(placement) { + return placement.replace(/left|right|bottom|top/g, function(matched) { + return hash$1[matched]; }); } -const getPathOfImage$1 = (vault, image2) => { - return vault.getResourcePath(image2); +var hash = { + start: "end", + end: "start" }; -const detectWikiInternalLink$1 = (lineText) => { - var _a, _b; - const { - metadataCache, - vault - } = appStore.getState().dailyNotesState.app; - const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1]; - const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5]; - const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); - if (file === null) { - return { - linkText: internalFileName, - altText: internalAltName, - path: "", - filepath: "" - }; - } else { - const imagePath = getPathOfImage$1(vault, file); - const filePath = file.path; - if (internalAltName) { - return { - linkText: internalFileName, - altText: internalAltName, - path: imagePath, - filepath: filePath - }; - } else { - return { - linkText: internalFileName, - altText: "", - path: imagePath, - filepath: filePath - }; +function getOppositeVariationPlacement(placement) { + return placement.replace(/start|end/g, function(matched) { + return hash[matched]; + }); +} +function getWindowScroll(node) { + var win = getWindow(node); + var scrollLeft = win.pageXOffset; + var scrollTop = win.pageYOffset; + return { + scrollLeft, + scrollTop + }; +} +function getWindowScrollBarX(element) { + return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; +} +function getViewportRect(element) { + var win = getWindow(element); + var html = getDocumentElement(element); + var visualViewport = win.visualViewport; + var width = html.clientWidth; + var height = html.clientHeight; + var x2 = 0; + var y2 = 0; + if (visualViewport) { + width = visualViewport.width; + height = visualViewport.height; + if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { + x2 = visualViewport.offsetLeft; + y2 = visualViewport.offsetTop; } } -}; -const detectMDInternalLink$1 = (lineText) => { - var _a, _b; - const { - metadataCache, - vault - } = appStore.getState().dailyNotesState.app; - const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5]; - const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2]; - const file = metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); - if (file === null) { - return { - linkText: internalFileName, - altText: internalAltName, - path: "", - filepath: "" - }; - } else { - const imagePath = getPathOfImage$1(vault, file); - const filePath = file.path; - if (internalAltName) { - return { - linkText: internalFileName, - altText: internalAltName, - path: imagePath, - filepath: filePath + return { + width, + height, + x: x2 + getWindowScrollBarX(element), + y: y2 + }; +} +function getDocumentRect(element) { + var _element$ownerDocumen; + var html = getDocumentElement(element); + var winScroll = getWindowScroll(element); + var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; + var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); + var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); + var x2 = -winScroll.scrollLeft + getWindowScrollBarX(element); + var y2 = -winScroll.scrollTop; + if (getComputedStyle$1(body || html).direction === "rtl") { + x2 += max(html.clientWidth, body ? body.clientWidth : 0) - width; + } + return { + width, + height, + x: x2, + y: y2 + }; +} +function isScrollParent(element) { + var _getComputedStyle = getComputedStyle$1(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY; + return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); +} +function getScrollParent(node) { + if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) { + return node.ownerDocument.body; + } + if (isHTMLElement(node) && isScrollParent(node)) { + return node; + } + return getScrollParent(getParentNode(node)); +} +function listScrollParents(element, list) { + var _element$ownerDocumen; + if (list === void 0) { + list = []; + } + var scrollParent = getScrollParent(element); + var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); + var win = getWindow(scrollParent); + var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; + var updatedList = list.concat(target); + return isBody ? updatedList : updatedList.concat(listScrollParents(getParentNode(target))); +} +function rectToClientRect(rect) { + return Object.assign({}, rect, { + left: rect.x, + top: rect.y, + right: rect.x + rect.width, + bottom: rect.y + rect.height + }); +} +function getInnerBoundingClientRect(element) { + var rect = getBoundingClientRect(element); + rect.top = rect.top + element.clientTop; + rect.left = rect.left + element.clientLeft; + rect.bottom = rect.top + element.clientHeight; + rect.right = rect.left + element.clientWidth; + rect.width = element.clientWidth; + rect.height = element.clientHeight; + rect.x = rect.left; + rect.y = rect.top; + return rect; +} +function getClientRectFromMixedType(element, clippingParent) { + return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element))); +} +function getClippingParents(element) { + var clippingParents2 = listScrollParents(getParentNode(element)); + var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle$1(element).position) >= 0; + var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; + if (!isElement(clipperElement)) { + return []; + } + return clippingParents2.filter(function(clippingParent) { + return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body"; + }); +} +function getClippingRect(element, boundary, rootBoundary) { + var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary); + var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]); + var firstClippingParent = clippingParents2[0]; + var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) { + var rect = getClientRectFromMixedType(element, clippingParent); + accRect.top = max(rect.top, accRect.top); + accRect.right = min(rect.right, accRect.right); + accRect.bottom = min(rect.bottom, accRect.bottom); + accRect.left = max(rect.left, accRect.left); + return accRect; + }, getClientRectFromMixedType(element, firstClippingParent)); + clippingRect.width = clippingRect.right - clippingRect.left; + clippingRect.height = clippingRect.bottom - clippingRect.top; + clippingRect.x = clippingRect.left; + clippingRect.y = clippingRect.top; + return clippingRect; +} +function computeOffsets(_ref) { + var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement; + var basePlacement = placement ? getBasePlacement(placement) : null; + var variation = placement ? getVariation(placement) : null; + var commonX = reference2.x + reference2.width / 2 - element.width / 2; + var commonY = reference2.y + reference2.height / 2 - element.height / 2; + var offsets; + switch (basePlacement) { + case top: + offsets = { + x: commonX, + y: reference2.y - element.height }; - } else { - return { - linkText: internalFileName, - altText: "", - path: imagePath, - filepath: filePath + break; + case bottom: + offsets = { + x: commonX, + y: reference2.y + reference2.height + }; + break; + case right: + offsets = { + x: reference2.x + reference2.width, + y: commonY + }; + break; + case left: + offsets = { + x: reference2.x - element.width, + y: commonY }; + break; + default: + offsets = { + x: reference2.x, + y: reference2.y + }; + } + var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; + if (mainAxis != null) { + var len = mainAxis === "y" ? "height" : "width"; + switch (variation) { + case start: + offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2); + break; + case end: + offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2); + break; } } -}; -const DeletedMemo = (props) => { - var _a, _b; - const { - memo: propsMemo, - handleDeletedMemoAction - } = props; - const memo2 = __spreadProps(__spreadValues({}, propsMemo), { - createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt), - deletedAtStr: utils$1.getDateTimeString((_a = propsMemo.deletedAt) != null ? _a : Date.now()) - }); - const [showConfirmDeleteBtn, toggleConfirmDeleteBtn] = useToggle(false); - let externalImageUrls = []; - let internalImageUrls = []; - let allMarkdownLink = []; - let allInternalLink = []; - if (IMAGE_URL_REG.test(memo2.content)) { - let allExternalImageUrls = []; - let anotherExternalImageUrls = []; - if (MARKDOWN_URL_REG.test(memo2.content)) { - allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG)); - } - if (WIKI_IMAGE_URL_REG.test(memo2.content)) { - allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG)); - } - if (MARKDOWN_WEB_URL_REG.test(memo2.content)) { - allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG)); - } - if (allInternalLink.length) { - for (let i = 0; i < allInternalLink.length; i++) { - let one = allInternalLink[i]; - internalImageUrls.push(detectWikiInternalLink$1(one)); - } - } - if (allMarkdownLink.length) { - for (let i = 0; i < allMarkdownLink.length; i++) { - let two = allMarkdownLink[i]; - if (/(.*)http[s]?(.*)/.test(two)) { - anotherExternalImageUrls.push((_b = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _b[5]); - } else { - internalImageUrls.push(detectMDInternalLink$1(two)); - } - } - } - externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls); + return offsets; +} +function detectOverflow(state, options) { + if (options === void 0) { + options = {}; } - const handleDeleteMemoClick = async () => { - if (showConfirmDeleteBtn) { - try { - await memoService.deleteMemoById(memo2.id); - handleDeletedMemoAction(memo2.id); - } catch (error) { - new require$$0.Notice(error.message); - } - } else { - toggleConfirmDeleteBtn(); - } - }; - const handleRestoreMemoClick = async () => { - try { - await memoService.restoreMemoById(memo2.id); - handleDeletedMemoAction(memo2.id); - new require$$0.Notice("RESTORE SUCCEED"); - } catch (error) { - new require$$0.Notice(error.message); - } - }; - const handleMouseLeaveMemoWrapper = () => { - if (showConfirmDeleteBtn) { - toggleConfirmDeleteBtn(false); - } + var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding; + var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements)); + var altContext = elementContext === popper ? reference : popper; + var popperRect = state.rects.popper; + var element = state.elements[altBoundary ? altContext : elementContext]; + var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary); + var referenceClientRect = getBoundingClientRect(state.elements.reference); + var popperOffsets2 = computeOffsets({ + reference: referenceClientRect, + element: popperRect, + strategy: "absolute", + placement + }); + var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2)); + var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; + var overflowOffsets = { + top: clippingClientRect.top - elementClientRect.top + paddingObject.top, + bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, + left: clippingClientRect.left - elementClientRect.left + paddingObject.left, + right: elementClientRect.right - clippingClientRect.right + paddingObject.right }; - return /* @__PURE__ */ jsxs("div", { - className: `memo-wrapper ${"memos-" + memo2.id}`, - onMouseLeave: handleMouseLeaveMemoWrapper, - children: [/* @__PURE__ */ jsxs("div", { - className: "memo-top-wrapper", - children: [/* @__PURE__ */ jsxs("span", { - className: "time-text", - children: [t("DELETE AT"), " ", memo2.deletedAtStr] - }), /* @__PURE__ */ jsxs("div", { - className: "btns-container", - children: [/* @__PURE__ */ jsx("span", { - className: "btn more-action-btn", - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: more - }) - }), /* @__PURE__ */ jsx("div", { - className: "more-action-btns-wrapper", - children: /* @__PURE__ */ jsxs("div", { - className: "more-action-btns-container", - children: [/* @__PURE__ */ jsx("span", { - className: "btn restore-btn", - onClick: handleRestoreMemoClick, - children: t("RESTORE") - }), /* @__PURE__ */ jsx("span", { - className: `btn delete-btn ${showConfirmDeleteBtn ? "final-confirm" : ""}`, - onClick: handleDeleteMemoClick, - children: showConfirmDeleteBtn ? t("CONFIRM\uFF01") : t("DELETE") - })] - }) - })] - })] - }), /* @__PURE__ */ jsx("div", { - className: "memo-content-text", - dangerouslySetInnerHTML: { - __html: formatMemoContent(memo2.content) - } - }), /* @__PURE__ */ jsx(Only, { - when: externalImageUrls.length > 0, - children: /* @__PURE__ */ jsx("div", { - className: "images-wrapper", - children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, { - alt: "", - className: "memo-img", - imgUrl, - referrerPolicy: "no-referrer" - }, idx)) - }) - }), /* @__PURE__ */ jsx(Only, { - when: internalImageUrls.length > 0, - children: /* @__PURE__ */ jsx("div", { - className: "images-wrapper internal-embed image-embed is-loaded", - children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx(Image$1, { - className: "memo-img", - imgUrl: imgUrl.path, - alt: imgUrl.altText, - filepath: imgUrl.filepath - }, idx)) - }) - })] + var offsetData = state.modifiersData.offset; + if (elementContext === popper && offsetData) { + var offset2 = offsetData[placement]; + Object.keys(overflowOffsets).forEach(function(key) { + var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; + var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x"; + overflowOffsets[key] += offset2[axis] * multiply; + }); + } + return overflowOffsets; +} +function computeAutoPlacement(state, options) { + if (options === void 0) { + options = {}; + } + var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; + var variation = getVariation(placement); + var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) { + return getVariation(placement2) === variation; + }) : basePlacements; + var allowedPlacements = placements$1.filter(function(placement2) { + return allowedAutoPlacements.indexOf(placement2) >= 0; }); -}; -var memoTrash = ""; -const MemoTrash = () => { - const { - locationState: { - query - }, - globalState: { - isMobileView - } - } = _react_17_0_2_react.exports.useContext(appContext); - const loadingState = useLoading(); - const [deletedMemos, setDeletedMemos] = _react_17_0_2_react.exports.useState([]); - const { - tag: tagQuery, - duration, - type: memoType, - text: textQuery, - filter: queryId - } = query; - const queryFilter = queryService.getQueryById(queryId); - const showMemoFilter = Boolean(tagQuery || duration && duration.from < duration.to || memoType || textQuery || queryFilter); - const shownMemos = showMemoFilter || queryFilter ? deletedMemos.filter((memo2) => { - var _a, _b; - let shouldShow = true; - if (queryFilter) { - const filters = JSON.parse(queryFilter.querystring); - if (Array.isArray(filters)) { - shouldShow = checkShouldShowMemoWithFilters(memo2, filters); - } - } - if (tagQuery) { - const tagsSet = new Set(); - for (const t2 of Array.from((_a = memo2.content.match(TAG_REG)) != null ? _a : [])) { - const tag2 = t2.replace(TAG_REG, "$1").trim(); - const items = tag2.split("/"); - let temp = ""; - for (const i of items) { - temp += i; - tagsSet.add(temp); - temp += "/"; - } - } - for (const t2 of Array.from((_b = memo2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) { - const tag2 = t2.replace(NOP_FIRST_TAG_REG, "$1").trim(); - const items = tag2.split("/"); - let temp = ""; - for (const i of items) { - temp += i; - tagsSet.add(temp); - temp += "/"; - } - } - if (!tagsSet.has(tagQuery)) { - shouldShow = false; - } + if (allowedPlacements.length === 0) { + allowedPlacements = placements$1; + } + var overflows = allowedPlacements.reduce(function(acc, placement2) { + acc[placement2] = detectOverflow(state, { + placement: placement2, + boundary, + rootBoundary, + padding + })[getBasePlacement(placement2)]; + return acc; + }, {}); + return Object.keys(overflows).sort(function(a, b) { + return overflows[a] - overflows[b]; + }); +} +function getExpandedFallbackPlacements(placement) { + if (getBasePlacement(placement) === auto) { + return []; + } + var oppositePlacement = getOppositePlacement(placement); + return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; +} +function flip(_ref) { + var state = _ref.state, options = _ref.options, name = _ref.name; + if (state.modifiersData[name]._skip) { + return; + } + var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements; + var preferredPlacement = state.options.placement; + var basePlacement = getBasePlacement(preferredPlacement); + var isBasePlacement = basePlacement === preferredPlacement; + var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); + var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) { + return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, { + placement: placement2, + boundary, + rootBoundary, + padding, + flipVariations, + allowedAutoPlacements + }) : placement2); + }, []); + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var checksMap = /* @__PURE__ */ new Map(); + var makeFallbackChecks = true; + var firstFittingPlacement = placements2[0]; + for (var i = 0; i < placements2.length; i++) { + var placement = placements2[i]; + var _basePlacement = getBasePlacement(placement); + var isStartVariation = getVariation(placement) === start; + var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; + var len = isVertical ? "width" : "height"; + var overflow = detectOverflow(state, { + placement, + boundary, + rootBoundary, + altBoundary, + padding + }); + var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; + if (referenceRect[len] > popperRect[len]) { + mainVariationSide = getOppositePlacement(mainVariationSide); } - if (duration && duration.from < duration.to && (utils$1.getTimeStampByDate(memo2.createdAt) < duration.from || utils$1.getTimeStampByDate(memo2.createdAt) > duration.to)) { - shouldShow = false; + var altVariationSide = getOppositePlacement(mainVariationSide); + var checks = []; + if (checkMainAxis) { + checks.push(overflow[_basePlacement] <= 0); } - if (memoType) { - if (memoType === "NOT_TAGGED" && memo2.content.match(TAG_REG) !== null) { - shouldShow = false; - } else if (memoType === "LINKED" && memo2.content.match(LINK_REG) === null) { - shouldShow = false; - } else if (memoType === "IMAGED" && memo2.content.match(IMAGE_URL_REG) === null) { - shouldShow = false; - } else if (memoType === "CONNECTED" && memo2.content.match(MEMO_LINK_REG) === null) { - shouldShow = false; - } + if (checkAltAxis) { + checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); } - if (textQuery && !memo2.content.includes(textQuery)) { - shouldShow = false; + if (checks.every(function(check) { + return check; + })) { + firstFittingPlacement = placement; + makeFallbackChecks = false; + break; } - return shouldShow; - }) : deletedMemos; - _react_17_0_2_react.exports.useEffect(() => { - memoService.fetchAllMemos(); - memoService.fetchDeletedMemos().then((result) => { - if (result.length !== 0) { - setDeletedMemos(result); + checksMap.set(placement, checks); + } + if (makeFallbackChecks) { + var numberOfChecks = flipVariations ? 3 : 1; + var _loop = function _loop2(_i2) { + var fittingPlacement = placements2.find(function(placement2) { + var checks2 = checksMap.get(placement2); + if (checks2) { + return checks2.slice(0, _i2).every(function(check) { + return check; + }); + } + }); + if (fittingPlacement) { + firstFittingPlacement = fittingPlacement; + return "break"; } - }).catch((error) => { - new require$$0.Notice("Failed to fetch deleted memos: ", error); - }).finally(() => { - loadingState.setFinish(); - }); - locationService.clearQuery(); - }, []); - const handleDeletedMemoAction = _react_17_0_2_react.exports.useCallback((memoId) => { - setDeletedMemos((deletedMemos2) => deletedMemos2.filter((memo2) => memo2.id !== memoId)); - }, []); - const handleShowSidebarBtnClick = _react_17_0_2_react.exports.useCallback(() => { - globalStateService.setShowSiderbarInMobileView(true); - }, []); - return /* @__PURE__ */ jsxs("div", { - className: "memo-trash-wrapper", - children: [/* @__PURE__ */ jsx("div", { - className: "section-header-container", - children: /* @__PURE__ */ jsxs("div", { - className: "title-text", - children: [/* @__PURE__ */ jsx(Only, { - when: isMobileView, - children: /* @__PURE__ */ jsx("button", { - className: "action-btn", - onClick: handleShowSidebarBtnClick, - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: menuSvg, - alt: "menu" - }) - }) - }), /* @__PURE__ */ jsx("span", { - className: "normal-text", - children: t("Recycle bin") - })] - }) - }), /* @__PURE__ */ jsx(MemoFilter, {}), loadingState.isLoading ? /* @__PURE__ */ jsx("div", { - className: "tip-text-container", - children: /* @__PURE__ */ jsx("p", { - className: "tip-text", - children: t("Fetching data...") - }) - }) : deletedMemos.length === 0 ? /* @__PURE__ */ jsx("div", { - className: "tip-text-container", - children: /* @__PURE__ */ jsx("p", { - className: "tip-text", - children: t("Here is No Zettels.") - }) - }) : /* @__PURE__ */ jsx("div", { - className: "deleted-memos-container", - children: shownMemos.map((memo2) => /* @__PURE__ */ jsx(DeletedMemo, { - memo: memo2, - handleDeletedMemoAction - }, `${memo2.id}-${memo2.updatedAt}`)) - })] + }; + for (var _i = numberOfChecks; _i > 0; _i--) { + var _ret = _loop(_i); + if (_ret === "break") + break; + } + } + if (state.placement !== firstFittingPlacement) { + state.modifiersData[name]._skip = true; + state.placement = firstFittingPlacement; + state.reset = true; + } +} +var flip$1 = { + name: "flip", + enabled: true, + phase: "main", + fn: flip, + requiresIfExists: ["offset"], + data: { + _skip: false + } +}; +function getSideOffsets(overflow, rect, preventedOffsets) { + if (preventedOffsets === void 0) { + preventedOffsets = { + x: 0, + y: 0 + }; + } + return { + top: overflow.top - rect.height - preventedOffsets.y, + right: overflow.right - rect.width + preventedOffsets.x, + bottom: overflow.bottom - rect.height + preventedOffsets.y, + left: overflow.left - rect.width - preventedOffsets.x + }; +} +function isAnySideFullyClipped(overflow) { + return [top, right, bottom, left].some(function(side) { + return overflow[side] >= 0; + }); +} +function hide(_ref) { + var state = _ref.state, name = _ref.name; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var preventedOffsets = state.modifiersData.preventOverflow; + var referenceOverflow = detectOverflow(state, { + elementContext: "reference" + }); + var popperAltOverflow = detectOverflow(state, { + altBoundary: true + }); + var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); + var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); + var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); + var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); + state.modifiersData[name] = { + referenceClippingOffsets, + popperEscapeOffsets, + isReferenceHidden, + hasPopperEscaped + }; + state.attributes.popper = Object.assign({}, state.attributes.popper, { + "data-popper-reference-hidden": isReferenceHidden, + "data-popper-escaped": hasPopperEscaped + }); +} +var hide$1 = { + name: "hide", + enabled: true, + phase: "main", + requiresIfExists: ["preventOverflow"], + fn: hide +}; +function distanceAndSkiddingToXY(placement, rects, offset2) { + var basePlacement = getBasePlacement(placement); + var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; + var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, { + placement + })) : offset2, skidding = _ref[0], distance = _ref[1]; + skidding = skidding || 0; + distance = (distance || 0) * invertDistance; + return [left, right].indexOf(basePlacement) >= 0 ? { + x: distance, + y: skidding + } : { + x: skidding, + y: distance + }; +} +function offset(_ref2) { + var state = _ref2.state, options = _ref2.options, name = _ref2.name; + var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset; + var data = placements.reduce(function(acc, placement) { + acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2); + return acc; + }, {}); + var _data$state$placement = data[state.placement], x2 = _data$state$placement.x, y2 = _data$state$placement.y; + if (state.modifiersData.popperOffsets != null) { + state.modifiersData.popperOffsets.x += x2; + state.modifiersData.popperOffsets.y += y2; + } + state.modifiersData[name] = data; +} +var offset$1 = { + name: "offset", + enabled: true, + phase: "main", + requires: ["popperOffsets"], + fn: offset +}; +function popperOffsets(_ref) { + var state = _ref.state, name = _ref.name; + state.modifiersData[name] = computeOffsets({ + reference: state.rects.reference, + element: state.rects.popper, + strategy: "absolute", + placement: state.placement + }); +} +var popperOffsets$1 = { + name: "popperOffsets", + enabled: true, + phase: "read", + fn: popperOffsets, + data: {} +}; +function getAltAxis(axis) { + return axis === "x" ? "y" : "x"; +} +function preventOverflow(_ref) { + var state = _ref.state, options = _ref.options, name = _ref.name; + var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; + var overflow = detectOverflow(state, { + boundary, + rootBoundary, + padding, + altBoundary }); -}; -var preferencesSection = ""; -var checkboxActive = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWNWgxNHYxNHpNMTcuOTkgOWwtMS40MS0xLjQyLTYuNTkgNi41OS0yLjU4LTIuNTctMS40MiAxLjQxIDQgMy45OXoiLz48L3N2Zz4="; -var checkbox = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6Ii8+PC9zdmc+"; -const PreferencesSection = () => { - const { - globalState - } = _react_17_0_2_react.exports.useContext(appContext); - const { - useTinyUndoHistoryCache, - shouldHideImageUrl, - shouldSplitMemoWord, - shouldUseMarkdownParser - } = globalState; - const demoMemoContent = "\u{1F44B} \u4F60\u597D\u5440\uFF5E\u6B22\u8FCE\u4F7F\u7528memos!\n* \u2728 **\u5F00\u6E90\u9879\u76EE**\uFF1B\n* \u{1F60B} \u7CBE\u7F8E\u4E14\u7EC6\u8282\u7684\u89C6\u89C9\u6837\u5F0F\uFF1B\n* \u{1F4D1} \u4F53\u9A8C\u4F18\u826F\u7684\u4EA4\u4E92\u903B\u8F91\uFF1B"; - const handleOpenTinyUndoChanged = () => { - globalStateService.setAppSetting({ - useTinyUndoHistoryCache: !useTinyUndoHistoryCache - }); + var basePlacement = getBasePlacement(state.placement); + var variation = getVariation(state.placement); + var isBasePlacement = !variation; + var mainAxis = getMainAxisFromPlacement(basePlacement); + var altAxis = getAltAxis(mainAxis); + var popperOffsets2 = state.modifiersData.popperOffsets; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, { + placement: state.placement + })) : tetherOffset; + var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? { + mainAxis: tetherOffsetValue, + altAxis: tetherOffsetValue + } : Object.assign({ + mainAxis: 0, + altAxis: 0 + }, tetherOffsetValue); + var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; + var data = { + x: 0, + y: 0 }; - const handleSplitWordsValueChanged = () => { - globalStateService.setAppSetting({ - shouldSplitMemoWord: !shouldSplitMemoWord - }); + if (!popperOffsets2) { + return; + } + if (checkMainAxis) { + var _offsetModifierState$; + var mainSide = mainAxis === "y" ? top : left; + var altSide = mainAxis === "y" ? bottom : right; + var len = mainAxis === "y" ? "height" : "width"; + var offset2 = popperOffsets2[mainAxis]; + var min$1 = offset2 + overflow[mainSide]; + var max$1 = offset2 - overflow[altSide]; + var additive = tether ? -popperRect[len] / 2 : 0; + var minLen = variation === start ? referenceRect[len] : popperRect[len]; + var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; + var arrowElement = state.elements.arrow; + var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { + width: 0, + height: 0 + }; + var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject(); + var arrowPaddingMin = arrowPaddingObject[mainSide]; + var arrowPaddingMax = arrowPaddingObject[altSide]; + var arrowLen = within(0, referenceRect[len], arrowRect[len]); + var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; + var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; + var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); + var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; + var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; + var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset; + var tetherMax = offset2 + maxOffset - offsetModifierValue; + var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset2, tether ? max(max$1, tetherMax) : max$1); + popperOffsets2[mainAxis] = preventedOffset; + data[mainAxis] = preventedOffset - offset2; + } + if (checkAltAxis) { + var _offsetModifierState$2; + var _mainSide = mainAxis === "x" ? top : left; + var _altSide = mainAxis === "x" ? bottom : right; + var _offset = popperOffsets2[altAxis]; + var _len = altAxis === "y" ? "height" : "width"; + var _min = _offset + overflow[_mainSide]; + var _max = _offset - overflow[_altSide]; + var isOriginSide = [top, left].indexOf(basePlacement) !== -1; + var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; + var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; + var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; + var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); + popperOffsets2[altAxis] = _preventedOffset; + data[altAxis] = _preventedOffset - _offset; + } + state.modifiersData[name] = data; +} +var preventOverflow$1 = { + name: "preventOverflow", + enabled: true, + phase: "main", + fn: preventOverflow, + requiresIfExists: ["offset"] +}; +function getHTMLElementScroll(element) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop }; - const handleHideImageUrlValueChanged = () => { - globalStateService.setAppSetting({ - shouldHideImageUrl: !shouldHideImageUrl - }); +} +function getNodeScroll(node) { + if (node === getWindow(node) || !isHTMLElement(node)) { + return getWindowScroll(node); + } else { + return getHTMLElementScroll(node); + } +} +function isElementScaled(element) { + var rect = element.getBoundingClientRect(); + var scaleX = round(rect.width) / element.offsetWidth || 1; + var scaleY = round(rect.height) / element.offsetHeight || 1; + return scaleX !== 1 || scaleY !== 1; +} +function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { + if (isFixed === void 0) { + isFixed = false; + } + var isOffsetParentAnElement = isHTMLElement(offsetParent); + var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); + var documentElement = getDocumentElement(offsetParent); + var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled); + var scroll = { + scrollLeft: 0, + scrollTop: 0 }; - const handleUseMarkdownParserChanged = () => { - globalStateService.setAppSetting({ - shouldUseMarkdownParser: !shouldUseMarkdownParser - }); + var offsets = { + x: 0, + y: 0 }; - const handleExportBtnClick = async () => { - const formatedMemos = memoService.getState().memos.map((m2) => { - return __spreadValues({}, m2); - }); - const jsonStr = JSON.stringify(formatedMemos); - const element = document.createElement("a"); - element.setAttribute("href", "data:text/plain;charset=utf-8," + encodeURIComponent(jsonStr)); - element.setAttribute("download", "data.json"); - element.style.display = "none"; - document.body.appendChild(element); - element.click(); - document.body.removeChild(element); + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (getNodeName(offsetParent) !== "body" || isScrollParent(documentElement)) { + scroll = getNodeScroll(offsetParent); + } + if (isHTMLElement(offsetParent)) { + offsets = getBoundingClientRect(offsetParent, true); + offsets.x += offsetParent.clientLeft; + offsets.y += offsetParent.clientTop; + } else if (documentElement) { + offsets.x = getWindowScrollBarX(documentElement); + } + } + return { + x: rect.left + scroll.scrollLeft - offsets.x, + y: rect.top + scroll.scrollTop - offsets.y, + width: rect.width, + height: rect.height }; - return /* @__PURE__ */ jsxs(Fragment, { - children: [/* @__PURE__ */ jsxs("div", { - className: "section-container preferences-section-container", - children: [/* @__PURE__ */ jsx("p", { - className: "title-text", - children: "Memo \u663E\u793A\u76F8\u5173" - }), /* @__PURE__ */ jsx("div", { - className: "demo-content-container memo-content-text", - dangerouslySetInnerHTML: { - __html: formatMemoContent(demoMemoContent) - } - }), /* @__PURE__ */ jsxs("label", { - className: "form-label checkbox-form-label", - onClick: handleSplitWordsValueChanged, - children: [/* @__PURE__ */ jsx("span", { - className: "normal-text", - children: "\u4E2D\u82F1\u6587\u5185\u5BB9\u81EA\u52A8\u95F4\u9694" - }), /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: shouldSplitMemoWord ? checkboxActive : checkbox - })] - }), /* @__PURE__ */ jsxs("label", { - className: "form-label checkbox-form-label", - onClick: handleUseMarkdownParserChanged, - children: [/* @__PURE__ */ jsx("span", { - className: "normal-text", - children: "\u90E8\u5206 markdown \u683C\u5F0F\u89E3\u6790" - }), /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: shouldUseMarkdownParser ? checkboxActive : checkbox - })] - }), /* @__PURE__ */ jsxs("label", { - className: "form-label checkbox-form-label", - onClick: handleHideImageUrlValueChanged, - children: [/* @__PURE__ */ jsx("span", { - className: "normal-text", - children: "\u9690\u85CF\u56FE\u7247\u94FE\u63A5\u5730\u5740" - }), /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: shouldHideImageUrl ? checkboxActive : checkbox - })] - })] - }), /* @__PURE__ */ jsxs("div", { - className: "section-container preferences-section-container", - children: [/* @__PURE__ */ jsx("p", { - className: "title-text", - children: "\u7F16\u8F91\u5668" - }), /* @__PURE__ */ jsxs("label", { - className: "form-label checkbox-form-label", - onClick: handleOpenTinyUndoChanged, - children: [/* @__PURE__ */ jsxs("span", { - className: "normal-text", - children: ["\u542F\u7528", " ", /* @__PURE__ */ jsx("a", { - target: "_blank", - href: "https://github.com/boojack/tiny-undo", - onClick: (e) => e.stopPropagation(), - rel: "noreferrer", - children: "tiny-undo" - })] - }), /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: useTinyUndoHistoryCache ? checkboxActive : checkbox - })] - })] - }), /* @__PURE__ */ jsxs("div", { - className: "section-container hidden", - children: [/* @__PURE__ */ jsx("p", { - className: "title-text", - children: "\u5176\u4ED6" - }), /* @__PURE__ */ jsx("div", { - className: "btn-container", - children: /* @__PURE__ */ jsx("button", { - className: "btn export-btn", - onClick: handleExportBtnClick, - children: "\u5BFC\u51FA\u6570\u636E(JSON)" - }) - })] - })] +} +function order(modifiers) { + var map = /* @__PURE__ */ new Map(); + var visited = /* @__PURE__ */ new Set(); + var result = []; + modifiers.forEach(function(modifier) { + map.set(modifier.name, modifier); }); -}; -var setting = ""; -const Setting = () => { - const { - globalState: { - isMobileView + function sort(modifier) { + visited.add(modifier.name); + var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); + requires.forEach(function(dep) { + if (!visited.has(dep)) { + var depModifier = map.get(dep); + if (depModifier) { + sort(depModifier); + } + } + }); + result.push(modifier); + } + modifiers.forEach(function(modifier) { + if (!visited.has(modifier.name)) { + sort(modifier); } - } = _react_17_0_2_react.exports.useContext(appContext); - _react_17_0_2_react.exports.useEffect(() => { - memoService.fetchAllMemos(); - }, []); - const handleShowSidebarBtnClick = _react_17_0_2_react.exports.useCallback(() => { - globalStateService.setShowSiderbarInMobileView(true); - }, []); - return /* @__PURE__ */ jsxs("div", { - className: "preference-wrapper", - children: [/* @__PURE__ */ jsx("div", { - className: "section-header-container", - children: /* @__PURE__ */ jsxs("div", { - className: "title-text", - children: [/* @__PURE__ */ jsx(Only, { - when: isMobileView, - children: /* @__PURE__ */ jsx("button", { - className: "action-btn", - onClick: handleShowSidebarBtnClick, - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: menuSvg, - alt: "menu" - }) - }) - }), /* @__PURE__ */ jsx("span", { - className: "normal-text", - children: "\u8D26\u53F7\u4E0E\u8BBE\u7F6E" - })] - }) - }), /* @__PURE__ */ jsx("div", { - className: "sections-wrapper", - children: /* @__PURE__ */ jsx(PreferencesSection, {}) - })] }); -}; -const homeRouter = { - "/recycle": /* @__PURE__ */ jsx(MemoTrash, {}), - "/setting": /* @__PURE__ */ jsx(Setting, {}), - "*": /* @__PURE__ */ jsx(Memos$1, {}) -}; -const routerSwitch = (router) => { - return (pathname) => { - for (const key of Object.keys(router)) { - if (key === pathname) { - return router[key]; - } + return result; +} +function orderModifiers(modifiers) { + var orderedModifiers = order(modifiers); + return modifierPhases.reduce(function(acc, phase) { + return acc.concat(orderedModifiers.filter(function(modifier) { + return modifier.phase === phase; + })); + }, []); +} +function debounce(fn2) { + var pending; + return function() { + if (!pending) { + pending = new Promise(function(resolve) { + Promise.resolve().then(function() { + pending = void 0; + resolve(fn2()); + }); + }); } - return router["*"]; - }; -}; -const homeRouterSwitch = routerSwitch(homeRouter); -var aboutSiteDialog = ""; -const AboutSiteDialog = ({ - destroy -}) => { - const handleCloseBtnClick = () => { - destroy(); + return pending; }; - return /* @__PURE__ */ jsxs(Fragment, { - children: [/* @__PURE__ */ jsxs("div", { - className: "dialog-header-container", - children: [/* @__PURE__ */ jsxs("p", { - className: "title-text", - children: [/* @__PURE__ */ jsx("span", { - className: "icon-text", - children: "\u{1F920}" - }), "About ", /* @__PURE__ */ jsx("b", { - children: "Obsidian-Memos" - })] - }), /* @__PURE__ */ jsx("button", { - className: "btn close-btn", - onClick: handleCloseBtnClick, - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: close - }) - })] - }), /* @__PURE__ */ jsxs("div", { - className: "dialog-content-container", - children: ["Hi, I am Quorafind(Boninall), if you are interested in this project, please support my work and enthusiasm by buying me a coffee on ", /* @__PURE__ */ jsx("a", { - href: "https://www.buymeacoffee.com/boninall", - children: "https://www.buymeacoffee.com/boninall" - }), /* @__PURE__ */ jsx("a", { - href: "https://www.buymeacoffee.com/boninall", - children: /* @__PURE__ */ jsx("img", { - src: `https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=&slug=boninall&button_colour=6495ED&font_colour=ffffff&font_family=Lato&outline_colour=000000&coffee_colour=FFDD00` - }) - }), /* @__PURE__ */ jsx("br", {}), /* @__PURE__ */ jsxs("p", { - children: ["\u57FA\u4E8E ", /* @__PURE__ */ jsx("a", { - href: "https://github.com/justmemos/memos", - children: "memos" - }), " \u5F00\u6E90\u9879\u76EE\u6240\u6784\u5EFA\u7684\u9879\u76EE\u3002 NOTE: Based on", " ", /* @__PURE__ */ jsx("a", { - href: "https://github.com/justmemos/memos", - children: "memos" - }), " project to build."] - }), /* @__PURE__ */ jsx("br", {}), /* @__PURE__ */ jsxs("p", { - children: ["\u{1F3D7} This project is working in progress, ", /* @__PURE__ */ jsx("br", {}), " and very pleasure to welcome your", " ", /* @__PURE__ */ jsx("a", { - href: "https://github.com/Quorafind/obsidian-memos/issues", - children: "issues" - }), " and", " ", /* @__PURE__ */ jsx("a", { - href: "https://github.com/Quorafind/obsidian-memos/pulls", - children: "Pull Request" - }), "."] - }), /* @__PURE__ */ jsx("hr", {}), /* @__PURE__ */ jsxs("p", { - className: "normal-text", - children: ["Last updated on ", /* @__PURE__ */ jsx("span", { - className: "pre-text", - children: "2022/01/04 22:55:15" - }), " \u{1F389}"] - })] - })] +} +function mergeByName(modifiers) { + var merged = modifiers.reduce(function(merged2, current) { + var existing = merged2[current.name]; + merged2[current.name] = existing ? Object.assign({}, existing, current, { + options: Object.assign({}, existing.options, current.options), + data: Object.assign({}, existing.data, current.data) + }) : current; + return merged2; + }, {}); + return Object.keys(merged).map(function(key) { + return merged[key]; }); +} +var DEFAULT_OPTIONS = { + placement: "bottom", + modifiers: [], + strategy: "absolute" }; -function showAboutSiteDialog() { - showDialog({ - className: "about-site-dialog" - }, AboutSiteDialog); +function areValidElements() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return !args.some(function(element) { + return !(element && typeof element.getBoundingClientRect === "function"); + }); } -var menuBtnsPopup = ""; -const MenuBtnsPopup = (props) => { - const { - shownStatus, - setShownStatus - } = props; - const { - app: app2 - } = dailyNotesService.getState(); - const popupElRef = _react_17_0_2_react.exports.useRef(null); - _react_17_0_2_react.exports.useEffect(() => { - if (shownStatus) { - const handleClickOutside = (event) => { - var _a; - if (!((_a = popupElRef.current) == null ? void 0 : _a.contains(event.target))) { - event.stopPropagation(); +function popperGenerator(generatorOptions) { + if (generatorOptions === void 0) { + generatorOptions = {}; + } + var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers2 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; + return function createPopper2(reference2, popper2, options) { + if (options === void 0) { + options = defaultOptions; + } + var state = { + placement: "bottom", + orderedModifiers: [], + options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), + modifiersData: {}, + elements: { + reference: reference2, + popper: popper2 + }, + attributes: {}, + styles: {} + }; + var effectCleanupFns = []; + var isDestroyed = false; + var instance = { + state, + setOptions: function setOptions(setOptionsAction) { + var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction; + cleanupModifierEffects(); + state.options = Object.assign({}, defaultOptions, state.options, options2); + state.scrollParents = { + reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [], + popper: listScrollParents(popper2) + }; + var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers2, state.options.modifiers))); + state.orderedModifiers = orderedModifiers.filter(function(m2) { + return m2.enabled; + }); + runModifierEffects(); + return instance.update(); + }, + forceUpdate: function forceUpdate() { + if (isDestroyed) { + return; + } + var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper; + if (!areValidElements(reference3, popper3)) { + return; + } + state.rects = { + reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"), + popper: getLayoutRect(popper3) + }; + state.reset = false; + state.placement = state.options.placement; + state.orderedModifiers.forEach(function(modifier) { + return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); + }); + for (var index = 0; index < state.orderedModifiers.length; index++) { + if (state.reset === true) { + state.reset = false; + index = -1; + continue; + } + var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name; + if (typeof fn2 === "function") { + state = fn2({ + state, + options: _options, + name, + instance + }) || state; + } + } + }, + update: debounce(function() { + return new Promise(function(resolve) { + instance.forceUpdate(); + resolve(state); + }); + }), + destroy: function destroy() { + cleanupModifierEffects(); + isDestroyed = true; + } + }; + if (!areValidElements(reference2, popper2)) { + return instance; + } + instance.setOptions(options).then(function(state2) { + if (!isDestroyed && options.onFirstUpdate) { + options.onFirstUpdate(state2); + } + }); + function runModifierEffects() { + state.orderedModifiers.forEach(function(_ref3) { + var name = _ref3.name, _ref3$options = _ref3.options, options2 = _ref3$options === void 0 ? {} : _ref3$options, effect2 = _ref3.effect; + if (typeof effect2 === "function") { + var cleanupFn = effect2({ + state, + name, + instance, + options: options2 + }); + var noopFn = function noopFn2() { + }; + effectCleanupFns.push(cleanupFn || noopFn); } - setShownStatus(false); - }; - window.addEventListener("click", handleClickOutside, { - capture: true, - once: true }); } - }, [shownStatus]); - const handleMyAccountBtnClick = () => { - app2.setting.open(); - app2.setting.openTabById("obsidian-memos"); - }; - const handleMemosTrashBtnClick = () => { - locationService.pushHistory("/recycle"); - }; - const handleAboutBtnClick = () => { - showAboutSiteDialog(); + function cleanupModifierEffects() { + effectCleanupFns.forEach(function(fn2) { + return fn2(); + }); + effectCleanupFns = []; + } + return instance; }; - return /* @__PURE__ */ jsxs("div", { - className: `menu-btns-popup ${shownStatus ? "" : "hidden"}`, - ref: popupElRef, - children: [/* @__PURE__ */ jsxs("button", { - className: "btn action-btn", - onClick: handleMyAccountBtnClick, - children: [/* @__PURE__ */ jsx("span", { - className: "icon", - children: "\u{1F464}" - }), " ", t("Settings")] - }), /* @__PURE__ */ jsxs("button", { - className: "btn action-btn", - onClick: handleMemosTrashBtnClick, - children: [/* @__PURE__ */ jsx("span", { - className: "icon", - children: "\u{1F5D1}\uFE0F" - }), " ", t("Recycle bin")] - }), /* @__PURE__ */ jsxs("button", { - className: "btn action-btn", - onClick: handleAboutBtnClick, - children: [/* @__PURE__ */ jsx("span", { - className: "icon", - children: "\u{1F920}" - }), " ", t("About Me")] - })] - }); -}; -var dailyMemo = ""; -const getPathOfImage = (vault, image2) => { - return vault.getResourcePath(image2); -}; -const detectWikiInternalLink = (lineText, app2) => { - var _a, _b; - const internalFileName = (_a = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _a[1]; - const internalAltName = (_b = WIKI_IMAGE_URL_REG.exec(lineText)) == null ? void 0 : _b[5]; - const file = app2.metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); - if (file === null) { - return { - linkText: internalFileName, - altText: internalAltName, - path: "", - filePath: "" - }; - } else { - const imagePath = getPathOfImage(app2.vault, file); - if (internalAltName) { - return { - linkText: internalFileName, - altText: internalAltName, - path: imagePath, - filePath: file.path - }; - } else { - return { - linkText: internalFileName, - altText: "", - path: imagePath, - filePath: file.path - }; +} +var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1]; +var createPopper = /* @__PURE__ */ popperGenerator({ + defaultModifiers +}); +var hasElementType = typeof Element !== "undefined"; +var hasMap = typeof Map === "function"; +var hasSet = typeof Set === "function"; +var hasArrayBuffer = typeof ArrayBuffer === "function" && !!ArrayBuffer.isView; +function equal(a, b) { + if (a === b) + return true; + if (a && b && typeof a == "object" && typeof b == "object") { + if (a.constructor !== b.constructor) + return false; + var length, i, keys; + if (Array.isArray(a)) { + length = a.length; + if (length != b.length) + return false; + for (i = length; i-- !== 0; ) + if (!equal(a[i], b[i])) + return false; + return true; + } + var it2; + if (hasMap && a instanceof Map && b instanceof Map) { + if (a.size !== b.size) + return false; + it2 = a.entries(); + while (!(i = it2.next()).done) + if (!b.has(i.value[0])) + return false; + it2 = a.entries(); + while (!(i = it2.next()).done) + if (!equal(i.value[1], b.get(i.value[0]))) + return false; + return true; + } + if (hasSet && a instanceof Set && b instanceof Set) { + if (a.size !== b.size) + return false; + it2 = a.entries(); + while (!(i = it2.next()).done) + if (!b.has(i.value[0])) + return false; + return true; + } + if (hasArrayBuffer && ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) { + length = a.length; + if (length != b.length) + return false; + for (i = length; i-- !== 0; ) + if (a[i] !== b[i]) + return false; + return true; + } + if (a.constructor === RegExp) + return a.source === b.source && a.flags === b.flags; + if (a.valueOf !== Object.prototype.valueOf) + return a.valueOf() === b.valueOf(); + if (a.toString !== Object.prototype.toString) + return a.toString() === b.toString(); + keys = Object.keys(a); + length = keys.length; + if (length !== Object.keys(b).length) + return false; + for (i = length; i-- !== 0; ) + if (!Object.prototype.hasOwnProperty.call(b, keys[i])) + return false; + if (hasElementType && a instanceof Element) + return false; + for (i = length; i-- !== 0; ) { + if ((keys[i] === "_owner" || keys[i] === "__v" || keys[i] === "__o") && a.$$typeof) { + continue; + } + if (!equal(a[keys[i]], b[keys[i]])) + return false; + } + return true; + } + return a !== a && b !== b; +} +var _reactFastCompare_3_2_0_reactFastCompare = function isEqual(a, b) { + try { + return equal(a, b); + } catch (error) { + if ((error.message || "").match(/stack|recursion/i)) { + console.warn("react-fast-compare cannot handle circular refs"); + return false; } + throw error; } }; -const detectMDInternalLink = (lineText, app2) => { - var _a, _b; - const internalFileName = (_a = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _a[5]; - const internalAltName = (_b = MARKDOWN_URL_REG.exec(lineText)) == null ? void 0 : _b[2]; - const file = app2.metadataCache.getFirstLinkpathDest(decodeURIComponent(internalFileName), ""); - if (file === null) { +var EMPTY_MODIFIERS = []; +var usePopper = function usePopper2(referenceElement, popperElement, options) { + if (options === void 0) { + options = {}; + } + var prevOptions = _react_17_0_2_react.exports.useRef(null); + var optionsWithDefaults = { + onFirstUpdate: options.onFirstUpdate, + placement: options.placement || "bottom", + strategy: options.strategy || "absolute", + modifiers: options.modifiers || EMPTY_MODIFIERS + }; + var _React$useState = _react_17_0_2_react.exports.useState({ + styles: { + popper: { + position: optionsWithDefaults.strategy, + left: "0", + top: "0" + }, + arrow: { + position: "absolute" + } + }, + attributes: {} + }), state = _React$useState[0], setState = _React$useState[1]; + var updateStateModifier = _react_17_0_2_react.exports.useMemo(function() { return { - linkText: internalFileName, - altText: internalAltName, - path: "", - filePath: "" + name: "updateState", + enabled: true, + phase: "write", + fn: function fn2(_ref) { + var state2 = _ref.state; + var elements = Object.keys(state2.elements); + setState({ + styles: fromEntries(elements.map(function(element) { + return [element, state2.styles[element] || {}]; + })), + attributes: fromEntries(elements.map(function(element) { + return [element, state2.attributes[element]]; + })) + }); + }, + requires: ["computeStyles"] }; - } else { - const imagePath = getPathOfImage(app2.vault, file); - if (internalAltName) { - return { - linkText: internalFileName, - altText: internalAltName, - path: imagePath, - filePath: file.path - }; + }, []); + var popperOptions = _react_17_0_2_react.exports.useMemo(function() { + var newOptions = { + onFirstUpdate: optionsWithDefaults.onFirstUpdate, + placement: optionsWithDefaults.placement, + strategy: optionsWithDefaults.strategy, + modifiers: [].concat(optionsWithDefaults.modifiers, [updateStateModifier, { + name: "applyStyles", + enabled: false + }]) + }; + if (_reactFastCompare_3_2_0_reactFastCompare(prevOptions.current, newOptions)) { + return prevOptions.current || newOptions; } else { - return { - linkText: internalFileName, - altText: "", - path: imagePath, - filePath: file.path - }; - } - } -}; -const DailyMemo = (props) => { - var _a; - const { - app: app2 - } = appStore.getState().dailyNotesState; - const { - memo: propsMemo - } = props; - const memo2 = __spreadProps(__spreadValues({}, propsMemo), { - createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt), - timeStr: utils$1.getTimeString(propsMemo.createdAt) - }); - let externalImageUrls = []; - let internalImageUrls = []; - let allMarkdownLink = []; - let allInternalLink = []; - if (IMAGE_URL_REG.test(memo2.content)) { - let allExternalImageUrls = []; - let anotherExternalImageUrls = []; - if (MARKDOWN_URL_REG.test(memo2.content)) { - allMarkdownLink = Array.from(memo2.content.match(MARKDOWN_URL_REG)); - } - if (WIKI_IMAGE_URL_REG.test(memo2.content)) { - allInternalLink = Array.from(memo2.content.match(WIKI_IMAGE_URL_REG)); - } - if (MARKDOWN_WEB_URL_REG.test(memo2.content)) { - allExternalImageUrls = Array.from(memo2.content.match(MARKDOWN_WEB_URL_REG)); + prevOptions.current = newOptions; + return newOptions; } - if (allInternalLink.length) { - for (let i = 0; i < allInternalLink.length; i++) { - let one = allInternalLink[i]; - internalImageUrls.push(detectWikiInternalLink(one, app2)); - } + }, [optionsWithDefaults.onFirstUpdate, optionsWithDefaults.placement, optionsWithDefaults.strategy, optionsWithDefaults.modifiers, updateStateModifier]); + var popperInstanceRef = _react_17_0_2_react.exports.useRef(); + useIsomorphicLayoutEffect(function() { + if (popperInstanceRef.current) { + popperInstanceRef.current.setOptions(popperOptions); } - if (allMarkdownLink.length) { - for (let i = 0; i < allMarkdownLink.length; i++) { - let two = allMarkdownLink[i]; - if (/(.*)http[s]?(.*)/.test(two)) { - anotherExternalImageUrls.push((_a = MARKDOWN_URL_REG.exec(two)) == null ? void 0 : _a[5]); - } else { - internalImageUrls.push(detectMDInternalLink(two, app2)); - } - } + }, [popperOptions]); + useIsomorphicLayoutEffect(function() { + if (referenceElement == null || popperElement == null) { + return; } - externalImageUrls = allExternalImageUrls.concat(anotherExternalImageUrls); - } - return /* @__PURE__ */ jsxs("div", { - className: "daily-memo-wrapper", - children: [/* @__PURE__ */ jsx("div", { - className: "time-wrapper", - children: /* @__PURE__ */ jsx("span", { - className: "normal-text", - children: memo2.timeStr - }) - }), /* @__PURE__ */ jsxs("div", { - className: "memo-content-container", - children: [/* @__PURE__ */ jsx("div", { - className: "memo-content-text", - dangerouslySetInnerHTML: { - __html: formatMemoContent(memo2.content) - } - }), /* @__PURE__ */ jsx(Only, { - when: externalImageUrls.length > 0, - children: /* @__PURE__ */ jsx("div", { - className: "images-container", - children: externalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", { - src: imgUrl, - referrerPolicy: "no-referrer" - }, idx)) - }) - }), /* @__PURE__ */ jsx(Only, { - when: internalImageUrls.length > 0, - children: /* @__PURE__ */ jsx("div", { - className: "images-container internal-embed image-embed is-loaded", - children: internalImageUrls.map((imgUrl, idx) => /* @__PURE__ */ jsx("img", { - src: imgUrl.path, - alt: imgUrl.altText, - path: imgUrl.filePath - }, idx)) - }) - })] - })] - }); + var createPopper$1 = options.createPopper || createPopper; + var popperInstance = createPopper$1(referenceElement, popperElement, popperOptions); + popperInstanceRef.current = popperInstance; + return function() { + popperInstance.destroy(); + popperInstanceRef.current = null; + }; + }, [referenceElement, popperElement, options.createPopper]); + return { + state: popperInstanceRef.current ? popperInstanceRef.current.state : null, + styles: state.styles, + attributes: state.attributes, + update: popperInstanceRef.current ? popperInstanceRef.current.update : null, + forceUpdate: popperInstanceRef.current ? popperInstanceRef.current.forceUpdate : null + }; }; -var datePicker = ""; -var arrowLeft = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJsNC41OC00LjU5eiIvPjwvc3ZnPg=="; -var arrowRight = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02LTYtNnoiLz48L3N2Zz4="; -const DatePicker = (props) => { - var _a, _b; +const getCursorPostion = (input) => { const { - className, - datestamp, - handleDateStampChange - } = props; - const [currentDateStamp, setCurrentDateStamp] = _react_17_0_2_react.exports.useState(getMonthFirstDayDateStamp(datestamp)); - _react_17_0_2_react.exports.useEffect(() => { - setCurrentDateStamp(getMonthFirstDayDateStamp(datestamp)); - }, [datestamp]); - const firstDate = new Date(currentDateStamp); - const firstDateDay = firstDate.getDay() === 0 ? 7 : firstDate.getDay(); - const dayList = []; - for (let i = 0; i < firstDateDay; i++) { - dayList.push({ - date: 0, - datestamp: firstDate.getTime() - DAILY_TIMESTAMP * (7 - i) - }); + offsetLeft: inputX, + offsetTop: inputY, + offsetHeight: inputH, + offsetWidth: inputW, + selectionEnd: selectionPoint + } = input; + const div = document.createElement("div"); + const copyStyle = window.getComputedStyle(input); + for (const item of copyStyle) { + div.style.setProperty(item, copyStyle.getPropertyValue(item)); } - const dayAmount = getMonthDayAmount(currentDateStamp); - for (let i = 1; i <= dayAmount; i++) { - dayList.push({ - date: i, - datestamp: firstDate.getTime() + DAILY_TIMESTAMP * (i - 1) - }); + div.style.position = "fixed"; + div.style.visibility = "hidden"; + div.style.whiteSpace = "pre-wrap"; + const swap = "."; + const inputValue = input.tagName === "INPUT" ? input.value.replace(/ /g, swap) : input.value; + div.textContent = inputValue.substring(0, selectionPoint || 0); + if (input.tagName === "TEXTAREA") { + div.style.height = "auto"; } - const handleDateItemClick = (datestamp2) => { - handleDateStampChange(datestamp2); - }; - const handleChangeMonthBtnClick = (i) => { - const year = firstDate.getFullYear(); - const month = firstDate.getMonth() + 1; - let nextDateStamp = 0; - if (month === 1 && i === -1) { - nextDateStamp = new Date(`${year - 1}/12/1`).getTime(); - } else if (month === 12 && i === 1) { - nextDateStamp = new Date(`${year + 1}/1/1`).getTime(); - } else { - nextDateStamp = new Date(`${year}/${month + i}/1`).getTime(); - } - setCurrentDateStamp(getMonthFirstDayDateStamp(nextDateStamp)); - }; - return /* @__PURE__ */ jsxs("div", { - className: `date-picker-wrapper ${className}`, - children: [/* @__PURE__ */ jsxs("div", { - className: "date-picker-header", - children: [/* @__PURE__ */ jsx("span", { - className: "btn-text", - onClick: () => handleChangeMonthBtnClick(-1), - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: arrowLeft - }) - }), /* @__PURE__ */ jsxs("span", { - className: "normal-text", - children: [firstDate.getFullYear(), " ", t("year"), " ", (_a = t("monthsShort")[firstDate.getMonth()]) != null ? _a : firstDate.getMonth() + 1, " ", (_b = t("month")) != null ? _b : ""] - }), /* @__PURE__ */ jsx("span", { - className: "btn-text", - onClick: () => handleChangeMonthBtnClick(1), - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: arrowRight - }) - })] - }), /* @__PURE__ */ jsxs("div", { - className: "date-picker-day-container", - children: [/* @__PURE__ */ jsxs("div", { - className: "date-picker-day-header", - children: [/* @__PURE__ */ jsx("span", { - className: "day-item", - children: t("weekDaysShort")[0] - }), /* @__PURE__ */ jsx("span", { - className: "day-item", - children: t("weekDaysShort")[1] - }), /* @__PURE__ */ jsx("span", { - className: "day-item", - children: t("weekDaysShort")[2] - }), /* @__PURE__ */ jsx("span", { - className: "day-item", - children: t("weekDaysShort")[3] - }), /* @__PURE__ */ jsx("span", { - className: "day-item", - children: t("weekDaysShort")[4] - }), /* @__PURE__ */ jsx("span", { - className: "day-item", - children: t("weekDaysShort")[5] - }), /* @__PURE__ */ jsx("span", { - className: "day-item", - children: t("weekDaysShort")[6] - })] - }), dayList.map((d) => { - if (d.date === 0) { - return /* @__PURE__ */ jsx("span", { - className: "day-item null", - children: "" - }, d.datestamp); - } else { - return /* @__PURE__ */ jsx("span", { - className: `day-item ${d.datestamp === datestamp ? "current" : ""}`, - onClick: () => handleDateItemClick(d.datestamp), - children: d.date - }, d.datestamp); - } - })] - })] - }); + const span = document.createElement("span"); + span.textContent = inputValue.substring(selectionPoint || 0) || "."; + div.appendChild(span); + document.body.appendChild(div); + const { + offsetLeft: spanX, + offsetTop: spanY, + offsetHeight: spanH, + offsetWidth: spanW + } = span; + document.body.removeChild(div); + return { + x: inputX + spanX, + y: inputY + spanY, + h: inputH + spanH, + w: inputW + spanW + }; }; -function getMonthDayAmount(datestamp) { - const dateTemp = new Date(datestamp); - const currentDate = new Date(`${dateTemp.getFullYear()}/${dateTemp.getMonth() + 1}/1`); - const nextMonthDate = currentDate.getMonth() === 11 ? new Date(`${currentDate.getFullYear() + 1}/1/1`) : new Date(`${currentDate.getFullYear()}/${currentDate.getMonth() + 2}/1`); - return (nextMonthDate.getTime() - currentDate.getTime()) / DAILY_TIMESTAMP; -} -function getMonthFirstDayDateStamp(timestamp) { - const dateTemp = new Date(timestamp); - const currentDate = new Date(`${dateTemp.getFullYear()}/${dateTemp.getMonth() + 1}/1`); - return currentDate.getTime(); -} -var dailyMemoDiaryDialog = ""; -const DailyMemoDiaryDialog = (props) => { - const loadingState = useLoading(); - const [memos, setMemos] = _react_17_0_2_react.exports.useState([]); - const [currentDateStamp, setCurrentDateStamp] = _react_17_0_2_react.exports.useState(utils$1.getDateStampByDate(utils$1.getDateString(props.currentDateStamp))); - const [showDatePicker, toggleShowDatePicker] = useToggle(false); - const memosElRef = _react_17_0_2_react.exports.useRef(null); - const currentDate = new Date(currentDateStamp); +let isList; +let isEditor = false; +let isEditorGo = false; +let positionX; +const MemoEditor = () => { const { - vault - } = appStore.getState().dailyNotesState.app; + globalState + } = _react_17_0_2_react.exports.useContext(appContext); + const { + app: app2 + } = dailyNotesService.getState(); + const [isListShown, toggleList] = useToggle(false); + const [isEditorShown, toggleEditor] = dist(false); + const editorRef = _react_17_0_2_react.exports.useRef(null); + const prevGlobalStateRef = _react_17_0_2_react.exports.useRef(globalState); + const [isDatePickerOpen, setIsDatePickerOpen] = dist(false); + const popperRef = _react_17_0_2_react.exports.useRef(null); + const [popperElement, setPopperElement] = dist(null); + const [currentDateStamp] = dist(parseInt(require$$0.moment().format("x"))); _react_17_0_2_react.exports.useEffect(() => { - const setDailyMemos = () => { - const dailyMemos = memoService.getState().memos.filter((a) => utils$1.getTimeStampByDate(a.createdAt) >= currentDateStamp && utils$1.getTimeStampByDate(a.createdAt) < currentDateStamp + DAILY_TIMESTAMP).sort((a, b) => utils$1.getTimeStampByDate(a.createdAt) - utils$1.getTimeStampByDate(b.createdAt)); - setMemos(dailyMemos); - loadingState.setFinish(); - }; - setDailyMemos(); - }, [currentDateStamp]); - const convertBase64ToBlob = (base64, type) => { - var bytes = window.atob(base64); - var ab2 = new ArrayBuffer(bytes.length); - var ia2 = new Uint8Array(ab2); - for (var i = 0; i < bytes.length; i++) { - ia2[i] = bytes.charCodeAt(i); + if (!editorRef.current) { + return; } - return new Blob([ab2], { - type - }); - }; - const handleShareBtnClick = async () => { - toggleShowDatePicker(false); - setTimeout(() => { - if (!memosElRef.current) { - return; + if (DefaultPrefix === "List") { + isList = false; + toggleList(false); + } else { + isList = true; + toggleList(true); + } + isEditor = false; + }, []); + _react_17_0_2_react.exports.useEffect(() => { + var _a; + if (!editorRef.current) { + return; + } + const leaves = app2.workspace.getLeavesOfType(MEMOS_VIEW_TYPE); + let memosWidth; + if (leaves.length > 0) { + const leaf = leaves[0]; + memosWidth = leaf.width > 0 ? leaf.width : window.outerWidth; + } else { + memosWidth = window.outerWidth; + } + if ((require$$0.Platform.isMobile === true || memosWidth < 875) && UseButtonToShowEditor) { + toggleEditor(true); + } + if (FocusOnEditor) { + (_a = editorRef.current) == null ? void 0 : _a.focus(); + } + }, []); + _react_17_0_2_react.exports.useEffect(() => { + var _a, _b; + if (!editorRef.current) { + return; + } + if (UseButtonToShowEditor === true && DefaultEditorLocation === "Bottom" && require$$0.Platform.isMobile === true && window.innerWidth < 875) { + const leaves = app2.workspace.getLeavesOfType(MEMOS_VIEW_TYPE); + let memosHeight; + let leafView; + if (leaves.length > 0) { + const leaf = leaves[0]; + leafView = leaf.view.containerEl; + memosHeight = leafView.offsetHeight; + } else { + leafView = document; + memosHeight = window.innerHeight; } - toImage(memosElRef.current, { - backgroundColor: "#ffffff", - pixelRatio: window.devicePixelRatio * 2 - }).then((url) => { - if (AutoSaveWhenOnMobile && require$$0.Platform.isMobile) { - const myBase64 = url.split("base64,")[1]; - const blobInput = convertBase64ToBlob(myBase64, "image/png"); - blobInput.arrayBuffer().then(async (buffer) => { - let aFile; - const ext = "png"; - const dailyNotes = getAllDailyNotes_1(); - for (const string in dailyNotes) { - if (dailyNotes[string] instanceof require$$0.TFile) { - aFile = dailyNotes[string]; - break; + const divThis = document.createElement("img"); + const memoEditorDiv = leafView.querySelector("div[data-type='memos_view'] .view-content .memo-editor-wrapper"); + divThis.src = `${showEditorSvg}`; + if (isEditorShown) { + divThis.className = "memo-show-editor-button hidden"; + } else { + divThis.className = "memo-show-editor-button"; + } + const buttonTop = memosHeight - 200; + const buttonLeft = window.innerWidth / 2 - 25; + divThis.style.top = buttonTop + "px"; + divThis.style.left = buttonLeft + "px"; + divThis.onclick = function() { + const scaleElementAni = divThis.animate([ + { + transform: "rotate(0deg) scale(1)" + }, + { + transform: "rotate(60deg) scale(1.5)" + } + ], { + duration: 300, + iterations: Infinity + }); + setTimeout(() => { + var _a2, _b2; + divThis.className = "memo-show-editor-button hidden"; + if (isEditor) { + handleShowEditor(false); + (_a2 = editorRef.current) == null ? void 0 : _a2.focus(); + scaleElementAni.reverse(); + } else { + handleShowEditor(); + (_b2 = editorRef.current) == null ? void 0 : _b2.focus(); + scaleElementAni.reverse(); + } + }, 300); + }; + leafView.querySelector(".content-wrapper").prepend(divThis); + const memolistScroll = leafView.querySelector(".memolist-wrapper"); + memolistScroll.onscroll = function() { + if (isEditor && !isEditorGo) { + isEditorGo = true; + const scaleEditorElementAni = memoEditorDiv.animate([ + { + transform: "scale(1)", + opacity: 1 + }, + { + transform: "scale(0.4)", + opacity: 0 + } + ], { + duration: 300, + iterations: 1 + }); + let scaleOneElementAni; + setTimeout(() => { + scaleOneElementAni = divThis.animate([ + { + transform: "rotate(20deg) scale(1.5)" + }, + { + transform: "rotate(0deg) scale(1)" } + ], { + duration: 100, + iterations: 1 + }); + }, 300); + setTimeout(() => { + handleShowEditor(true); + divThis.className = "memo-show-editor-button"; + }, 300); + setTimeout(() => { + scaleOneElementAni.cancel(); + scaleEditorElementAni.reverse(); + }, 700); + } + }; + } else if (UseButtonToShowEditor === false && DefaultEditorLocation === "Bottom" && require$$0.Platform.isMobile === true && window.innerWidth < 875) { + handleShowEditor(false); + if (FocusOnEditor) { + (_a = editorRef.current) == null ? void 0 : _a.focus(); + } + } else { + if (!isEditor) { + handleShowEditor(false); + } + if (FocusOnEditor) { + (_b = editorRef.current) == null ? void 0 : _b.focus(); + } + } + }, []); + const setPopper = () => { + let popperTemp; + if (!require$$0.Platform.isMobile) { + popperTemp = usePopper(popperRef.current, popperElement, { + placement: "right-end", + modifiers: [{ + name: "flip", + options: { + allowedAutoPlacements: ["bottom"], + rootBoundary: "document" + } + }] + }); + } else if (require$$0.Platform.isMobile && DefaultEditorLocation !== "Bottom") { + const seletorPopupWidth = 280; + if (window.innerWidth - positionX > seletorPopupWidth * 1.2) { + popperTemp = usePopper(popperRef.current, popperElement, { + placement: "right-end", + modifiers: [{ + name: "flip", + options: { + allowedAutoPlacements: ["left-end"], + rootBoundary: "document" } - if (aFile !== void 0) { - await vault.createBinary(await vault.getAvailablePathForAttachments(`Pasted Image ${require$$0.moment().format("YYYYMMDDHHmmss")}`, ext, aFile), buffer); + }, { + name: "preventOverflow", + options: { + rootBoundary: "document" } - }); + }] + }); + } else if (window.innerWidth - positionX < seletorPopupWidth && window.innerWidth > seletorPopupWidth * 1.5) { + popperTemp = usePopper(popperRef.current, popperElement, { + placement: "left-end", + modifiers: [{ + name: "flip", + options: { + allowedAutoPlacements: ["right-end"], + rootBoundary: "document" + } + }, { + name: "preventOverflow", + options: { + rootBoundary: "document" + } + }] + }); + } else { + popperTemp = usePopper(popperRef.current, popperElement, { + placement: "bottom", + modifiers: [{ + name: "flip", + options: { + allowedAutoPlacements: ["bottom"], + rootBoundary: "document" + } + }, { + name: "preventOverflow", + options: { + rootBoundary: "document" + } + }] + }); + } + } else if (require$$0.Platform.isMobile && DefaultEditorLocation === "Bottom") { + const seletorPopupWidth = 280; + if (window.innerWidth - positionX > seletorPopupWidth * 1.2) { + popperTemp = usePopper(popperRef.current, popperElement, { + placement: "top-end", + modifiers: [{ + name: "flip", + options: { + allowedAutoPlacements: ["top-start"], + rootBoundary: "document" + } + }, { + name: "preventOverflow", + options: { + rootBoundary: "document" + } + }] + }); + } else if (window.innerWidth - positionX < seletorPopupWidth && positionX > seletorPopupWidth) { + popperTemp = usePopper(popperRef.current, popperElement, { + placement: "top-start", + modifiers: [{ + name: "flip", + options: { + allowedAutoPlacements: ["top-end"], + rootBoundary: "document" + } + }, { + name: "preventOverflow", + options: { + rootBoundary: "document" + } + }] + }); + } else { + popperTemp = usePopper(popperRef.current, popperElement, { + placement: "top", + modifiers: [{ + name: "flip", + options: { + allowedAutoPlacements: ["top"], + rootBoundary: "document" + } + }, { + name: "preventOverflow", + options: { + rootBoundary: "document" + } + }] + }); + } + } + return popperTemp; + }; + const popper2 = setPopper(); + const closePopper = () => { + setIsDatePickerOpen(false); + }; + _react_17_0_2_react.exports.useEffect(() => { + var _a, _b, _c, _d, _e; + if (globalState.markMemoId) { + const editorCurrentValue = (_a = editorRef.current) == null ? void 0 : _a.getContent(); + const memoLinkText = `${editorCurrentValue ? "\n" : ""}${t$1("MARK")}: [@MEMO](${globalState.markMemoId})`; + (_b = editorRef.current) == null ? void 0 : _b.insertText(memoLinkText); + globalStateService.setMarkMemoId(""); + } + if (globalState.editMemoId && globalState.editMemoId !== prevGlobalStateRef.current.editMemoId) { + const editMemo = memoService.getMemoById(globalState.editMemoId); + if (editMemo) { + (_d = editorRef.current) == null ? void 0 : _d.setContent((_c = editMemo.content.replace(/
/g, "\n").replace(/ \^\S{6}$/, "")) != null ? _c : ""); + (_e = editorRef.current) == null ? void 0 : _e.focus(); + } + } + prevGlobalStateRef.current = globalState; + }, [globalState.markMemoId, globalState.editMemoId]); + _react_17_0_2_react.exports.useEffect(() => { + if (!editorRef.current) { + return; + } + const handlePasteEvent = async (event) => { + var _a; + if (event.clipboardData && event.clipboardData.files.length > 0) { + event.preventDefault(); + const file = event.clipboardData.files[0]; + const url = await handleUploadFile(file); + if (url) { + (_a = editorRef.current) == null ? void 0 : _a.insertText(url); } - showPreviewImageDialog(url); - }).catch(() => { + } + }; + const handleDropEvent = async (event) => { + var _a; + if (event.dataTransfer && event.dataTransfer.files.length > 0) { + event.preventDefault(); + const file = event.dataTransfer.files[0]; + const url = await handleUploadFile(file); + if (url) { + (_a = editorRef.current) == null ? void 0 : _a.insertText(url); + } + } + }; + const handleClickEvent = () => { + var _a, _b; + handleContentChange((_b = (_a = editorRef.current) == null ? void 0 : _a.element.value) != null ? _b : ""); + }; + const handleKeyDownEvent = () => { + setTimeout(() => { + var _a, _b; + handleContentChange((_b = (_a = editorRef.current) == null ? void 0 : _a.element.value) != null ? _b : ""); }); - }, 0); - }; - const handleDataPickerChange = (datestamp) => { - setCurrentDateStamp(datestamp); - toggleShowDatePicker(false); - }; - return /* @__PURE__ */ jsxs(Fragment, { - children: [/* @__PURE__ */ jsx("div", { - className: "dialog-header-container", - children: /* @__PURE__ */ jsxs("div", { - className: "header-wrapper", - children: [/* @__PURE__ */ jsx("p", { - className: "title-text", - children: t("Daily Memos") - }), /* @__PURE__ */ jsxs("div", { - className: "btns-container", - children: [/* @__PURE__ */ jsx("span", { - className: "btn-text", - onClick: () => setCurrentDateStamp(currentDateStamp - DAILY_TIMESTAMP), - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: arrowLeft - }) - }), /* @__PURE__ */ jsx("span", { - className: "btn-text", - onClick: () => setCurrentDateStamp(currentDateStamp + DAILY_TIMESTAMP), - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: arrowRight - }) - }), /* @__PURE__ */ jsx("span", { - className: "btn-text share-btn", - onClick: handleShareBtnClick, - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: share - }) - }), /* @__PURE__ */ jsx("span", { - className: "btn-text", - onClick: () => props.destroy(), - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: close - }) - })] - })] - }) - }), /* @__PURE__ */ jsxs("div", { - className: "dialog-content-container", - ref: memosElRef, - children: [/* @__PURE__ */ jsxs("div", { - className: "date-card-container", - onClick: () => toggleShowDatePicker(), - children: [/* @__PURE__ */ jsx("div", { - className: "year-text", - children: currentDate.getFullYear() - }), /* @__PURE__ */ jsxs("div", { - className: "date-container", - children: [/* @__PURE__ */ jsx("div", { - className: "month-text", - children: t("months")[currentDate.getMonth()] - }), /* @__PURE__ */ jsx("div", { - className: "date-text", - children: currentDate.getDate() - }), /* @__PURE__ */ jsx("div", { - className: "day-text", - children: t("weekDays")[currentDate.getDay()] - })] - })] - }), /* @__PURE__ */ jsx(DatePicker, { - className: `date-picker ${showDatePicker ? "" : "hidden"}`, - datestamp: currentDateStamp, - handleDateStampChange: handleDataPickerChange - }), loadingState.isLoading ? /* @__PURE__ */ jsx("div", { - className: "tip-container", - children: /* @__PURE__ */ jsx("p", { - className: "tip-text", - children: t("Loading...") - }) - }) : memos.length === 0 ? /* @__PURE__ */ jsx("div", { - className: "tip-container", - children: /* @__PURE__ */ jsx("p", { - className: "tip-text", - children: t("Noooop!") - }) - }) : /* @__PURE__ */ jsx("div", { - className: "dailymemos-wrapper", - children: memos.map((memo2) => /* @__PURE__ */ jsx(DailyMemo, { - memo: memo2 - }, `${memo2.id}-${memo2.updatedAt}`)) - })] - })] - }); -}; -function showDailyMemoDiaryDialog(datestamp = Date.now()) { - showDialog({ - className: "daily-memo-diary-dialog" - }, DailyMemoDiaryDialog, { - currentDateStamp: datestamp - }); -} -var userBanner = ""; -const UserBanner = () => { - const { - memoState: { - memos, - tags - }, - userState: { - user + }; + editorRef.current.element.addEventListener("paste", handlePasteEvent); + editorRef.current.element.addEventListener("drop", handleDropEvent); + editorRef.current.element.addEventListener("click", handleClickEvent); + editorRef.current.element.addEventListener("keydown", handleKeyDownEvent); + return () => { + var _a, _b; + (_a = editorRef.current) == null ? void 0 : _a.element.removeEventListener("paste", handlePasteEvent); + (_b = editorRef.current) == null ? void 0 : _b.element.removeEventListener("drop", handleDropEvent); + }; + }, [editorRef.current]); + const handleUploadFile = _react_17_0_2_react.exports.useCallback(async (file) => { + const { + type + } = file; + if (!type.startsWith("image")) { + return; + } + try { + const image2 = await resourceService.upload(file); + return `${image2}`; + } catch (error) { + new require$$0.Notice(error); } - } = _react_17_0_2_react.exports.useContext(appContext); - const username = user ? user.username : UserName; - let memosLength; - let createdDays; - if (memos.length) { - memosLength = memos.length - 1; - createdDays = memos ? Math.ceil((Date.now() - utils$1.getTimeStampByDate(memos[memosLength].createdAt)) / 1e3 / 3600 / 24) + 1 : 0; - } - const [shouldShowPopupBtns, setShouldShowPopupBtns] = _react_17_0_2_react.exports.useState(false); - const handleUsernameClick = _react_17_0_2_react.exports.useCallback(() => { - locationService.pushHistory("/"); - locationService.clearQuery(); }, []); - const handlePopupBtnClick = () => { - const sidebarEl = document.querySelector(".memos-sidebar-wrapper"); - const popupEl = document.querySelector(".menu-btns-popup"); - popupEl.style.top = 70 - sidebarEl.scrollTop + "px"; - setShouldShowPopupBtns(true); - }; - return /* @__PURE__ */ jsxs("div", { - className: "user-banner-container", - children: [/* @__PURE__ */ jsxs("div", { - className: "userinfo-header-container", - children: [/* @__PURE__ */ jsx("p", { - className: "username-text", - onClick: handleUsernameClick, - children: username - }), /* @__PURE__ */ jsx("span", { - className: "action-btn menu-popup-btn", - onClick: handlePopupBtnClick, - children: /* @__PURE__ */ jsx("img", { - src: more, - className: "icon-img" - }) - }), /* @__PURE__ */ jsx(MenuBtnsPopup, { - shownStatus: shouldShowPopupBtns, - setShownStatus: setShouldShowPopupBtns - })] - }), /* @__PURE__ */ jsxs("div", { - className: "status-text-container", - children: [/* @__PURE__ */ jsxs("div", { - className: "status-text memos-text", - children: [/* @__PURE__ */ jsx("span", { - className: "amount-text", - children: memos.length - }), /* @__PURE__ */ jsx("span", { - className: "type-text", - children: "MEMO" - })] - }), /* @__PURE__ */ jsxs("div", { - className: "status-text tags-text", - children: [/* @__PURE__ */ jsx("span", { - className: "amount-text", - children: tags.length - }), /* @__PURE__ */ jsx("span", { - className: "type-text", - children: t("TAG") - })] - }), /* @__PURE__ */ jsxs("div", { - className: "status-text duration-text", - onClick: () => showDailyMemoDiaryDialog(), - children: [/* @__PURE__ */ jsx("span", { - className: "amount-text", - children: createdDays != null ? createdDays : 0 - }), /* @__PURE__ */ jsx("span", { - className: "type-text", - children: t("DAY") - })] - })] - })] - }); -}; -var selector = ""; -const nullItem = { - text: t("SELECT"), - value: "" -}; -const Selector = (props) => { - const { - className, - dataSource, - handleValueChanged, - value - } = props; - const [showSelector, toggleSelectorStatus] = useToggle(false); - const seletorElRef = _react_17_0_2_react.exports.useRef(null); - let currentItem = nullItem; - for (const d of dataSource) { - if (d.value === value) { - currentItem = d; - break; + const handleSaveBtnClick = _react_17_0_2_react.exports.useCallback(async (content) => { + if (content === "") { + new require$$0.Notice(t$1("Content cannot be empty")); + return; + } + const { + editMemoId + } = globalStateService.getState(); + content = content.replaceAll(" ", " "); + setEditorContentCache(""); + try { + if (editMemoId) { + const prevMemo = memoService.getMemoById(editMemoId); + content = content + (prevMemo.hasId === "" ? "" : " ^" + prevMemo.hasId); + if (prevMemo && prevMemo.content !== content) { + const editedMemo = await memoService.updateMemo(prevMemo.id, prevMemo.content, content, prevMemo.memoType, prevMemo.path); + editedMemo.updatedAt = utils$1.getDateTimeString(Date.now()); + memoService.editMemo(editedMemo); + } + globalStateService.setEditMemoId(""); + } else { + const newMemo = await memoService.createMemo(content, isList); + memoService.pushMemo(newMemo); + locationService.clearQuery(); + } + } catch (error) { + new require$$0.Notice(error.message); + } + setEditorContentCache(""); + }, []); + const handleCancelBtnClick = _react_17_0_2_react.exports.useCallback(() => { + var _a; + globalStateService.setEditMemoId(""); + (_a = editorRef.current) == null ? void 0 : _a.setContent(""); + setEditorContentCache(""); + }, []); + const handleContentChange = _react_17_0_2_react.exports.useCallback((content) => { + const tempDiv = document.createElement("div"); + tempDiv.innerHTML = content; + if (tempDiv.innerText.trim() === "") { + content = ""; } - } - _react_17_0_2_react.exports.useEffect(() => { - if (showSelector) { - const handleClickOutside = (event) => { - var _a; - if (!((_a = seletorElRef.current) == null ? void 0 : _a.contains(event.target))) { - toggleSelectorStatus(false); - } - }; - window.addEventListener("click", handleClickOutside, { - capture: true, - once: true - }); + setEditorContentCache(content); + if (!editorRef.current) { + return; } - }, [showSelector]); - const handleItemClick = (item) => { - if (handleValueChanged) { - handleValueChanged(item.value); + const currentValue = editorRef.current.getContent(); + const selectionStart = editorRef.current.element.selectionStart; + const prevString = currentValue.slice(0, selectionStart); + const nextString = currentValue.slice(selectionStart); + if ((prevString.endsWith("@") || prevString.endsWith("\u{1F4C6}")) && nextString.startsWith(" ")) { + updateDateSelectorPopupPosition(); + setIsDatePickerOpen(true); + } else if ((prevString.endsWith("@") || prevString.endsWith("\u{1F4C6}")) && nextString === "") { + updateDateSelectorPopupPosition(); + setIsDatePickerOpen(true); + } else { + setIsDatePickerOpen(false); + } + setTimeout(() => { + var _a; + (_a = editorRef.current) == null ? void 0 : _a.focus(); + }); + }, []); + const handleDateInsertTrigger = (date) => { + if (!editorRef.current) { + return; + } + if (date) { + closePopper(); + isList = true; + toggleList(true); + } + const currentValue = editorRef.current.getContent(); + const selectionStart = editorRef.current.element.selectionStart; + const prevString = currentValue.slice(0, selectionStart); + const nextString = currentValue.slice(selectionStart); + const todayMoment = require$$0.moment(date); + if (!prevString.endsWith("@")) { + editorRef.current.element.value = prevString + todayMoment.format("YYYY-MM-DD") + nextString; + editorRef.current.element.setSelectionRange(selectionStart + 10, selectionStart + 10); + editorRef.current.focus(); + handleContentChange(editorRef.current.element.value); + return; + } else { + switch (InsertDateFormat) { + case "Dataview": + editorRef.current.element.value = currentValue.slice(0, editorRef.current.element.selectionStart - 1) + "[due::" + todayMoment.format("YYYY-MM-DD") + "]" + nextString; + editorRef.current.element.setSelectionRange(selectionStart + 17, selectionStart + 17); + editorRef.current.focus(); + handleContentChange(editorRef.current.element.value); + break; + case "Tasks": + editorRef.current.element.value = currentValue.slice(0, editorRef.current.element.selectionStart - 1) + "\u{1F4C6}" + todayMoment.format("YYYY-MM-DD") + nextString; + editorRef.current.element.setSelectionRange(selectionStart + 11, selectionStart + 11); + editorRef.current.focus(); + handleContentChange(editorRef.current.element.value); + } } - toggleSelectorStatus(false); }; - const handleCurrentValueClick = (event) => { - event.stopPropagation(); - toggleSelectorStatus(); + const handleChangeStatus = () => { + if (!editorRef.current) { + return; + } + if (isList) { + isList = false; + toggleList(false); + } else { + isList = true; + toggleList(true); + } + }; + const handleShowEditor = (flag) => { + if (!editorRef.current) { + return; + } + if (isEditor || flag === true) { + isEditor = false; + toggleEditor(true); + } else { + isEditor = true; + isEditorGo = false; + toggleEditor(false); + } }; + const handleTagTextBtnClick = _react_17_0_2_react.exports.useCallback(() => { + if (!editorRef.current) { + return; + } + const currentValue = editorRef.current.getContent(); + const selectionStart = editorRef.current.element.selectionStart; + const prevString = currentValue.slice(0, selectionStart); + const nextString = currentValue.slice(selectionStart); + let nextValue = prevString + "# " + nextString; + let cursorIndex = prevString.length + 1; + if (prevString.endsWith("#") && nextString.startsWith(" ")) { + nextValue = prevString.slice(0, prevString.length - 1) + nextString.slice(1); + cursorIndex = prevString.length - 1; + } + editorRef.current.element.value = nextValue; + editorRef.current.element.setSelectionRange(cursorIndex, cursorIndex); + editorRef.current.focus(); + handleContentChange(editorRef.current.element.value); + }, []); + const updateDateSelectorPopupPosition = _react_17_0_2_react.exports.useCallback(() => { + if (!editorRef.current || !popperRef.current) { + return; + } + const leaves = app2.workspace.getLeavesOfType(MEMOS_VIEW_TYPE); + const leaf = leaves[0]; + const leafView = leaf.view.containerEl; + const seletorPopupWidth = 280; + const editorWidth = leafView.clientWidth; + const { + x: x2, + y: y2 + } = getCursorPostion(editorRef.current.element); + let left2; + let top2; + if (!require$$0.Platform.isMobile) { + left2 = x2 + seletorPopupWidth + 16 > editorWidth ? x2 + 18 : x2 + 18; + top2 = y2 + 34; + } else { + if (window.innerWidth - x2 > seletorPopupWidth) { + left2 = x2 + seletorPopupWidth + 16 > editorWidth ? x2 + 18 : x2 + 18; + } else if (window.innerWidth - x2 < seletorPopupWidth) { + left2 = x2 + seletorPopupWidth + 16 > editorWidth ? x2 + 34 : x2 + 34; + } else { + left2 = editorRef.current.element.clientWidth / 2; + } + if (DefaultEditorLocation === "Bottom" && window.innerWidth > 875) { + top2 = y2 + 4; + } else if (DefaultEditorLocation === "Bottom" && window.innerWidth <= 875) { + top2 = y2 + 19; + } else if (DefaultEditorLocation === "Top" && window.innerWidth <= 875) { + top2 = y2 + 36; + } + } + positionX = x2; + popperRef.current.style.left = `${left2}px`; + popperRef.current.style.top = `${top2}px`; + }, []); + const handleUploadFileBtnClick = _react_17_0_2_react.exports.useCallback(() => { + const inputEl = document.createElement("input"); + document.body.appendChild(inputEl); + inputEl.type = "file"; + inputEl.multiple = false; + inputEl.accept = "image/png, image/gif, image/jpeg"; + inputEl.onchange = async () => { + var _a; + if (!inputEl.files || inputEl.files.length === 0) { + return; + } + const file = inputEl.files[0]; + const url = await handleUploadFile(file); + if (url) { + (_a = editorRef.current) == null ? void 0 : _a.insertText(url); + } + document.body.removeChild(inputEl); + }; + inputEl.click(); + }, []); + const showEditStatus = Boolean(globalState.editMemoId); + const editorConfig = _react_17_0_2_react.exports.useMemo(() => ({ + className: "memo-editor", + inputerType: "memo", + initialContent: getEditorContentCache(), + placeholder: t$1("What do you think now..."), + showConfirmBtn: true, + showCancelBtn: showEditStatus, + showTools: true, + onConfirmBtnClick: handleSaveBtnClick, + onCancelBtnClick: handleCancelBtnClick, + onContentChange: handleContentChange + }), [showEditStatus]); return /* @__PURE__ */ jsxs("div", { - className: `selector-wrapper ${className != null ? className : ""}`, - ref: seletorElRef, - children: [/* @__PURE__ */ jsxs("div", { - className: `current-value-container ${showSelector ? "active" : ""}`, - onClick: handleCurrentValueClick, - children: [/* @__PURE__ */ jsx("span", { - className: "value-text", - children: currentItem.text - }), /* @__PURE__ */ jsx("span", { - className: "arrow-text", - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: arrowRight - }) - })] - }), /* @__PURE__ */ jsx("div", { - className: `items-wrapper ${showSelector ? "" : "hidden"}`, - children: dataSource.map((d) => { - return /* @__PURE__ */ jsx("div", { - className: `item-container ${d.value === value ? "selected" : ""}`, - onClick: () => { - handleItemClick(d); - }, - children: d.text - }, d.value); + className: `memo-editor-wrapper ${showEditStatus ? "edit-ing" : ""} ${isEditorShown ? "hidden" : ""}`, + children: [/* @__PURE__ */ jsx("p", { + className: `tip-text ${showEditStatus ? "" : "hidden"}`, + children: "Modifying..." + }), /* @__PURE__ */ jsx(Editor, __spreadProps(__spreadValues({ + ref: editorRef + }, editorConfig), { + tools: /* @__PURE__ */ jsxs(Fragment, { + children: [/* @__PURE__ */ jsx(SvgTag, { + className: "action-btn add-tag", + onClick: handleTagTextBtnClick + }), /* @__PURE__ */ jsx(SvgImage, { + className: "action-btn file-upload", + onClick: handleUploadFileBtnClick + }), !isListShown ? /* @__PURE__ */ jsx(SvgJournal, { + className: "action-btn list-or-task", + onClick: handleChangeStatus + }) : /* @__PURE__ */ jsx(SvgCheckboxActive, { + className: "action-btn list-or-task", + onClick: handleChangeStatus + })] }) + })), /* @__PURE__ */ jsx("div", { + ref: popperRef, + className: "date-picker", + children: isDatePickerOpen && /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({ + tabIndex: -1, + style: popper2.styles.popper + }, popper2.attributes.popper), { + ref: setPopperElement, + role: "dialog", + children: /* @__PURE__ */ jsx(DatePicker, { + className: `editor-date-picker ${isDatePickerOpen ? "" : "hidden"}`, + datestamp: currentDateStamp, + handleDateStampChange: handleDateInsertTrigger + }) + })) })] }); }; -var Selector$1 = _react_17_0_2_react.exports.memo(Selector); -var createQueryDialog = ""; -const CreateQueryDialog = (props) => { +function getEditorContentCache() { + var _a; + return (_a = storage.get(["editorContentCache"]).editorContentCache) != null ? _a : ""; +} +function setEditorContentCache(content) { + storage.set({ + editorContentCache: content + }); +} +var searchBar = ""; +function SvgSearch(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + xmlns: "http://www.w3.org/2000/svg", + height: "24px", + viewBox: "0 0 24 24", + width: "24px", + fill: "#37352f" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M0 0h24v24H0V0z", + fill: "none" + }), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" + })); +} +const SearchBar = () => { const { - destroy, - queryId - } = props; - const [title, setTitle] = _react_17_0_2_react.exports.useState(""); - const [filters, setFilters] = _react_17_0_2_react.exports.useState([]); - const requestState = useLoading(false); - const shownMemoLength = memoService.getState().memos.filter((memo2) => { - return checkShouldShowMemoWithFilters(memo2, filters); - }).length; - _react_17_0_2_react.exports.useEffect(() => { - const queryTemp = queryService.getQueryById(queryId != null ? queryId : ""); - if (queryTemp) { - setTitle(queryTemp.title); - const temp = JSON.parse(queryTemp.querystring); - if (Array.isArray(temp)) { - setFilters(temp); + locationState: { + query: { + type: memoType } } - }, [queryId]); - const handleTitleInputChange = (e) => { - const text = e.target.value; - setTitle(text); + } = _react_17_0_2_react.exports.useContext(appContext); + const [isSearchBarShow, toggleSearchbar] = useToggle(false); + const handleMemoTypeItemClick = (type) => { + const { + type: prevType + } = locationService.getState().query; + if (type === prevType) { + type = ""; + } + locationService.setMemoTypeQuery(type); }; - const handleSaveBtnClick = async () => { - if (!title) { - new require$$0.Notice("TITLE CANNOT BE NULL\uFF01"); + const handleTextQueryInput = (event) => { + const text = event.currentTarget.value; + if (!text.contains(" -time: ")) { + locationService.setTextQuery(text); return; - } else if (filters.length === 0) { - new require$$0.Notice("FILTER CANNOT BE NULL\uFF01"); + } + const time = text.split(" -time: ")[1]; + const times = time.length > 10 ? time.match(/\d{4}-\d{2}-\d{2}/g) : null; + if (times === null || times === void 0) { + locationService.setTextQuery(text.split(" -time: ")[0]); return; } - try { - if (queryId) { - const editedQuery = await queryService.updateQuery(queryId, title, JSON.stringify(filters)); - queryService.editQuery(editedQuery); - queryService.getMyAllQueries(); - } else { - const query = await queryService.createQuery(title, JSON.stringify(filters)); - queryService.pushQuery(query); - queryService.getMyAllQueries(); - } - } catch (error) { - new require$$0.Notice(error.message); + if (times.length === 1) { + const startMoment = require$$0.moment(times[0]); + locationService.setTimeQuery({ + from: startMoment.startOf("day").valueOf(), + to: startMoment.endOf("day").valueOf() + }); + } else if (times.length === 2) { + const startMoment = require$$0.moment(times[0]); + const endMoment = require$$0.moment(times[1]); + locationService.setTimeQuery({ + from: startMoment.startOf("day").valueOf(), + to: endMoment.endOf("day").valueOf() + }); } - destroy(); + locationService.setTextQuery(text.split(" -time: ")[0]); + return; }; - const handleAddFilterBenClick = () => { - if (filters.length > 0) { - const lastFilter = filters[filters.length - 1]; - if (lastFilter.value.value === "") { - new require$$0.Notice("\u5148\u5B8C\u5584\u4E0A\u4E00\u4E2A\u8FC7\u6EE4\u5668\u5427"); - return; - } - } - setFilters([...filters, getDefaultFilter()]); + const mouseIn = () => { + toggleSearchbar(true); }; - const handleFilterChange = _react_17_0_2_react.exports.useCallback((index, filter) => { - setFilters((filters2) => { - const temp = [...filters2]; - temp[index] = filter; - return temp; - }); - }, []); - const handleFilterRemove = _react_17_0_2_react.exports.useCallback((index) => { - setFilters((filters2) => { - const temp = filters2.filter((_, i) => i !== index); - return temp; - }); - }, []); - return /* @__PURE__ */ jsxs(Fragment, { + const mouseOut = () => { + toggleSearchbar(false); + }; + return /* @__PURE__ */ jsxs("div", { + className: "search-bar-container", children: [/* @__PURE__ */ jsxs("div", { - className: "dialog-header-container", - children: [/* @__PURE__ */ jsxs("p", { - className: "title-text", - children: [/* @__PURE__ */ jsx("span", { - className: "icon-text", - children: "\u{1F516}" - }), queryId ? t("EDIT QUERY") : t("CREATE QUERY")] - }), /* @__PURE__ */ jsx("button", { - className: "btn close-btn", - onClick: destroy, - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: close - }) + className: "search-bar-inputer", + children: [/* @__PURE__ */ jsx(SvgSearch, { + className: "icon-img" + }), /* @__PURE__ */ jsx("input", { + className: "text-input", + type: "text", + onMouseOver: mouseIn, + onMouseOut: mouseOut, + placeholder: isSearchBarShow ? "Type Here" : "", + onChange: handleTextQueryInput })] - }), /* @__PURE__ */ jsxs("div", { - className: "dialog-content-container", - children: [/* @__PURE__ */ jsxs("div", { - className: "form-item-container input-form-container", - children: [/* @__PURE__ */ jsx("span", { - className: "normal-text", - children: t("TITLE") - }), /* @__PURE__ */ jsx("input", { - className: "title-input", - type: "text", - value: title, - onChange: handleTitleInputChange - })] - }), /* @__PURE__ */ jsxs("div", { - className: "form-item-container filter-form-container", - children: [/* @__PURE__ */ jsx("span", { - className: "normal-text", - children: t("FILTER") + }), /* @__PURE__ */ jsx("div", { + className: "quickly-action-wrapper", + children: /* @__PURE__ */ jsxs("div", { + className: "quickly-action-container", + children: [/* @__PURE__ */ jsx("p", { + className: "title-text", + children: t$1("Quick filter") }), /* @__PURE__ */ jsxs("div", { - className: "filters-wrapper", - children: [filters.map((f2, index) => { - return /* @__PURE__ */ jsx(MemoFilterInputer, { - index, - filter: f2, - handleFilterChange, - handleFilterRemove - }, index); + className: "section-container types-container", + children: [/* @__PURE__ */ jsxs("span", { + className: "section-text", + children: [t$1("TYPE"), ":"] }), /* @__PURE__ */ jsx("div", { - className: "create-filter-btn", - onClick: handleAddFilterBenClick, - children: t("ADD FILTER TERMS") - })] - })] - })] - }), /* @__PURE__ */ jsxs("div", { - className: "dialog-footer-container", - children: [/* @__PURE__ */ jsx("div", {}), /* @__PURE__ */ jsxs("div", { - className: "btns-container", - children: [/* @__PURE__ */ jsxs("span", { - className: `tip-text ${filters.length === 0 && "hidden"}`, - children: [t("MATCH"), " Memo ", /* @__PURE__ */ jsx("strong", { - children: shownMemoLength - }), " ", t("TIMES")] - }), /* @__PURE__ */ jsx("button", { - className: `btn save-btn ${requestState.isLoading ? "requesting" : ""}`, - onClick: handleSaveBtnClick, - children: "SAVE" - })] - })] - })] - }); -}; -const FilterInputer = (props) => { - const { - index, - filter, - handleFilterChange, - handleFilterRemove - } = props; - const { - type - } = filter; - const [inputElements, setInputElements] = _react_17_0_2_react.exports.useState(/* @__PURE__ */ jsx(Fragment, {})); - _react_17_0_2_react.exports.useEffect(() => { - let operatorElement = /* @__PURE__ */ jsx(Fragment, {}); - if (Object.keys(filterConsts).includes(type)) { - operatorElement = /* @__PURE__ */ jsx(Selector$1, { - className: "operator-selector", - dataSource: Object.values(filterConsts[type].operators), - value: filter.value.operator, - handleValueChanged: handleOperatorChange - }); - } - let valueElement = /* @__PURE__ */ jsx(Fragment, {}); - switch (type) { - case "TYPE": { - valueElement = /* @__PURE__ */ jsx(Selector$1, { - className: "value-selector", - dataSource: filterConsts["TYPE"].values, - value: filter.value.value, - handleValueChanged: handleValueChange - }); - break; - } - case "TAG": { - valueElement = /* @__PURE__ */ jsx(Selector$1, { - className: "value-selector", - dataSource: memoService.getState().tags.sort().map((t2) => { - return { - text: t2, - value: t2 - }; - }), - value: filter.value.value, - handleValueChanged: handleValueChange - }); - break; - } - case "TEXT": { - valueElement = /* @__PURE__ */ jsx("input", { - type: "text", - className: "value-inputer", - value: filter.value.value, - onChange: (event) => { - handleValueChange(event.target.value); - event.target.focus(); - } - }); - break; - } - } - setInputElements(/* @__PURE__ */ jsxs(Fragment, { - children: [operatorElement, valueElement] - })); - }, [type, filter]); - const handleRelationChange = _react_17_0_2_react.exports.useCallback((value) => { - if (["AND", "OR"].includes(value)) { - handleFilterChange(index, __spreadProps(__spreadValues({}, filter), { - relation: value - })); - } - }, [filter]); - const handleTypeChange = _react_17_0_2_react.exports.useCallback((value) => { - if (filter.type !== value) { - const ops = Object.values(filterConsts[value].operators); - handleFilterChange(index, __spreadProps(__spreadValues({}, filter), { - type: value, - value: { - operator: ops[0].value, - value: "" - } - })); - } - }, [filter]); - const handleOperatorChange = _react_17_0_2_react.exports.useCallback((value) => { - handleFilterChange(index, __spreadProps(__spreadValues({}, filter), { - value: __spreadProps(__spreadValues({}, filter.value), { - operator: value - }) - })); - }, [filter]); - const handleValueChange = _react_17_0_2_react.exports.useCallback((value) => { - handleFilterChange(index, __spreadProps(__spreadValues({}, filter), { - value: __spreadProps(__spreadValues({}, filter.value), { - value - }) - })); - }, [filter]); - const handleRemoveBtnClick = () => { - handleFilterRemove(index); - }; - return /* @__PURE__ */ jsxs("div", { - className: "memo-filter-input-wrapper", - children: [index > 0 ? /* @__PURE__ */ jsx(Selector$1, { - className: "relation-selector", - dataSource: relationConsts, - value: filter.relation, - handleValueChanged: handleRelationChange - }) : null, /* @__PURE__ */ jsx(Selector$1, { - className: "type-selector", - dataSource: Object.values(filterConsts), - value: filter.type, - handleValueChanged: handleTypeChange - }), inputElements, /* @__PURE__ */ jsx("img", { - className: "remove-btn", - src: close, - onClick: handleRemoveBtnClick + className: "values-container", + children: memoSpecialTypes.map((t2, idx) => { + return /* @__PURE__ */ jsxs("div", { + children: [/* @__PURE__ */ jsx("span", { + className: `type-item ${memoType === t2.value ? "selected" : ""}`, + onClick: () => { + handleMemoTypeItemClick(t2.value); + }, + children: t2.text + }), idx + 1 < memoSpecialTypes.length ? /* @__PURE__ */ jsx("span", { + className: "split-text", + children: "/" + }) : null] + }, t2.value); + }) + })] + })] + }) })] }); }; -const MemoFilterInputer = _react_17_0_2_react.exports.memo(FilterInputer); -function showCreateQueryDialog(queryId) { - showDialog({ - className: "create-query-dialog" - }, CreateQueryDialog, { - queryId - }); +var memosHeader = ""; +function SvgMenu(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + xmlns: "http://www.w3.org/2000/svg", + height: "24px", + viewBox: "0 0 24 24", + width: "24px", + fill: "#37352f" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M0 0h24v24H0V0z", + fill: "none" + }), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z" + })); } -var queryList = ""; -var moreWhite = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iI0ZGRkZGRiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTYgMTBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0xMiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptLTYgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6Ii8+PC9zdmc+"; -const QueryList = () => { +const MemosHeader = () => { const { - queryState: { - queries - }, locationState: { query: { filter } + }, + globalState: { + isMobileView + }, + queryState: { + queries } } = _react_17_0_2_react.exports.useContext(appContext); - const loadingState = useLoading(); - const sortedQueries = queries.sort((a, b) => utils$1.getTimeStampByDate(b.createdAt) - utils$1.getTimeStampByDate(a.createdAt)).sort((a, b) => { - var _a, _b; - return utils$1.getTimeStampByDate((_a = b.pinnedAt) != null ? _a : 0) - utils$1.getTimeStampByDate((_b = a.pinnedAt) != null ? _b : 0); - }); + const [titleText, setTitleText] = _react_17_0_2_react.exports.useState("MEMOS"); _react_17_0_2_react.exports.useEffect(() => { - queryService.getMyAllQueries().catch(() => { - }).finally(() => { - loadingState.setFinish(); + const query = queryService.getQueryById(filter); + if (query) { + setTitleText(query.title); + } else { + setTitleText("MEMOS"); + } + }, [filter, queries]); + const handleMemoTextClick = _react_17_0_2_react.exports.useCallback(() => { + memoService.fetchAllMemos().catch(() => { }); }, []); + const handleShowSidebarBtnClick = _react_17_0_2_react.exports.useCallback(() => { + globalStateService.setShowSiderbarInMobileView(true); + }, []); return /* @__PURE__ */ jsxs("div", { - className: "queries-wrapper", - children: [/* @__PURE__ */ jsxs("p", { + className: "section-header-container memos-header-container", + children: [/* @__PURE__ */ jsxs("div", { className: "title-text", - children: [/* @__PURE__ */ jsx("span", { - className: "normal-text", - children: t("QUERY") + onClick: handleMemoTextClick, + children: [/* @__PURE__ */ jsx(Only, { + when: isMobileView, + children: /* @__PURE__ */ jsx("button", { + className: "action-btn", + onClick: handleShowSidebarBtnClick, + children: /* @__PURE__ */ jsx(SvgMenu, { + className: "icon-img" + }) + }) }), /* @__PURE__ */ jsx("span", { - className: "btn", - onClick: () => showCreateQueryDialog(), - children: "+" + className: "normal-text", + children: titleText })] - }), /* @__PURE__ */ jsx(Only, { - when: loadingState.isSucceed && sortedQueries.length === 0, - children: /* @__PURE__ */ jsx("div", { - className: "create-query-btn-container", - children: /* @__PURE__ */ jsx("span", { - className: "btn", - onClick: () => showCreateQueryDialog(), - children: t("CREATE FILTER") - }) - }) - }), /* @__PURE__ */ jsx("div", { - className: "queries-container", - children: sortedQueries.map((q2) => { - return /* @__PURE__ */ jsx(QueryItemContainer, { - query: q2, - isActive: q2.id === filter - }, q2.id); - }) - })] + }), /* @__PURE__ */ jsx(SearchBar, {})] }); }; -const QueryItemContainer = (props) => { +var memoFilter = ""; +function SvgCopy(props) { + return /* @__PURE__ */ _react_17_0_2_react.exports.createElement("svg", __spreadValues({ + width: 24, + height: 24, + viewBox: "0 0 48 48", + fill: "none", + xmlns: "http://www.w3.org/2000/svg" + }, props), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M13 12.4316V7.8125C13 6.2592 14.2592 5 15.8125 5H40.1875C41.7408 5 43 6.2592 43 7.8125V32.1875C43 33.7408 41.7408 35 40.1875 35H35.5163", + stroke: "#333", + strokeWidth: 3, + strokeLinecap: "round", + strokeLinejoin: "round" + }), /* @__PURE__ */ _react_17_0_2_react.exports.createElement("path", { + d: "M32.1875 13H7.8125C6.2592 13 5 14.2592 5 15.8125V40.1875C5 41.7408 6.2592 43 7.8125 43H32.1875C33.7408 43 35 41.7408 35 40.1875V15.8125C35 14.2592 33.7408 13 32.1875 13Z", + fill: "none", + stroke: "#333", + strokeWidth: 3, + strokeLinejoin: "round" + })); +} +var memolist = ""; +let copyShownMemos; +const MemoList = () => { const { - query, - isActive - } = props; - const [showActionBtns, toggleShowActionBtns] = useToggle(false); - const [showConfirmDeleteBtn, toggleConfirmDeleteBtn] = useToggle(false); - const handleQueryClick = () => { - if (isActive) { - locationService.setMemoFilter(""); - } else { - locationService.setMemoFilter(query.id); + locationState: { + query + }, + memoState: { + memos } - }; - const handleShowActionBtnClick = (event) => { - event.stopPropagation(); - toggleShowActionBtns(); - }; - const handleActionBtnContainerMouseLeave = () => { - toggleShowActionBtns(false); - }; - const handleDeleteMemoClick = async (event) => { - event.stopPropagation(); - if (showConfirmDeleteBtn) { - try { - await queryService.deleteQuery(query.id); - } catch (error) { - new require$$0.Notice(error.message); + } = _react_17_0_2_react.exports.useContext(appContext); + const [isFetching, setFetchStatus] = _react_17_0_2_react.exports.useState(true); + const wrapperElement = _react_17_0_2_react.exports.useRef(null); + const { + tag: tagQuery, + duration, + type: memoContentType, + text: textQuery, + filter: queryId + } = query; + const queryFilter = queryService.getQueryById(queryId); + const showMemoFilter = Boolean(tagQuery || duration && duration.from < duration.to || memoContentType || textQuery || queryFilter); + const shownMemos = showMemoFilter || queryFilter || HideDoneTasks ? memos.filter((memo2) => { + var _a, _b, _c; + let shouldShow = true; + if (memo2.memoType !== void 0) { + if (HideDoneTasks && memo2.memoType === "TASK-DONE") { + shouldShow = false; } - } else { - toggleConfirmDeleteBtn(); } - }; - const handleEditQueryBtnClick = (event) => { - event.stopPropagation(); - showCreateQueryDialog(query.id); - }; - const handlePinQueryBtnClick = async (event) => { - event.stopPropagation(); - try { - if (query.pinnedAt) { - await queryService.unpinQuery(query.id); - queryService.editQuery(__spreadProps(__spreadValues({}, query), { - pinnedAt: "" - })); + if (memo2.content.contains("comment:")) { + shouldShow = false; + } + if (queryFilter) { + const filters = JSON.parse(queryFilter.querystring); + if (Array.isArray(filters)) { + shouldShow = checkShouldShowMemoWithFilters(memo2, filters); + } + } + if (tagQuery) { + const tagsSet = /* @__PURE__ */ new Set(); + for (const t2 of Array.from((_a = memo2.content.match(TAG_REG)) != null ? _a : [])) { + const tag = t2.replace(TAG_REG, "$1").trim(); + const items = tag.split("/"); + let temp = ""; + for (const i of items) { + temp += i; + tagsSet.add(temp); + temp += "/"; + } + } + for (const t2 of Array.from((_b = memo2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) { + const tag = t2.replace(NOP_FIRST_TAG_REG, "$1").trim(); + const items = tag.split("/"); + let temp = ""; + for (const i of items) { + temp += i; + tagsSet.add(temp); + temp += "/"; + } + } + for (const t2 of Array.from((_c = memo2.content.match(FIRST_TAG_REG)) != null ? _c : [])) { + const tag = t2.replace(FIRST_TAG_REG, "$2").trim(); + const items = tag.split("/"); + let temp = ""; + for (const i of items) { + temp += i; + tagsSet.add(temp); + temp += "/"; + } + } + if (!tagsSet.has(tagQuery)) { + shouldShow = false; + } + } + if (duration && duration.from < duration.to && (utils$1.getTimeStampByDate(memo2.createdAt) < duration.from || utils$1.getTimeStampByDate(memo2.createdAt) > duration.to)) { + shouldShow = false; + } + if (memoContentType) { + if (memoContentType === "NOT_TAGGED" && (memo2.content.match(TAG_REG) !== null || memo2.content.match(NOP_FIRST_TAG_REG) !== null)) { + shouldShow = false; + } else if (memoContentType === "LINKED" && memo2.content.match(LINK_REG) === null) { + shouldShow = false; + } else if (memoContentType === "IMAGED" && memo2.content.match(IMAGE_URL_REG) === null) { + shouldShow = false; + } else if (memoContentType === "CONNECTED" && memo2.content.match(MEMO_LINK_REG) === null) { + shouldShow = false; + } + } + if (textQuery && !memo2.content.includes(textQuery)) { + shouldShow = false; + } + return shouldShow; + }) : memos.filter((memo2) => { + return !memo2.content.contains("comment:"); + }); + copyShownMemos = shownMemos; + _react_17_0_2_react.exports.useEffect(() => { + setTimeout(() => { + memoService.fetchAllMemos().then(() => { + setFetchStatus(false); + }).catch(() => { + new require$$0.Notice(t$1("Fetch Error")); + }); + }, 400); + dailyNotesService.getMyAllDailyNotes().then(() => { + setFetchStatus(false); + }).catch(() => { + new require$$0.Notice("\u{1F62D} Fetch DailyNotes Error"); + }); + dailyNotesService.getState(); + memoService.getState(); + }, []); + _react_17_0_2_react.exports.useEffect(() => { + var _a; + (_a = wrapperElement.current) == null ? void 0 : _a.scrollTo({ + top: 0 + }); + }, [query]); + const handleMemoListClick = _react_17_0_2_react.exports.useCallback((event) => { + const { + workspace + } = appStore.getState().dailyNotesState.app; + const targetEl = event.target; + if (targetEl.tagName === "SPAN" && targetEl.className === "tag-span") { + const tagName = targetEl.innerText.slice(1); + const currTagQuery = locationService.getState().query.tag; + if (currTagQuery === tagName) { + locationService.setTagQuery(""); } else { - await queryService.pinQuery(query.id); - queryService.editQuery(__spreadProps(__spreadValues({}, query), { - pinnedAt: utils$1.getDateTimeString(Date.now()) - })); + locationService.setTagQuery(tagName); + } + } else if (targetEl.tagName === "A" && targetEl.className === "internal-link") { + const sourcePath = targetEl.getAttribute("data-filepath"); + if (require$$0.Platform.isMobile) { + workspace.openLinkText(sourcePath, sourcePath, false); + } else { + workspace.openLinkText(sourcePath, sourcePath, true); + } + } + }, []); + return /* @__PURE__ */ jsxs("div", { + className: `memolist-wrapper ${isFetching ? "" : "completed"}`, + onClick: handleMemoListClick, + ref: wrapperElement, + children: [shownMemos.map((memo2) => /* @__PURE__ */ jsx(Memo$1, { + memo: memo2 + }, `${memo2.id}-${memo2.updatedAt}`)), /* @__PURE__ */ jsx("div", { + className: "status-text-container", + children: /* @__PURE__ */ jsx("p", { + className: "status-text", + children: isFetching ? t$1("Fetching data...") : shownMemos.length === 0 ? t$1("Noooop!") : showMemoFilter ? "" : t$1("All Data is Loaded \u{1F389}") + }) + })] + }); +}; +const getMemosByDate = (memos) => { + const dataArr = []; + memos.map((mapItem) => { + if (dataArr.length == 0) { + dataArr.push({ date: require$$0.moment(mapItem.createdAt, "YYYY/MM/DD HH:mm:ss").format("YYYY-MM-DD"), have: [mapItem] }); + } else { + const res = dataArr.some((item) => { + if (item.date == require$$0.moment(mapItem.createdAt, "YYYY/MM/DD HH:mm:ss").format("YYYY-MM-DD")) { + item.have.push(mapItem); + return true; + } + }); + if (!res) { + dataArr.push({ date: require$$0.moment(mapItem.createdAt, "YYYY/MM/DD HH:mm:ss").format("YYYY-MM-DD"), have: [mapItem] }); } - } catch (error) { } - }; - const handleDeleteBtnMouseLeave = () => { - toggleConfirmDeleteBtn(false); - }; - return /* @__PURE__ */ jsx(Fragment, { - children: /* @__PURE__ */ jsxs("div", { - className: `query-item-container ${isActive ? "active" : ""}`, - onClick: handleQueryClick, - children: [/* @__PURE__ */ jsxs("div", { - className: "query-text-container", - children: [/* @__PURE__ */ jsx("span", { - className: "icon-text", - children: "#" - }), /* @__PURE__ */ jsx("span", { - className: "query-text", - children: query.title - })] - }), /* @__PURE__ */ jsxs("div", { - className: "btns-container", - children: [/* @__PURE__ */ jsx("span", { - className: "action-btn toggle-btn", - onClick: handleShowActionBtnClick, - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: isActive ? moreWhite : more - }) - }), /* @__PURE__ */ jsx("div", { - className: `action-btns-wrapper ${showActionBtns ? "" : "hidden"}`, - onMouseLeave: handleActionBtnContainerMouseLeave, - children: /* @__PURE__ */ jsxs("div", { - className: "action-btns-container", - children: [/* @__PURE__ */ jsx("span", { - className: "btn", - onClick: handlePinQueryBtnClick, - children: query.pinnedAt ? t("UNPIN") : t("PIN") - }), /* @__PURE__ */ jsx("span", { - className: "btn", - onClick: handleEditQueryBtnClick, - children: t("EDIT") - }), /* @__PURE__ */ jsx("span", { - className: `btn delete-btn ${showConfirmDeleteBtn ? "final-confirm" : ""}`, - onClick: handleDeleteMemoClick, - onMouseLeave: handleDeleteBtnMouseLeave, - children: showConfirmDeleteBtn ? t("CONFIRM\uFF01") : t("DELETE") - })] - }) - })] - })] - }) }); + return dataArr; }; -var tagList = ""; -const TagList = () => { - const { - locationState: { - query: { - tag: tagQuery - } - }, - memoState: { - tags: tagsText, - memos +const getCommentMemos = (memos) => { + return memoService.getState().commentMemos.filter((m2) => m2.linkId === memos.hasId).sort((a, b) => utils$1.getTimeStampByDate(a.createdAt) - utils$1.getTimeStampByDate(b.createdAt)).map((m2) => __spreadProps(__spreadValues({}, m2), { + createdAtStr: utils$1.getDateTimeString(m2.createdAt), + dateStr: utils$1.getDateString(m2.createdAt) + })); +}; +const transferMemosIntoText = (memosArray) => { + let outputText = ""; + let dataArr = []; + let indent = ""; + const dailyNotesformat = getDailyNoteFormat(); + memosArray.map((mapItem) => { + dataArr = mapItem.have; + if (ShowDate) { + outputText = outputText + "- [[" + require$$0.moment(mapItem.date, "YYYY-MM-DD").format(dailyNotesformat) + "]]\n"; + indent = " "; } - } = _react_17_0_2_react.exports.useContext(appContext); - const [tags, setTags] = _react_17_0_2_react.exports.useState([]); - _react_17_0_2_react.exports.useEffect(() => { - memoService.updateTagsState(); - }, [memos]); - _react_17_0_2_react.exports.useEffect(() => { - const sortedTags = Array.from(tagsText).sort(); - const root = { - subTags: [] - }; - for (const tag2 of sortedTags) { - const subtags = tag2.split("/"); - let tempObj = root; - let tagText = ""; - for (let i = 0; i < subtags.length; i++) { - const key = subtags[i]; - if (i === 0) { - tagText += key; + if (ShowTime) { + for (let i = 0; i < dataArr.length; i++) { + const time = require$$0.moment(dataArr[i].createdAt, "YYYY/MM/DD HH:mm:ss").format("HH:mm"); + let formatContent; + if (DefaultMemoComposition != "" && /{TIME}/g.test(DefaultMemoComposition) && /{CONTENT}/g.test(DefaultMemoComposition)) { + formatContent = DefaultMemoComposition.replace(/{TIME}/g, time).replace(/{CONTENT}/g, dataArr[i].content); } else { - tagText += "/" + key; + formatContent = time + " " + dataArr[i].content; } - let obj = null; - for (const t2 of tempObj.subTags) { - if (t2.text === tagText) { - obj = t2; - break; + if (dataArr[i].memoType === "JOURNAL") { + outputText = outputText + indent + "- " + formatContent + "\n"; + } else { + if (dataArr[i].memoType === "TASK-TODO") { + outputText = outputText + indent + "- [ ] " + formatContent + "\n"; + } else if (dataArr[i].memoType === "TASK-DONE") { + outputText = outputText + indent + "- [x] " + formatContent + "\n"; + } else { + const taskMark = dataArr[i].memoType.match(/TASK-(.*)?/g)[1]; + outputText = outputText + indent + "- [" + taskMark + "] " + formatContent + "\n"; } } - if (!obj) { - obj = { - key, - text: tagText, - subTags: [] - }; - tempObj.subTags.push(obj); + outputText = outputText.replace(/ \^\S{6}/g, ""); + if (CommentOnMemos) { + if (dataArr[i].hasId !== void 0) { + const commentMemos = getCommentMemos(dataArr[i]); + if (commentMemos.length > 0) { + commentMemos.map((cm) => { + let memoType = "- "; + if (cm.memoType === "TASK-TODO") { + memoType = "- [ ] "; + } else if (cm.memoType === "TASK-DONE") { + memoType = "- [x] "; + } else if (cm.memoType.match(/TASK-(.*)?/g)) { + memoType = "- [" + cm.memoType.match(/TASK-(.*)?/g)[1] + "] "; + } + outputText = outputText + indent + (ShowDate ? " " + memoType + "[[" + require$$0.moment(cm.createdAt).format(dailyNotesformat) + "]] " : " " + memoType) + require$$0.moment(cm.createdAt).format("HH:mm") + " " + cm.content.replace(/comment:(.*)$/g, "").replace(/^\d{14}/g, "") + "\n"; + }); + } + } + } + } + } else { + for (let i = 0; i < dataArr.length; i++) { + if (dataArr[i].memoType === "JOURNAL") { + outputText = outputText + indent + "- " + dataArr[i].content + "\n"; + } else { + if (dataArr[i].memoType === "TASK-TODO") { + outputText = outputText + indent + "- [ ] " + dataArr[i].content + "\n"; + } else if (dataArr[i].memoType === "TASK-DONE") { + outputText = outputText + indent + "- [x] " + dataArr[i].content + "\n"; + } else { + const taskMark = dataArr[i].memoType.match(/TASK-(.*)?/g)[1]; + outputText = outputText + indent + "- [" + taskMark + "] " + dataArr[i].content + "\n"; + } + } + outputText = outputText.replace(/ \^\S{6}/g, ""); + if (CommentOnMemos) { + if (dataArr[i].hasId !== void 0) { + const commentMemos = getCommentMemos(dataArr[i]); + if (commentMemos.length > 0) { + commentMemos.map((cm) => { + let memoType = "- "; + if (cm.memoType === "TASK-TODO") { + memoType = "- [ ] "; + } else if (cm.memoType === "TASK-DONE") { + memoType = "- [x] "; + } else if (cm.memoType.match(/TASK-(.*)?/g)) { + memoType = "- [" + cm.memoType.match(/TASK-(.*)?/g)[1] + "] "; + } + outputText = outputText + indent + " " + memoType + cm.content.replace(/comment:(.*)$/g, "").replace(/^\d{14}/g, "") + "\n"; + }); + } + } } - tempObj = obj; } } - setTags(root.subTags); - }, [tagsText]); + if (ShowDate && AddBlankLineWhenDate && !CommentOnMemos) { + outputText = outputText + "\n"; + } + }); + return outputText.replace(/
/g, "\n "); +}; +const MemoFilter = () => { + const { + locationState: { + query + } + } = _react_17_0_2_react.exports.useContext(appContext); + const { + tag: tagQuery, + duration, + type: memoType, + text: textQuery, + filter + } = query; + const queryFilter = queryService.getQueryById(filter); + const showFilter = Boolean(tagQuery || duration && duration.from < duration.to || memoType || textQuery || queryFilter); + const handleCopyClick = async () => { + if (!(copyShownMemos.length > 0)) { + return; + } + const memosByDate = getMemosByDate(copyShownMemos); + const queryDailyMemos = transferMemosIntoText(memosByDate); + await utils$1.copyTextToClipboard(queryDailyMemos); + new require$$0.Notice(t$1("Copied to clipboard Successfully")); + }; return /* @__PURE__ */ jsxs("div", { - className: "tags-wrapper", - children: [/* @__PURE__ */ jsx("p", { - className: "title-text", - children: t("Frequently Used Tags") - }), /* @__PURE__ */ jsxs("div", { - className: "tags-container", - children: [tags.map((t2, idx) => /* @__PURE__ */ jsx(TagItemContainer, { - tag: t2, - tagQuery - }, t2.text + "-" + idx)), /* @__PURE__ */ jsx(Only, { - when: tags.length < 5 && memoService.initialized, - children: /* @__PURE__ */ jsxs("p", { - className: "tag-tip-container", - children: ["Input", /* @__PURE__ */ jsx("span", { - className: "code-text", - children: "#Tag " - }), "to create tag..."] - }) + className: `filter-query-container ${showFilter ? "" : "hidden"}`, + children: [/* @__PURE__ */ jsxs("div", { + className: "filter-query", + children: [/* @__PURE__ */ jsx("span", { + className: "tip-text", + children: "FILTER: " + }), /* @__PURE__ */ jsxs("div", { + className: "filter-item-container " + (queryFilter ? "" : "hidden"), + onClick: () => { + locationService.setMemoFilter(""); + }, + children: [/* @__PURE__ */ jsx("span", { + className: "icon-text", + children: "\u{1F516}" + }), " ", queryFilter == null ? void 0 : queryFilter.title] + }), /* @__PURE__ */ jsxs("div", { + className: "filter-item-container " + (tagQuery ? "" : "hidden"), + onClick: () => { + locationService.setTagQuery(""); + }, + children: [/* @__PURE__ */ jsx("span", { + className: "icon-text", + children: "\u{1F3F7}\uFE0F" + }), " ", tagQuery] + }), /* @__PURE__ */ jsxs("div", { + className: "filter-item-container " + (memoType ? "" : "hidden"), + onClick: () => { + locationService.setMemoTypeQuery(""); + }, + children: [/* @__PURE__ */ jsx("span", { + className: "icon-text", + children: "\u{1F4E6}" + }), " ", getTextWithMemoType(memoType)] + }), duration && duration.from < duration.to ? /* @__PURE__ */ jsxs("div", { + className: "filter-item-container", + onClick: () => { + locationService.setFromAndToQuery(0, 0); + }, + children: [/* @__PURE__ */ jsx("span", { + className: "icon-text", + children: "\u{1F5D3}\uFE0F" + }), " ", require$$0.moment(duration.from, "x").format("YYYY/MM/DD"), " ", t$1("to"), " ", require$$0.moment(duration.to, "x").add(1, "days").format("YYYY/MM/DD")] + }) : null, /* @__PURE__ */ jsxs("div", { + className: "filter-item-container " + (textQuery ? "" : "hidden"), + onClick: () => { + locationService.setTextQuery(""); + }, + children: [/* @__PURE__ */ jsx("span", { + className: "icon-text", + children: "\u{1F50D}" + }), " ", textQuery] })] + }), /* @__PURE__ */ jsx("div", { + className: "copy-memo", + onClick: handleCopyClick, + children: /* @__PURE__ */ jsx(SvgCopy, { + className: "icon-img" + }) })] }); }; -const TagItemContainer = (props) => { +function Memos$1() { + if (require$$0.Platform.isMobile && DefaultEditorLocation === "Bottom") { + return /* @__PURE__ */ jsxs(Fragment, { + children: [/* @__PURE__ */ jsx(MemosHeader, {}), /* @__PURE__ */ jsx(MemoFilter, {}), /* @__PURE__ */ jsx(MemoList, {}), /* @__PURE__ */ jsx(MemoEditor, {})] + }); + } else { + return /* @__PURE__ */ jsxs(Fragment, { + children: [/* @__PURE__ */ jsx(MemosHeader, {}), /* @__PURE__ */ jsx(MemoEditor, {}), /* @__PURE__ */ jsx(MemoFilter, {}), /* @__PURE__ */ jsx(MemoList, {})] + }); + } +} +const DeletedMemo = (props) => { + var _a; const { - tag: tag2, - tagQuery + memo: propsMemo, + handleDeletedMemoAction } = props; - const isActive = tagQuery === tag2.text; - const hasSubTags = tag2.subTags.length > 0; - const [showSubTags, toggleSubTags] = useToggle(false); - const handleTagClick = () => { - if (isActive) { - locationService.setTagQuery(""); - } else { - utils$1.copyTextToClipboard(`#${tag2.text} `); - if (!["/", "/recycle"].includes(locationService.getState().pathname)) { - locationService.setPathname("/"); + const memo2 = __spreadProps(__spreadValues({}, propsMemo), { + createdAtStr: utils$1.getDateTimeString(propsMemo.createdAt), + deletedAtStr: utils$1.getDateTimeString((_a = propsMemo.deletedAt) != null ? _a : Date.now()) + }); + const [showConfirmDeleteBtn, toggleConfirmDeleteBtn] = useToggle(false); + const handleDeleteMemoClick = async () => { + if (showConfirmDeleteBtn) { + try { + await memoService.deleteMemoById(memo2.id); + handleDeletedMemoAction(memo2.id); + } catch (error) { + new require$$0.Notice(error.message); } - locationService.setTagQuery(tag2.text); + } else { + toggleConfirmDeleteBtn(); } }; - const handleToggleBtnClick = (event) => { - event.stopPropagation(); - toggleSubTags(); + const handleRestoreMemoClick = async () => { + try { + await memoService.restoreMemoById(memo2.id); + handleDeletedMemoAction(memo2.id); + new require$$0.Notice(t$1("RESTORE SUCCEED")); + } catch (error) { + new require$$0.Notice(error.message); + } }; - return /* @__PURE__ */ jsxs(Fragment, { + const handleMouseLeaveMemoWrapper = () => { + if (showConfirmDeleteBtn) { + toggleConfirmDeleteBtn(false); + } + }; + return /* @__PURE__ */ jsxs("div", { + className: `memo-wrapper ${"memos-" + memo2.id}`, + onMouseLeave: handleMouseLeaveMemoWrapper, children: [/* @__PURE__ */ jsxs("div", { - className: `tag-item-container ${isActive ? "active" : ""}`, - onClick: handleTagClick, - children: [/* @__PURE__ */ jsxs("div", { - className: "tag-text-container", - children: [/* @__PURE__ */ jsx("span", { - className: "icon-text", - children: "#" - }), /* @__PURE__ */ jsx("span", { - className: "tag-text", - children: tag2.key - })] - }), /* @__PURE__ */ jsx("div", { + className: "memo-top-wrapper", + children: [/* @__PURE__ */ jsxs("span", { + className: "time-text", + children: [t$1("DELETE AT"), " ", memo2.deletedAtStr] + }), /* @__PURE__ */ jsxs("div", { className: "btns-container", - children: hasSubTags ? /* @__PURE__ */ jsx("span", { - className: `action-btn toggle-btn ${showSubTags ? "shown" : ""}`, - onClick: handleToggleBtnClick, - children: /* @__PURE__ */ jsx("img", { - className: "icon-img", - src: arrowRight + children: [/* @__PURE__ */ jsx("span", { + className: "btn more-action-btn", + children: /* @__PURE__ */ jsx(SvgMore, { + className: "icon-img" + }) + }), /* @__PURE__ */ jsx("div", { + className: "more-action-btns-wrapper", + children: /* @__PURE__ */ jsxs("div", { + className: "more-action-btns-container", + children: [/* @__PURE__ */ jsx("span", { + className: "btn restore-btn", + onClick: handleRestoreMemoClick, + children: t$1("RESTORE") + }), /* @__PURE__ */ jsx("span", { + className: `btn delete-btn ${showConfirmDeleteBtn ? "final-confirm" : ""}`, + onClick: handleDeleteMemoClick, + children: showConfirmDeleteBtn ? t$1("CONFIRM\uFF01") : t$1("DELETE") + })] }) - }) : null + })] })] - }), hasSubTags ? /* @__PURE__ */ jsx("div", { - className: `subtags-container ${showSubTags ? "" : "hidden"}`, - children: tag2.subTags.map((st, idx) => /* @__PURE__ */ jsx(TagItemContainer, { - tag: st, - tagQuery - }, st.text + "-" + idx)) - }) : null] + }), /* @__PURE__ */ jsx("div", { + className: "memo-content-text", + dangerouslySetInnerHTML: { + __html: formatMemoContent(memo2.content) + } + }), /* @__PURE__ */ jsx(MemoImage, { + memo: memo2.content + })] }); }; -var react_1 = _react_17_0_2_react.exports; -var isFunction = function(setStateAction) { - return typeof setStateAction === "function"; -}; -var useStateRef = function(initialState) { - var _a = react_1.useState(initialState), state = _a[0], setState = _a[1]; - var ref = react_1.useRef(state); - var dispatch = react_1.useCallback(function(setStateAction) { - ref.current = isFunction(setStateAction) ? setStateAction(ref.current) : setStateAction; - setState(ref.current); - }, []); - return [state, dispatch, ref]; -}; -var dist = useStateRef; -var usageHeatMap = ""; -const tableConfig = { - width: 12, - height: 7 -}; -const getInitialUsageStat = (usedDaysAmount, beginDayTimestamp) => { - const initialUsageStat = []; - for (let i = 0; i <= usedDaysAmount; i++) { - initialUsageStat.push({ - timestamp: parseInt(require$$0.moment(beginDayTimestamp).add(i, "days").format("x")), - count: 0 - }); - } - return initialUsageStat; -}; -const UsageHeatMap = () => { - const todayTimeStamp = parseInt(require$$0.moment().endOf("day").format("x")); - const todayDay = new Date(todayTimeStamp).getDay() || 7; - const nullCell = new Array(7 - todayDay).fill(0); - const usedDaysAmount = (tableConfig.width - 1) * tableConfig.height + todayDay; - const beginDayTimestamp = parseInt(require$$0.moment().startOf("day").subtract(usedDaysAmount, "days").format("x")); - const startDate = require$$0.moment().startOf("day").subtract(usedDaysAmount, "days"); +var memoTrash = ""; +const MemoTrash = () => { const { - memoState: { - memos + locationState: { + query + }, + globalState: { + isMobileView } } = _react_17_0_2_react.exports.useContext(appContext); - const [allStat, setAllStat] = dist(getInitialUsageStat(usedDaysAmount, beginDayTimestamp)); - const [popupStat, setPopupStat] = dist(null); - const [currentStat, setCurrentStat] = dist(null); - const [fromTo, setFromTo, fromToRef] = dist(""); - const containerElRef = _react_17_0_2_react.exports.useRef(null); - const popupRef = _react_17_0_2_react.exports.useRef(null); - _react_17_0_2_react.exports.useEffect(() => { - const newStat = getInitialUsageStat(usedDaysAmount, beginDayTimestamp); - for (const m2 of memos) { - const creationDate = require$$0.moment(m2.createdAt.replaceAll("/", "-")).startOf("day"); - const index = creationDate.diff(startDate, "days"); - if (index >= 0 && index < newStat.length) { - newStat[index].count += 1; - } - } - setAllStat([...newStat]); - }, [memos]); - const handleUsageStatItemMouseEnter = _react_17_0_2_react.exports.useCallback((event, item) => { + const loadingState = useLoading(); + const [deletedMemos, setDeletedMemos] = _react_17_0_2_react.exports.useState([]); + const { + tag: tagQuery, + duration, + type: memoType, + text: textQuery, + filter: queryId + } = query; + const queryFilter = queryService.getQueryById(queryId); + const showMemoFilter = Boolean(tagQuery || duration && duration.from < duration.to || memoType || textQuery || queryFilter); + const shownMemos = showMemoFilter || queryFilter ? deletedMemos.filter((memo2) => { var _a, _b; - setPopupStat(item); - if (!popupRef.current) { - return; - } - const { - isMobileView - } = globalStateService.getState(); - const targetEl = event.target; - const sidebarEl = document.querySelector(".memos-sidebar-wrapper"); - popupRef.current.style.left = targetEl.offsetLeft - ((_b = (_a = containerElRef.current) == null ? void 0 : _a.offsetLeft) != null ? _b : 0) + "px"; - let topValue = targetEl.offsetTop; - if (!isMobileView) { - topValue -= sidebarEl.scrollTop; - } - popupRef.current.style.top = topValue + "px"; - }, []); - const handleUsageStatItemMouseLeave = _react_17_0_2_react.exports.useCallback(() => { - setPopupStat(null); - }, []); - const handleUsageStatItemClick = _react_17_0_2_react.exports.useCallback((event, item) => { - var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r; - if (((_a = locationService.getState().query.duration) == null ? void 0 : _a.from) === item.timestamp && require$$0.moment((_b = locationService.getState().query.duration) == null ? void 0 : _b.from).diff((_c = locationService.getState().query.duration) == null ? void 0 : _c.to, "day") == 0) { - locationService.setFromAndToQuery(0, 0); - setCurrentStat(null); - setFromTo(null); - } else if (((_d = locationService.getState().query.duration) == null ? void 0 : _d.from) !== item.timestamp && ((_e = locationService.getState().query.duration) == null ? void 0 : _e.from) > 0 && event.shiftKey) { - const timeStampDays = require$$0.moment(item.timestamp).endOf("day").diff((_f = locationService.getState().query.duration) == null ? void 0 : _f.to, "day"); - if (timeStampDays > 0 && require$$0.moment((_g = locationService.getState().query.duration) == null ? void 0 : _g.from).diff((_h = locationService.getState().query.duration) == null ? void 0 : _h.to, "day") == 0) { - setFromTo("from"); - } else if (timeStampDays < 0 && require$$0.moment((_i = locationService.getState().query.duration) == null ? void 0 : _i.from).diff((_j = locationService.getState().query.duration) == null ? void 0 : _j.to, "day") == 0) { - setFromTo("to"); - } - if (require$$0.moment((_k = locationService.getState().query.duration) == null ? void 0 : _k.from).isBefore(item.timestamp)) { - if (fromToRef.current === "to") { - if (timeStampDays < 0) { - locationService.setFromAndToQuery(item.timestamp, (_l = locationService.getState().query.duration) == null ? void 0 : _l.to); - } else { - locationService.setFromAndToQuery(parseInt(require$$0.moment((_m = locationService.getState().query.duration) == null ? void 0 : _m.to).startOf("day").format("x")), parseInt(require$$0.moment(item.timestamp).endOf("day").format("x"))); - setFromTo("from"); - } - } else if (fromToRef.current === "from") { - if (timeStampDays < 0) { - locationService.setFromAndToQuery((_n = locationService.getState().query.duration) == null ? void 0 : _n.from, parseInt(require$$0.moment(item.timestamp).endOf("day").format("x"))); - } else { - locationService.setFromAndToQuery((_o = locationService.getState().query.duration) == null ? void 0 : _o.from, parseInt(require$$0.moment(item.timestamp).endOf("day").format("x"))); - } - } - } else { - if (fromToRef.current === "to") { - locationService.setFromAndToQuery(item.timestamp, (_p = locationService.getState().query.duration) == null ? void 0 : _p.to); - } else if (fromToRef.current === "from") { - locationService.setFromAndToQuery(item.timestamp, parseInt(require$$0.moment((_q = locationService.getState().query.duration) == null ? void 0 : _q.from).endOf("day").format("x"))); - setFromTo("to"); - } + let shouldShow = true; + if (queryFilter) { + const filters = JSON.parse(queryFilter.querystring); + if (Array.isArray(filters)) { + shouldShow = checkShouldShowMemoWithFilters(memo2, filters); } - } else if (((_r = locationService.getState().query.duration) == null ? void 0 : _r.from) === 0 && event.shiftKey) { - locationService.setFromAndToQuery(item.timestamp, parseInt(require$$0.moment().endOf("day").format("x"))); - } else if (item.count > 0 && (event.ctrlKey || event.metaKey)) { - const { - app: app2, - dailyNotes - } = dailyNotesService.getState(); - const file = getDailyNote_1(require$$0.moment(item.timestamp), dailyNotes); - if (!require$$0.Platform.isMobile) { - const leaf = app2.workspace.splitActiveLeaf(); - leaf.openFile(file); - } else { - let leaf = app2.workspace.activeLeaf; - if (leaf === null) { - leaf = app2.workspace.getLeaf(true); + } + if (tagQuery) { + const tagsSet = /* @__PURE__ */ new Set(); + for (const t2 of Array.from((_a = memo2.content.match(TAG_REG)) != null ? _a : [])) { + const tag = t2.replace(TAG_REG, "$1").trim(); + const items = tag.split("/"); + let temp = ""; + for (const i of items) { + temp += i; + tagsSet.add(temp); + temp += "/"; } - leaf.openFile(file); } - } else if (item.count > 0 && !event.shiftKey && !event.ctrlKey && !event.metaKey) { - if (!["/", "/recycle"].includes(locationService.getState().pathname)) { - locationService.setPathname("/"); + for (const t2 of Array.from((_b = memo2.content.match(NOP_FIRST_TAG_REG)) != null ? _b : [])) { + const tag = t2.replace(NOP_FIRST_TAG_REG, "$1").trim(); + const items = tag.split("/"); + let temp = ""; + for (const i of items) { + temp += i; + tagsSet.add(temp); + temp += "/"; + } } - locationService.setFromAndToQuery(item.timestamp, utils$1.getTimeStampByDate(require$$0.moment(item.timestamp + DAILY_TIMESTAMP).subtract(1, "days").endOf("day").format("YYYY-MM-DD HH:mm:ss"))); - setCurrentStat(item); + if (!tagsSet.has(tagQuery)) { + shouldShow = false; + } + } + if (duration && duration.from < duration.to && (utils$1.getTimeStampByDate(memo2.createdAt) < duration.from || utils$1.getTimeStampByDate(memo2.createdAt) > duration.to)) { + shouldShow = false; + } + if (memoType) { + if (memoType === "NOT_TAGGED" && memo2.content.match(TAG_REG) !== null) { + shouldShow = false; + } else if (memoType === "LINKED" && memo2.content.match(LINK_REG) === null) { + shouldShow = false; + } else if (memoType === "IMAGED" && memo2.content.match(IMAGE_URL_REG) === null) { + shouldShow = false; + } else if (memoType === "CONNECTED" && memo2.content.match(MEMO_LINK_REG) === null) { + shouldShow = false; + } + } + if (textQuery && !memo2.content.includes(textQuery)) { + shouldShow = false; } + return shouldShow; + }) : deletedMemos; + _react_17_0_2_react.exports.useEffect(() => { + memoService.fetchAllMemos(); + memoService.fetchDeletedMemos().then((result) => { + if (result.length !== 0) { + setDeletedMemos(result); + } + }).catch((error) => { + new require$$0.Notice(t$1("Failed to fetch deleted memos: ") + error); + }).finally(() => { + loadingState.setFinish(); + }); + locationService.clearQuery(); + }, []); + const handleDeletedMemoAction = _react_17_0_2_react.exports.useCallback((memoId) => { + setDeletedMemos((deletedMemos2) => deletedMemos2.filter((memo2) => memo2.id !== memoId)); + }, []); + const handleShowSidebarBtnClick = _react_17_0_2_react.exports.useCallback(() => { + globalStateService.setShowSiderbarInMobileView(true); }, []); return /* @__PURE__ */ jsxs("div", { - className: "usage-heat-map-wrapper", - ref: containerElRef, - children: [/* @__PURE__ */ jsxs("div", { - className: "day-tip-text-container", - children: [/* @__PURE__ */ jsx("span", { - className: "tip-text", - children: t("weekDaysShort")[0] - }), /* @__PURE__ */ jsx("span", { - className: "tip-text" - }), /* @__PURE__ */ jsx("span", { - className: "tip-text", - children: t("weekDaysShort")[2] - }), /* @__PURE__ */ jsx("span", { - className: "tip-text" - }), /* @__PURE__ */ jsx("span", { + className: "memo-trash-wrapper", + children: [/* @__PURE__ */ jsx("div", { + className: "section-header-container", + children: /* @__PURE__ */ jsxs("div", { + className: "title-text", + children: [/* @__PURE__ */ jsx(Only, { + when: isMobileView, + children: /* @__PURE__ */ jsx("button", { + className: "action-btn", + onClick: handleShowSidebarBtnClick, + children: /* @__PURE__ */ jsx(SvgMenu, { + className: "icon-img" + }) + }) + }), /* @__PURE__ */ jsx("span", { + className: "normal-text", + children: t$1("Recycle bin") + })] + }) + }), /* @__PURE__ */ jsx(MemoFilter, {}), loadingState.isLoading ? /* @__PURE__ */ jsx("div", { + className: "tip-text-container", + children: /* @__PURE__ */ jsx("p", { className: "tip-text", - children: t("weekDaysShort")[4] - }), /* @__PURE__ */ jsx("span", { - className: "tip-text" - }), /* @__PURE__ */ jsx("span", { + children: t$1("Fetching data...") + }) + }) : deletedMemos.length === 0 ? /* @__PURE__ */ jsx("div", { + className: "tip-text-container", + children: /* @__PURE__ */ jsx("p", { className: "tip-text", - children: t("weekDaysShort")[6] - })] - }), /* @__PURE__ */ jsxs("div", { - ref: popupRef, - className: "usage-detail-container pop-up " + (popupStat ? "" : "hidden"), - children: [popupStat == null ? void 0 : popupStat.count, " memos on", " ", /* @__PURE__ */ jsx("span", { - className: "date-text", - children: new Date(popupStat == null ? void 0 : popupStat.timestamp).toDateString() - })] - }), /* @__PURE__ */ jsxs("div", { - className: "usage-heat-map", - children: [allStat.map((v2, i) => { - const count = v2.count; - const colorLevel = count <= 0 ? "" : count <= 1 ? "stat-day-L1-bg" : count <= 2 ? "stat-day-L2-bg" : count <= 4 ? "stat-day-L3-bg" : "stat-day-L4-bg"; - return /* @__PURE__ */ jsx("span", { - className: `stat-container ${colorLevel} ${currentStat === v2 ? "current" : ""} ${todayTimeStamp === v2.timestamp ? "today" : ""}`, - onMouseEnter: (e) => handleUsageStatItemMouseEnter(e, v2), - onMouseLeave: handleUsageStatItemMouseLeave, - onClick: (e) => handleUsageStatItemClick(e, v2) - }, i); - }), nullCell.map((v2, i) => /* @__PURE__ */ jsx("span", { - className: "stat-container null" - }, i))] + children: t$1("Here is No Zettels.") + }) + }) : /* @__PURE__ */ jsx("div", { + className: "deleted-memos-container", + children: shownMemos.map((memo2) => /* @__PURE__ */ jsx(DeletedMemo, { + memo: memo2, + handleDeletedMemoAction + }, `${memo2.id}-${memo2.updatedAt}`)) })] }); }; -var siderbar = ""; -const Sidebar = () => { +var preferencesSection = ""; +var checkboxActive = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWNWgxNHYxNHpNMTcuOTkgOWwtMS40MS0xLjQyLTYuNTkgNi41OS0yLjU4LTIuNTctMS40MiAxLjQxIDQgMy45OXoiLz48L3N2Zz4NCg=="; +var checkbox = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzM3MzUyZiI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6Ii8+PC9zdmc+"; +const PreferencesSection = () => { const { - locationState, - globalState: { - isMobileView, - showSiderbarInMobileView - } + globalState } = _react_17_0_2_react.exports.useContext(appContext); - const wrapperElRef = _react_17_0_2_react.exports.useRef(null); - const handleClickOutsideOfWrapper = _react_17_0_2_react.exports.useMemo(() => { - return (event) => { - var _a, _b, _c; - const siderbarShown = globalStateService.getState().showSiderbarInMobileView; - if (!siderbarShown) { - window.removeEventListener("click", handleClickOutsideOfWrapper, { - capture: true - }); - return; - } - if (!((_a = wrapperElRef.current) == null ? void 0 : _a.contains(event.target))) { - if ((_c = (_b = wrapperElRef.current) == null ? void 0 : _b.parentNode) == null ? void 0 : _c.contains(event.target)) { - if (siderbarShown) { - event.stopPropagation(); - } - globalStateService.setShowSiderbarInMobileView(false); - window.removeEventListener("click", handleClickOutsideOfWrapper, { - capture: true - }); + const { + useTinyUndoHistoryCache, + shouldHideImageUrl, + shouldSplitMemoWord, + shouldUseMarkdownParser + } = globalState; + const demoMemoContent = "\u{1F44B} \u4F60\u597D\u5440\uFF5E\u6B22\u8FCE\u4F7F\u7528memos!\n* \u2728 **\u5F00\u6E90\u9879\u76EE**\uFF1B\n* \u{1F60B} \u7CBE\u7F8E\u4E14\u7EC6\u8282\u7684\u89C6\u89C9\u6837\u5F0F\uFF1B\n* \u{1F4D1} \u4F53\u9A8C\u4F18\u826F\u7684\u4EA4\u4E92\u903B\u8F91\uFF1B"; + const handleOpenTinyUndoChanged = () => { + globalStateService.setAppSetting({ + useTinyUndoHistoryCache: !useTinyUndoHistoryCache + }); + }; + const handleSplitWordsValueChanged = () => { + globalStateService.setAppSetting({ + shouldSplitMemoWord: !shouldSplitMemoWord + }); + }; + const handleHideImageUrlValueChanged = () => { + globalStateService.setAppSetting({ + shouldHideImageUrl: !shouldHideImageUrl + }); + }; + const handleUseMarkdownParserChanged = () => { + globalStateService.setAppSetting({ + shouldUseMarkdownParser: !shouldUseMarkdownParser + }); + }; + const handleExportBtnClick = async () => { + const formatedMemos = memoService.getState().memos.map((m2) => { + return __spreadValues({}, m2); + }); + const jsonStr = JSON.stringify(formatedMemos); + const element = document.createElement("a"); + element.setAttribute("href", "data:text/plain;charset=utf-8," + encodeURIComponent(jsonStr)); + element.setAttribute("download", "data.json"); + element.style.display = "none"; + document.body.appendChild(element); + element.click(); + document.body.removeChild(element); + }; + return /* @__PURE__ */ jsxs(Fragment, { + children: [/* @__PURE__ */ jsxs("div", { + className: "section-container preferences-section-container", + children: [/* @__PURE__ */ jsx("p", { + className: "title-text", + children: "Memo \u663E\u793A\u76F8\u5173" + }), /* @__PURE__ */ jsx("div", { + className: "demo-content-container memo-content-text", + dangerouslySetInnerHTML: { + __html: formatMemoContent(demoMemoContent) } - } - }; - }, []); - _react_17_0_2_react.exports.useEffect(() => { - globalStateService.setShowSiderbarInMobileView(false); - }, [locationState]); - _react_17_0_2_react.exports.useEffect(() => { - if (showSiderbarInMobileView) { - document.body.classList.add(SHOW_SIDERBAR_MOBILE_CLASSNAME); - } else { - document.body.classList.remove(SHOW_SIDERBAR_MOBILE_CLASSNAME); - } - }, [showSiderbarInMobileView]); - _react_17_0_2_react.exports.useEffect(() => { - if (isMobileView && showSiderbarInMobileView) { - window.addEventListener("click", handleClickOutsideOfWrapper, { - capture: true - }); - } - }, [isMobileView, showSiderbarInMobileView]); - return /* @__PURE__ */ jsxs("aside", { - className: "memos-sidebar-wrapper", - ref: wrapperElRef, - children: [/* @__PURE__ */ jsx(UserBanner, {}), /* @__PURE__ */ jsx(UsageHeatMap, {}), /* @__PURE__ */ jsx(QueryList, {}), /* @__PURE__ */ jsx(TagList, {})] + }), /* @__PURE__ */ jsxs("label", { + className: "form-label checkbox-form-label", + onClick: handleSplitWordsValueChanged, + children: [/* @__PURE__ */ jsx("span", { + className: "normal-text", + children: "\u4E2D\u82F1\u6587\u5185\u5BB9\u81EA\u52A8\u95F4\u9694" + }), /* @__PURE__ */ jsx("img", { + className: "icon-img", + src: shouldSplitMemoWord ? checkboxActive : checkbox + })] + }), /* @__PURE__ */ jsxs("label", { + className: "form-label checkbox-form-label", + onClick: handleUseMarkdownParserChanged, + children: [/* @__PURE__ */ jsx("span", { + className: "normal-text", + children: "\u90E8\u5206 markdown \u683C\u5F0F\u89E3\u6790" + }), /* @__PURE__ */ jsx("img", { + className: "icon-img", + src: shouldUseMarkdownParser ? checkboxActive : checkbox + })] + }), /* @__PURE__ */ jsxs("label", { + className: "form-label checkbox-form-label", + onClick: handleHideImageUrlValueChanged, + children: [/* @__PURE__ */ jsx("span", { + className: "normal-text", + children: "\u9690\u85CF\u56FE\u7247\u94FE\u63A5\u5730\u5740" + }), /* @__PURE__ */ jsx("img", { + className: "icon-img", + src: shouldHideImageUrl ? checkboxActive : checkbox + })] + })] + }), /* @__PURE__ */ jsxs("div", { + className: "section-container preferences-section-container", + children: [/* @__PURE__ */ jsx("p", { + className: "title-text", + children: "\u7F16\u8F91\u5668" + }), /* @__PURE__ */ jsxs("label", { + className: "form-label checkbox-form-label", + onClick: handleOpenTinyUndoChanged, + children: [/* @__PURE__ */ jsxs("span", { + className: "normal-text", + children: ["\u542F\u7528", " ", /* @__PURE__ */ jsx("a", { + target: "_blank", + href: "https://github.com/boojack/tiny-undo", + onClick: (e) => e.stopPropagation(), + rel: "noreferrer", + children: "tiny-undo" + })] + }), /* @__PURE__ */ jsx("img", { + className: "icon-img", + src: useTinyUndoHistoryCache ? checkboxActive : checkbox + })] + })] + }), /* @__PURE__ */ jsxs("div", { + className: "section-container hidden", + children: [/* @__PURE__ */ jsx("p", { + className: "title-text", + children: "\u5176\u4ED6" + }), /* @__PURE__ */ jsx("div", { + className: "btn-container", + children: /* @__PURE__ */ jsx("button", { + className: "btn export-btn", + onClick: handleExportBtnClick, + children: "\u5BFC\u51FA\u6570\u636E(JSON)" + }) + })] + })] }); }; -var home = ""; -function Home() { +var setting = ""; +const Setting = () => { const { - locationState: { - pathname + globalState: { + isMobileView } } = _react_17_0_2_react.exports.useContext(appContext); - const loadingState = useLoading(); _react_17_0_2_react.exports.useEffect(() => { - loadingState.setFinish(); + memoService.fetchAllMemos(); }, []); - return /* @__PURE__ */ jsx(Fragment, { - children: /* @__PURE__ */ jsxs("section", { - id: "page-wrapper", - children: [/* @__PURE__ */ jsx(Sidebar, {}), /* @__PURE__ */ jsx("main", { - className: "content-wrapper", - children: homeRouterSwitch(pathname) - })] - }) + const handleShowSidebarBtnClick = _react_17_0_2_react.exports.useCallback(() => { + globalStateService.setShowSiderbarInMobileView(true); + }, []); + return /* @__PURE__ */ jsxs("div", { + className: "preference-wrapper", + children: [/* @__PURE__ */ jsx("div", { + className: "section-header-container", + children: /* @__PURE__ */ jsxs("div", { + className: "title-text", + children: [/* @__PURE__ */ jsx(Only, { + when: isMobileView, + children: /* @__PURE__ */ jsx("button", { + className: "action-btn", + onClick: handleShowSidebarBtnClick, + children: /* @__PURE__ */ jsx(SvgMenu, { + className: "icon-img" + }) + }) + }), /* @__PURE__ */ jsx("span", { + className: "normal-text", + children: "\u8D26\u53F7\u4E0E\u8BBE\u7F6E" + })] + }) + }), /* @__PURE__ */ jsx("div", { + className: "sections-wrapper", + children: /* @__PURE__ */ jsx(PreferencesSection, {}) + })] }); -} -var app = ""; -(() => { - if (!String.prototype.replaceAll) { - String.prototype.replaceAll = function(str, newStr) { - if (Object.prototype.toString.call(str).toLowerCase() === "[object regexp]") { - return this.replace(str, newStr); +}; +const homeRouter = { + "/recycle": /* @__PURE__ */ jsx(MemoTrash, {}), + "/setting": /* @__PURE__ */ jsx(Setting, {}), + "*": /* @__PURE__ */ jsx(Memos$1, {}) +}; +const routerSwitch = (router) => { + return (pathname) => { + for (const key of Object.keys(router)) { + if (key === pathname) { + return router[key]; } - return this.replace(new RegExp(str, "g"), newStr); - }; - } -})(); -var global$1 = ""; + } + return router["*"]; + }; +}; +const appRouterSwitch = routerSwitch(appRouter); +const homeRouterSwitch = routerSwitch(homeRouter); function StrictApp() { return /* @__PURE__ */ jsx(Provider, { store: appStore, @@ -22310,19 +19178,16 @@ function StrictApp() { }); } function App() { - _react_17_0_2_react.exports.useContext(appContext); - _react_17_0_2_react.exports.useEffect(() => { - const handleWindowResize = () => { - globalStateService.setIsMobileView(document.body.clientWidth <= 875); - }; - handleWindowResize(); - window.addEventListener("resize", handleWindowResize); - return () => { - window.removeEventListener("resize", handleWindowResize); - }; - }, []); + const { + locationState: { + pathname + } + } = _react_17_0_2_react.exports.useContext(appContext); + if (!appHasDailyNotesPluginLoaded_1() && !window.app.plugins.getPlugin("periodic-notes")) { + new require$$0.Notice(t$1("Check if you opened Daily Notes Plugin Or Periodic Notes Plugin")); + } return /* @__PURE__ */ jsx(Fragment, { - children: /* @__PURE__ */ jsx(Home, {}) + children: appRouterSwitch(pathname) }); } class Memos extends require$$0.ItemView { @@ -22355,6 +19220,11 @@ class Memos extends require$$0.ItemView { } async onFileModified(file) { const date = getDateFromFile_1(file, "day"); + console.log("debounce"); + if (globalStateService.getState().changedByMemos) { + globalStateService.setChangedByMemos(false); + return; + } if (date && this.memosComponent) { memoService.fetchAllMemos(); } @@ -22367,53 +19237,42 @@ class Memos extends require$$0.ItemView { } } } + async handleResize() { + const leaves = this.app.workspace.getLeavesOfType(MEMOS_VIEW_TYPE); + if (leaves.length > 0) { + const leaf = leaves[0]; + if (leaf.width <= 875) { + globalStateService.setIsMobileView(true); + leaf.view.containerEl.classList.add("mobile-view"); + globalStateService.setIsMobileView(leaf.width <= 875); + } else { + globalStateService.setIsMobileView(false); + leaf.view.containerEl.classList.remove("mobile-view"); + globalStateService.setIsMobileView(leaf.width <= 875); + } + } + } async onOpen() { this.onMemosSettingsUpdate = this.onMemosSettingsUpdate.bind(this); this.onFileCreated = this.onFileCreated.bind(this); this.onFileDeleted = this.onFileDeleted.bind(this); this.onFileModified = this.onFileModified.bind(this); - this.registerEvent(this.plugin.app.workspace.on("layout-change", () => { - if (!this.memosComponent) - return; - const leaves = this.app.workspace.getLeavesOfType(MEMOS_VIEW_TYPE); - if (!(leaves.length > 0)) { - return; - } - const leaf = leaves[0]; - const side = leaf.getRoot().side; - let sidebar; - let page; - if (leaf.view.containerEl.querySelector(".memos-sidebar-wrapper")) { - sidebar = leaf.view.containerEl.querySelector(".memos-sidebar-wrapper"); - } else { - sidebar = leaf.view.containerEl.querySelector(".memos-sidebar-wrapper-display"); - } - if (leaf.view.containerEl.querySelector(".content-wrapper")) { - page = leaf.view.containerEl.querySelector(".content-wrapper"); - } else { - page = leaf.view.containerEl.querySelector(".content-wrapper-padding-fix"); - } - if (side !== void 0 && (side === "left" || side === "right")) { - if (!(sidebar == null ? void 0 : sidebar.className.contains("memos-sidebar-wrapper-display")) && page !== void 0) { - sidebar.className = "memos-sidebar-wrapper-display"; - page.className = "content-wrapper-padding-fix"; - } - } else { - if ((sidebar == null ? void 0 : sidebar.classList.contains("memos-sidebar-wrapper-display")) && page !== void 0) { - sidebar.className = "memos-sidebar-wrapper"; - page.className = "content-wrapper"; - } - } - })); this.registerEvent(this.app.workspace.on("obsidian-memos:settings-updated", this.onMemosSettingsUpdate)); this.registerEvent(this.app.vault.on("create", this.onFileCreated)); this.registerEvent(this.app.vault.on("delete", this.onFileDeleted)); - this.registerEvent(this.app.vault.on("modify", this.onFileModified)); + this.registerEvent(this.app.vault.on("modify", require$$0.debounce(this.onFileModified, 2e3, true))); + this.registerEvent(this.app.workspace.on("resize", () => { + this.handleResize(); + })); + this.registerEvent(this.app.metadataCache.on("dataview:api-ready", () => { + console.log("Dataview API ready"); + })); dailyNotesService.getApp(this.app); InsertAfter = this.plugin.settings.InsertAfter; UserName = this.plugin.settings.UserName; ProcessEntriesBelow = this.plugin.settings.ProcessEntriesBelow; SaveMemoButtonLabel = this.plugin.settings.SaveMemoButtonLabel; + SaveMemoButtonIcon = this.plugin.settings.SaveMemoButtonIcon; DefaultPrefix = this.plugin.settings.DefaultPrefix; InsertDateFormat = this.plugin.settings.InsertDateFormat; DefaultEditorLocation = this.plugin.settings.DefaultEditorLocation; @@ -22428,15 +19287,21 @@ class Memos extends require$$0.ItemView { ShowDate = this.plugin.settings.ShowDate; AddBlankLineWhenDate = this.plugin.settings.AddBlankLineWhenDate; AutoSaveWhenOnMobile = this.plugin.settings.AutoSaveWhenOnMobile; - this.plugin.settings.QueryFileName; - this.plugin.settings.DeleteFileName; + QueryFileName = this.plugin.settings.QueryFileName; + DeleteFileName = this.plugin.settings.DeleteFileName; UseVaultTags = this.plugin.settings.UseVaultTags; DefaultDarkBackgroundImage = this.plugin.settings.DefaultDarkBackgroundImage; DefaultLightBackgroundImage = this.plugin.settings.DefaultLightBackgroundImage; DefaultMemoComposition = this.plugin.settings.DefaultMemoComposition; ShowTaskLabel = this.plugin.settings.ShowTaskLabel; - this.memosComponent = React$1.createElement(StrictApp); - ReactDOM$1.render(this.memosComponent, this.contentEl); + CommentOnMemos = this.plugin.settings.CommentOnMemos; + CommentsInOriginalNotes = this.plugin.settings.CommentsInOriginalNotes; + FetchMemosMark = this.plugin.settings.FetchMemosMark; + FetchMemosFromNote = this.plugin.settings.FetchMemosFromNote; + ShowCommentOnMemos = this.plugin.settings.ShowCommentOnMemos; + UseDailyOrPeriodic = this.plugin.settings.UseDailyOrPeriodic; + this.memosComponent = React.createElement(StrictApp); + ReactDOM.render(this.memosComponent, this.contentEl); } async onClose() { } @@ -22445,6 +19310,7 @@ let InsertAfter; let UserName; let ProcessEntriesBelow; let SaveMemoButtonLabel; +let SaveMemoButtonIcon; let DefaultPrefix; let InsertDateFormat; let DefaultEditorLocation; @@ -22458,11 +19324,19 @@ let ShowTime; let ShowDate; let AddBlankLineWhenDate; let AutoSaveWhenOnMobile; +let QueryFileName; +let DeleteFileName; let UseVaultTags; let DefaultDarkBackgroundImage; let DefaultLightBackgroundImage; let DefaultMemoComposition; let ShowTaskLabel; +let CommentOnMemos; +let CommentsInOriginalNotes; +let FetchMemosMark; +let FetchMemosFromNote; +let ShowCommentOnMemos; +let UseDailyOrPeriodic; const icons = { Memos: `` }; @@ -22478,9 +19352,11 @@ const DEFAULT_SETTINGS = { ProcessEntriesBelow: "", Language: "en", SaveMemoButtonLabel: "NOTEIT", + SaveMemoButtonIcon: "\u270D\uFE0F", ShareFooterStart: "{MemosNum} Memos {UsedDay} Day", ShareFooterEnd: "\u270D\uFE0F by {UserName}", DefaultPrefix: "List", + UseDailyOrPeriodic: "Daily", InsertDateFormat: "Tasks", DefaultEditorLocation: "Top", UseButtonToShowEditor: false, @@ -22498,7 +19374,12 @@ const DEFAULT_SETTINGS = { UseVaultTags: false, DefaultLightBackgroundImage: "", DefaultDarkBackgroundImage: "", - DefaultMemoComposition: "{TIME} {CONTENT}" + DefaultMemoComposition: "{TIME} {CONTENT}", + CommentOnMemos: false, + CommentsInOriginalNotes: false, + FetchMemosMark: "#memo", + FetchMemosFromNote: false, + ShowCommentOnMemos: false }; class MemosSettingTab extends require$$0.PluginSettingTab { constructor(app2, plugin) { @@ -22528,59 +19409,63 @@ class MemosSettingTab extends require$$0.PluginSettingTab { await this.plugin.loadSettings(); const { containerEl } = this; this.containerEl.empty(); - this.containerEl.createEl("h1", { text: t("Basic Options") }); - new require$$0.Setting(containerEl).setName(t("User name in Memos")).setDesc(t("Set your user name here. 'Memos \u{1F60F}' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.UserName).setValue(this.plugin.settings.UserName).onChange(async (value) => { + this.containerEl.createEl("h1", { text: t$1("Basic Options") }); + new require$$0.Setting(containerEl).setName(t$1("User name in Memos")).setDesc(t$1("Set your user name here. 'Memos \u{1F60F}' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.UserName).setValue(this.plugin.settings.UserName).onChange(async (value) => { this.plugin.settings.UserName = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Insert after heading")).setDesc(t("You should set the same heading below if you want to insert and process memos below the same heading.")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.InsertAfter).setValue(this.plugin.settings.InsertAfter).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Insert after heading")).setDesc(t$1("You should set the same heading below if you want to insert and process memos below the same heading.")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.InsertAfter).setValue(this.plugin.settings.InsertAfter).onChange(async (value) => { this.plugin.settings.InsertAfter = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Process Memos below")).setDesc(t("Only entries below this string/section in your notes will be processed. If it does not exist no notes will be processed for that file.")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.ProcessEntriesBelow).setValue(this.plugin.settings.ProcessEntriesBelow).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Process Memos below")).setDesc(t$1("Only entries below this string/section in your notes will be processed. If it does not exist no notes will be processed for that file.")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.ProcessEntriesBelow).setValue(this.plugin.settings.ProcessEntriesBelow).onChange(async (value) => { this.plugin.settings.ProcessEntriesBelow = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Save Memo button label")).setDesc(t("The text shown on the save Memo button in the UI. 'NOTEIT' by default.")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.SaveMemoButtonLabel).setValue(this.plugin.settings.SaveMemoButtonLabel).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Save Memo button label")).setDesc(t$1("The text shown on the save Memo button in the UI. 'NOTEIT' by default.")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.SaveMemoButtonLabel).setValue(this.plugin.settings.SaveMemoButtonLabel).onChange(async (value) => { this.plugin.settings.SaveMemoButtonLabel = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Focus on editor when open memos")).setDesc(t("Focus on editor when open memos. Focus by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.FocusOnEditor).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Save Memo button icon")).setDesc(t$1("The icon shown on the save Memo button in the UI.")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.SaveMemoButtonIcon).setValue(this.plugin.settings.SaveMemoButtonIcon).onChange(async (value) => { + this.plugin.settings.SaveMemoButtonIcon = value; + this.applySettingsUpdate(); + })); + new require$$0.Setting(containerEl).setName(t$1("Focus on editor when open memos")).setDesc(t$1("Focus on editor when open memos. Focus by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.FocusOnEditor).onChange(async (value) => { this.plugin.settings.FocusOnEditor = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Open daily memos with open memos")).setDesc(t("Open daily memos with open memos. Open by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.OpenDailyMemosWithMemos).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Open daily memos with open memos")).setDesc(t$1("Open daily memos with open memos. Open by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.OpenDailyMemosWithMemos).onChange(async (value) => { this.plugin.settings.OpenDailyMemosWithMemos = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Open Memos when obsidian opens")).setDesc(t("When enable this, Memos will open when Obsidian opens. False by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.OpenMemosAutomatically).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Open Memos when obsidian opens")).setDesc(t$1("When enable this, Memos will open when Obsidian opens. False by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.OpenMemosAutomatically).onChange(async (value) => { this.plugin.settings.OpenMemosAutomatically = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Hide done tasks in Memo list")).setDesc(t("Hide all done tasks in Memo list. Show done tasks by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.HideDoneTasks).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Hide done tasks in Memo list")).setDesc(t$1("Hide all done tasks in Memo list. Show done tasks by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.HideDoneTasks).onChange(async (value) => { this.plugin.settings.HideDoneTasks = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Show Tasks Label")).setDesc(t("Show tasks label near the time text. False by default")).addToggle((toggle) => toggle.setValue(this.plugin.settings.ShowTaskLabel).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Show Tasks Label")).setDesc(t$1("Show tasks label near the time text. False by default")).addToggle((toggle) => toggle.setValue(this.plugin.settings.ShowTaskLabel).onChange(async (value) => { this.plugin.settings.ShowTaskLabel = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Use Tags In Vault")).setDesc(t("Use tags in vault rather than only in Memos. False by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.UseVaultTags).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Use Tags In Vault")).setDesc(t$1("Use tags in vault rather than only in Memos. False by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.UseVaultTags).onChange(async (value) => { this.plugin.settings.UseVaultTags = value; this.applySettingsUpdate(); })); - this.containerEl.createEl("h1", { text: t("Advanced Options") }); + this.containerEl.createEl("h1", { text: t$1("Advanced Options") }); let dropdown; - new require$$0.Setting(containerEl).setName(t("Default prefix")).setDesc(t("Set the default prefix when create memo, 'List' by default.")).addDropdown(async (d) => { + new require$$0.Setting(containerEl).setName(t$1("Default prefix")).setDesc(t$1("Set the default prefix when create memo, 'List' by default.")).addDropdown(async (d) => { dropdown = d; - dropdown.addOption("List", t("List")); - dropdown.addOption("Task", t("Task")); + dropdown.addOption("List", t$1("List")); + dropdown.addOption("Task", t$1("Task")); dropdown.setValue(this.plugin.settings.DefaultPrefix).onChange(async (value) => { this.plugin.settings.DefaultPrefix = value; this.applySettingsUpdate(); }); }); - new require$$0.Setting(containerEl).setName(t("Default insert date format")).setDesc(t("Set the default date format when insert date by @, 'Tasks' by default.")).addDropdown(async (d) => { + new require$$0.Setting(containerEl).setName(t$1("Default insert date format")).setDesc(t$1("Set the default date format when insert date by @, 'Tasks' by default.")).addDropdown(async (d) => { dropdown = d; dropdown.addOption("Tasks", "Tasks"); dropdown.addOption("Dataview", "Dataview"); @@ -22589,70 +19474,102 @@ class MemosSettingTab extends require$$0.PluginSettingTab { this.applySettingsUpdate(); }); }); - new require$$0.Setting(containerEl).setName(t("Show Time When Copy Results")).setDesc(t("Show time when you copy results, like 12:00. Copy time by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.ShowTime).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Show Time When Copy Results")).setDesc(t$1("Show time when you copy results, like 12:00. Copy time by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.ShowTime).onChange(async (value) => { this.plugin.settings.ShowTime = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Show Date When Copy Results")).setDesc(t("Show date when you copy results, like [[2022-01-01]]. Copy date by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.ShowDate).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Show Date When Copy Results")).setDesc(t$1("Show date when you copy results, like [[2022-01-01]]. Copy date by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.ShowDate).onChange(async (value) => { this.plugin.settings.ShowDate = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Add Blank Line Between Different Date")).setDesc(t("Add blank line when copy result with date. No blank line by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.AddBlankLineWhenDate).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Add Blank Line Between Different Date")).setDesc(t$1("Add blank line when copy result with date. No blank line by default.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.AddBlankLineWhenDate).onChange(async (value) => { this.plugin.settings.AddBlankLineWhenDate = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("File Name of Recycle Bin")).setDesc(t("Set the filename for recycle bin. 'delete' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.DeleteFileName).setValue(this.plugin.settings.DeleteFileName).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("File Name of Recycle Bin")).setDesc(t$1("Set the filename for recycle bin. 'delete' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.DeleteFileName).setValue(this.plugin.settings.DeleteFileName).onChange(async (value) => { await this.changeFileName(this.plugin.settings.DeleteFileName, value); this.plugin.settings.DeleteFileName = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("File Name of Query File")).setDesc(t("Set the filename for query file. 'query' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.QueryFileName).setValue(this.plugin.settings.QueryFileName).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("File Name of Query File")).setDesc(t$1("Set the filename for query file. 'query' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.QueryFileName).setValue(this.plugin.settings.QueryFileName).onChange(async (value) => { await this.changeFileName(this.plugin.settings.QueryFileName, value); this.plugin.settings.QueryFileName = value; this.applySettingsUpdate(); })); - this.containerEl.createEl("h1", { text: t("Mobile Options") }); - new require$$0.Setting(containerEl).setName(t("Default editor position on mobile")).setDesc(t("Set the default editor position on Mobile, 'Top' by default.")).addDropdown(async (d) => { + this.containerEl.createEl("h1", { text: t$1("Mobile Options") }); + new require$$0.Setting(containerEl).setName(t$1("Default editor position on mobile")).setDesc(t$1("Set the default editor position on Mobile, 'Top' by default.")).addDropdown(async (d) => { dropdown = d; - dropdown.addOption("Top", t("Top")); - dropdown.addOption("Bottom", t("Bottom")); + dropdown.addOption("Top", t$1("Top")); + dropdown.addOption("Bottom", t$1("Bottom")); dropdown.setValue(this.plugin.settings.DefaultEditorLocation).onChange(async (value) => { this.plugin.settings.DefaultEditorLocation = value; this.applySettingsUpdate(); }); }); - new require$$0.Setting(containerEl).setName(t("Use button to show editor on mobile")).setDesc(t("Set a float button to call editor on mobile. Only when editor located at the bottom works.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.UseButtonToShowEditor).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Use button to show editor on mobile")).setDesc(t$1("Set a float button to call editor on mobile. Only when editor located at the bottom works.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.UseButtonToShowEditor).onChange(async (value) => { this.plugin.settings.UseButtonToShowEditor = value; this.applySettingsUpdate(); })); - this.containerEl.createEl("h1", { text: t("Share Options") }); - new require$$0.Setting(containerEl).setName(t("Share Memos Image Footer Start")).setDesc(t("Set anything you want here, use {MemosNum} to display Number of memos, {UsedDay} for days. '{MemosNum} Memos {UsedDay} Days' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.ShareFooterStart).setValue(this.plugin.settings.ShareFooterStart).onChange(async (value) => { + this.containerEl.createEl("h1", { text: t$1("Share Options") }); + new require$$0.Setting(containerEl).setName(t$1("Share Memos Image Footer Start")).setDesc(t$1("Set anything you want here, use {MemosNum} to display Number of memos, {UsedDay} for days. '{MemosNum} Memos {UsedDay} Days' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.ShareFooterStart).setValue(this.plugin.settings.ShareFooterStart).onChange(async (value) => { this.plugin.settings.ShareFooterStart = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Share Memos Image Footer End")).setDesc(t("Set anything you want here, use {UserName} as your username. '\u270D\uFE0F By {UserName}' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.ShareFooterEnd).setValue(this.plugin.settings.ShareFooterEnd).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Share Memos Image Footer End")).setDesc(t$1("Set anything you want here, use {UserName} as your username. '\u270D\uFE0F By {UserName}' By default")).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.ShareFooterEnd).setValue(this.plugin.settings.ShareFooterEnd).onChange(async (value) => { this.plugin.settings.ShareFooterEnd = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Background Image in Light Theme")).setDesc(t('Set background image in light theme. Set something like "Daily/one.png"')).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.DefaultLightBackgroundImage).setValue(this.plugin.settings.DefaultLightBackgroundImage).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Background Image in Light Theme")).setDesc(t$1('Set background image in light theme. Set something like "Daily/one.png"')).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.DefaultLightBackgroundImage).setValue(this.plugin.settings.DefaultLightBackgroundImage).onChange(async (value) => { this.plugin.settings.DefaultLightBackgroundImage = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Background Image in Dark Theme")).setDesc(t('Set background image in dark theme. Set something like "Daily/one.png"')).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.DefaultDarkBackgroundImage).setValue(this.plugin.settings.DefaultDarkBackgroundImage).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Background Image in Dark Theme")).setDesc(t$1('Set background image in dark theme. Set something like "Daily/one.png"')).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.DefaultDarkBackgroundImage).setValue(this.plugin.settings.DefaultDarkBackgroundImage).onChange(async (value) => { this.plugin.settings.DefaultDarkBackgroundImage = value; this.applySettingsUpdate(); })); - new require$$0.Setting(containerEl).setName(t("Save Shared Image To Folder For Mobile")).setDesc(t("Save image to folder for mobile. False by Default")).addToggle((toggle) => toggle.setValue(this.plugin.settings.AutoSaveWhenOnMobile).onChange(async (value) => { + new require$$0.Setting(containerEl).setName(t$1("Save Shared Image To Folder For Mobile")).setDesc(t$1("Save image to folder for mobile. False by Default")).addToggle((toggle) => toggle.setValue(this.plugin.settings.AutoSaveWhenOnMobile).onChange(async (value) => { this.plugin.settings.AutoSaveWhenOnMobile = value; this.applySettingsUpdate(); })); - this.containerEl.createEl("h1", { text: t("Experimental Options") }); - new require$$0.Setting(containerEl).setName(t("Default Memo Composition")).setDesc(t('Set default memo composition, you should use {TIME} as "HH:mm" and {CONTENT} as content. "{TIME} {CONTENT}" by default')).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.DefaultMemoComposition).setValue(this.plugin.settings.DefaultMemoComposition).onChange(async (value) => { + this.containerEl.createEl("h1", { text: t$1("Experimental Options") }); + new require$$0.Setting(containerEl).setName(t$1("Use Which Plugin's Default Configuration")).setDesc(t$1("Memos use the plugin's default configuration to fetch memos from daily, 'Daily' by default.")).addDropdown(async (d) => { + dropdown = d; + dropdown.addOption("Daily", t$1("Daily")); + dropdown.addOption("Periodic", "Periodic"); + dropdown.setValue(this.plugin.settings.UseDailyOrPeriodic).onChange(async (value) => { + this.plugin.settings.UseDailyOrPeriodic = value; + this.applySettingsUpdate(); + }); + }); + new require$$0.Setting(containerEl).setName(t$1("Default Memo Composition")).setDesc(t$1('Set default memo composition, you should use {TIME} as "HH:mm" and {CONTENT} as content. "{TIME} {CONTENT}" by default')).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.DefaultMemoComposition).setValue(this.plugin.settings.DefaultMemoComposition).onChange(async (value) => { this.plugin.settings.DefaultMemoComposition = value; this.applySettingsUpdate(); })); - this.containerEl.createEl("h1", { text: t("Say Thank You") }); - new require$$0.Setting(containerEl).setName(t("Donate")).setDesc(t("If you like this plugin, consider donating to support continued development:")).addButton((bt) => { + new require$$0.Setting(containerEl).setName(t$1("Allow Comments On Memos")).setDesc(t$1("You can comment on memos. False by default")).addToggle((toggle) => toggle.setValue(this.plugin.settings.CommentOnMemos).onChange(async (value) => { + this.plugin.settings.CommentOnMemos = value; + this.applySettingsUpdate(); + })); + new require$$0.Setting(containerEl).setName(t$1("Always Show Memo Comments")).setDesc(t$1("Always show memo comments on memos. False by default")).addToggle((toggle) => toggle.setValue(this.plugin.settings.ShowCommentOnMemos).onChange(async (value) => { + this.plugin.settings.ShowCommentOnMemos = value; + this.applySettingsUpdate(); + })); + new require$$0.Setting(containerEl).setName(t$1("Comments In Original DailyNotes/Notes")).setDesc(t$1("You should install Dataview Plugin ver 0.5.9 or later to use this feature.")).addToggle((toggle) => toggle.setValue(this.plugin.settings.CommentsInOriginalNotes).onChange(async (value) => { + this.plugin.settings.CommentsInOriginalNotes = value; + this.applySettingsUpdate(); + })); + new require$$0.Setting(containerEl).setName(t$1("Allow Memos to Fetch Memo from Notes")).setDesc(t$1("Use Memos to manage all memos in your notes, not only in daily notes. False by default")).addToggle((toggle) => toggle.setValue(this.plugin.settings.FetchMemosFromNote).onChange(async (value) => { + this.plugin.settings.FetchMemosFromNote = value; + this.applySettingsUpdate(); + })); + new require$$0.Setting(containerEl).setName(t$1("Fetch Memos From Particular Notes")).setDesc(t$1('You can set any Dataview Query for memos to fetch it. All memos in those notes will show on list. "#memo" by default')).addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.FetchMemosMark).setValue(this.plugin.settings.FetchMemosMark).onChange(async (value) => { + this.plugin.settings.FetchMemosMark = value; + if (value === "") { + this.plugin.settings.FetchMemosMark = DEFAULT_SETTINGS.FetchMemosMark; + } + this.applySettingsUpdate(); + })); + this.containerEl.createEl("h1", { text: t$1("Say Thank You") }); + new require$$0.Setting(containerEl).setName(t$1("Donate")).setDesc(t$1("If you like this plugin, consider donating to support continued development:")).addButton((bt) => { bt.buttonEl.outerHTML = ``; }); } @@ -22666,15 +19583,43 @@ class MemosPlugin extends require$$0.Plugin { console.log("obsidian-memos loading..."); await this.loadSettings(); this.registerView(MEMOS_VIEW_TYPE, (leaf) => new Memos(leaf, this)); - this.addSettingTab(new MemosSettingTab(this.app, this)); + this.app.workspace.onLayoutReady(this.onLayoutReady.bind(this)); + console.log(t$1("welcome")); + } + async loadSettings() { + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); + } + async saveSettings() { + await this.saveData(this.settings); + } + onunload() { + this.app.workspace.detachLeavesOfType(MEMOS_VIEW_TYPE); + new require$$0.Notice(t$1("Close Memos Successfully")); + } + registerMobileEvent() { + this.registerEvent(this.app.workspace.on("receive-text-menu", (menu, source) => { + menu.addItem((item) => { + item.setIcon("popup-open").setTitle(t$1("Insert as Memo")).onClick(async () => { + const newMemo = await memoService.createMemo(source, false); + memoService.pushMemo(newMemo); + }); + }); + })); + this.registerEvent(this.app.workspace.on("receive-files-menu", (menu, source) => { + menu.addItem((item) => { + item.setIcon("popup-open").setTitle(t$1("Insert file as memo content")).onClick(async () => { + const fileName = source.map((file) => { + return this.app.fileManager.generateMarkdownLink(file, file.path); + }); + const newMemo = await memoService.createMemo(fileName.join("\n"), false); + memoService.pushMemo(newMemo); + }); + }); + })); + } + async onLayoutReady() { addIcons(); - this.addRibbonIcon("Memos", t("ribbonIconTitle"), () => { - new require$$0.Notice("Open Memos Successfully"); - this.openMemos(); - }); - if (appHasDailyNotesPluginLoaded_1()) { - new require$$0.Notice("Check if you opened Daily Notes Plugin"); - } + this.addSettingTab(new MemosSettingTab(this.app, this)); this.addCommand({ id: "open-memos", name: "Open Memos", @@ -22711,26 +19656,26 @@ class MemosPlugin extends require$$0.Plugin { callback: () => this.changeStatus(), hotkeys: [] }); - this.app.workspace.onLayoutReady(this.onLayoutReady.bind(this)); - console.log(t("welcome")); - } - async loadSettings() { - this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); - } - async saveSettings() { - await this.saveData(this.settings); - } - onunload() { - this.app.workspace.detachLeavesOfType(MEMOS_VIEW_TYPE); - new require$$0.Notice("Close Memos Successfully"); - } - async onLayoutReady() { + this.addCommand({ + id: "show-memos-in-popover", + name: "Show Memos in Popover", + callback: () => this.showInPopover(), + hotkeys: [] + }); + if (require$$0.Platform.isMobile) { + this.registerMobileEvent(); + } + this.addRibbonIcon("Memos", t$1("ribbonIconTitle"), () => { + new require$$0.Notice(t$1("Open Memos Successfully")); + this.openMemos(); + }); const leaves = this.app.workspace.getLeavesOfType(MEMOS_VIEW_TYPE); - if (leaves.length > 0) { - if (this.settings.FocusOnEditor) { - const leaf = leaves[0]; - leaf.view.containerEl.querySelector("textarea").focus(); - } + if (!(leaves.length > 0)) { + return; + } + if (this.settings.FocusOnEditor) { + const leaf = leaves[0]; + leaf.view.containerEl.querySelector("textarea").focus(); return; } if (!this.settings.OpenMemosAutomatically) { @@ -22738,75 +19683,90 @@ class MemosPlugin extends require$$0.Plugin { } this.openMemos(); } - async openDailyMemo() { + openDailyMemo() { const workspaceLeaves = this.app.workspace.getLeavesOfType(MEMOS_VIEW_TYPE); - if (OpenDailyMemosWithMemos === true) { - if (workspaceLeaves !== void 0 && workspaceLeaves.length === 0) { - this.openMemos(); - showDailyMemoDiaryDialog(); - } else { - showDailyMemoDiaryDialog(); - } - } else { + if (!OpenDailyMemosWithMemos) { + showDailyMemoDiaryDialog(); + return; + } + if (workspaceLeaves.length > 0) { showDailyMemoDiaryDialog(); + return; } + this.openMemos(); + showDailyMemoDiaryDialog(); } async openMemos() { const workspace = this.app.workspace; workspace.detachLeavesOfType(MEMOS_VIEW_TYPE); - const leaf = workspace.getLeaf(!require$$0.Platform.isMobile && workspace.activeLeaf && workspace.activeLeaf.view instanceof require$$0.FileView); + const leaf = workspace.getLeaf(false); await leaf.setViewState({ type: MEMOS_VIEW_TYPE }); workspace.revealLeaf(leaf); - if (FocusOnEditor) { - if (leaf.view.containerEl.querySelector("textarea") !== void 0) { - leaf.view.containerEl.querySelector("textarea").focus(); - } + if (!FocusOnEditor) { + return; + } + if (leaf.view.containerEl.querySelector("textarea") !== void 0) { + leaf.view.containerEl.querySelector("textarea").focus(); } } searchIt() { const workspace = this.app.workspace; const leaves = workspace.getLeavesOfType(MEMOS_VIEW_TYPE); - if (leaves.length > 0) { - const leaf = leaves[0]; - workspace.setActiveLeaf(leaf); - leaf.view.containerEl.querySelector(".search-bar-inputer .text-input").focus(); - } else { + if (!(leaves.length > 0)) { this.openMemos(); + return; } + const leaf = leaves[0]; + workspace.setActiveLeaf(leaf); + leaf.view.containerEl.querySelector(".search-bar-inputer .text-input").focus(); } focusOnEditor() { const workspace = this.app.workspace; const leaves = workspace.getLeavesOfType(MEMOS_VIEW_TYPE); - if (leaves.length > 0) { - const leaf = leaves[0]; - workspace.setActiveLeaf(leaf); - leaf.view.containerEl.querySelector("textarea").focus(); - } else { + if (!(leaves.length > 0)) { this.openMemos(); + return; } + const leaf = leaves[0]; + workspace.setActiveLeaf(leaf); + leaf.view.containerEl.querySelector("textarea").focus(); } noteIt() { const workspace = this.app.workspace; const leaves = workspace.getLeavesOfType(MEMOS_VIEW_TYPE); - if (leaves.length > 0) { - const leaf = leaves[0]; - workspace.setActiveLeaf(leaf); - leaf.view.containerEl.querySelector(".memo-editor .confirm-btn").click(); - } else { - this.openMemos(); + if (!(leaves.length > 0)) { + new require$$0.Notice(t$1("Please Open Memos First")); + return; } + const leaf = leaves[0]; + workspace.setActiveLeaf(leaf); + leaf.view.containerEl.querySelector(".memo-editor .confirm-btn").click(); } changeStatus() { const workspace = this.app.workspace; const leaves = workspace.getLeavesOfType(MEMOS_VIEW_TYPE); - if (leaves.length > 0) { - const leaf = leaves[0]; - workspace.setActiveLeaf(leaf); - leaf.view.containerEl.querySelector(".list-or-task").click(); - } else { - this.openMemos(); + if (!(leaves.length > 0)) { + new require$$0.Notice(t$1("Please Open Memos First")); + return; + } + const leaf = leaves[0]; + workspace.setActiveLeaf(leaf); + leaf.view.containerEl.querySelector(".list-or-task").click(); + } + async showInPopover() { + var _a; + const workspace = this.app.workspace; + workspace.detachLeavesOfType(MEMOS_VIEW_TYPE); + const leaf = await ((_a = window.app.plugins.getPlugin("obsidian-hover-editor")) == null ? void 0 : _a.spawnPopover()); + await leaf.setViewState({ type: MEMOS_VIEW_TYPE }); + workspace.revealLeaf(leaf); + leaf.view.containerEl.classList.add("mobile-view"); + if (!FocusOnEditor) { + return; + } + if (leaf.view.containerEl.querySelector("textarea") !== void 0) { + leaf.view.containerEl.querySelector("textarea").focus(); } } } module.exports = MemosPlugin; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsic3JjL2NvbnN0YW50cy50cyIsIm5vZGVfbW9kdWxlcy9fb2JqZWN0LWFzc2lnbkA0LjEuMUBvYmplY3QtYXNzaWduL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdEAxNy4wLjJAcmVhY3QvY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdEAxNy4wLjJAcmVhY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX3NjaGVkdWxlckAwLjIwLjJAc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMiLCJub2RlX21vZHVsZXMvX3NjaGVkdWxlckAwLjIwLjJAc2NoZWR1bGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kb21AMTcuMC4yQHJlYWN0LWRvbS9janMvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kb21AMTcuMC4yQHJlYWN0LWRvbS9pbmRleC5qcyIsInNyYy9sYWJzL2NvbWJpbmVSZWR1Y2Vycy50cyIsInNyYy9sYWJzL2NyZWF0ZVN0b3JlLnRzIiwic3JjL3N0b3Jlcy9nbG9iYWxTdGF0ZVN0b3JlLnRzIiwic3JjL3N0b3Jlcy9sb2NhdGlvblN0b3JlLnRzIiwic3JjL2hlbHBlcnMvdXRpbHMudHMiLCJzcmMvc3RvcmVzL21lbW9TdG9yZS50cyIsInNyYy9zdG9yZXMvdXNlclN0b3JlLnRzIiwic3JjL3N0b3Jlcy9xdWVyeVN0b3JlLnRzIiwibm9kZV9tb2R1bGVzL19vYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2VAMC45LjRAb2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlL2Rpc3QvbWFpbi5qcyIsInNyYy9zdG9yZXMvZGFpbHlOb3Rlc1N0b3JlLnRzIiwic3JjL3N0b3Jlcy9hcHBTdG9yZS50cyIsInNyYy9zdG9yZXMvYXBwQ29udGV4dC50cyIsInNyYy9zZXJ2aWNlcy9kYWlseU5vdGVzU2VydmljZS50cyIsInNyYy9oZWxwZXJzL3N0b3JhZ2UudHMiLCJzcmMvc2VydmljZXMvZ2xvYmFsU3RhdGVTZXJ2aWNlLnRzIiwic3JjL3NlcnZpY2VzL2xvY2F0aW9uU2VydmljZS50cyIsInNyYy9vYkNvbXBvbmVudHMvb2JVcGRhdGVNZW1vLnRzIiwic3JjL29iQ29tcG9uZW50cy9vYkdldFF1ZXJpZXMudHMiLCJzcmMvb2JDb21wb25lbnRzL29iQ3JlYXRlUXVlcnkudHMiLCJzcmMvb2JDb21wb25lbnRzL29iR2V0TWVtb3MudHMiLCJzcmMvb2JDb21wb25lbnRzL29iVXBkYXRlUXVlcnkudHMiLCJzcmMvb2JDb21wb25lbnRzL29iQ3JlYXRlTWVtby50cyIsInNyYy9vYkNvbXBvbmVudHMvb2JEZWxldGVNZW1vLnRzIiwic3JjL29iQ29tcG9uZW50cy9vYkhpZGVNZW1vLnRzIiwic3JjL29iQ29tcG9uZW50cy9vYkRlbGV0ZVF1ZXJ5LnRzIiwic3JjL29iQ29tcG9uZW50cy9vYlBpblF1ZXJ5LnRzIiwic3JjL2hlbHBlcnMvYXBpLnRzIiwic3JjL2hlbHBlcnMvY29uc3RzLnRzIiwic3JjL3NlcnZpY2VzL21lbW9TZXJ2aWNlLnRzIiwic3JjL3NlcnZpY2VzL3F1ZXJ5U2VydmljZS50cyIsInNyYy9zZXJ2aWNlcy9yZXNvdXJjZVNlcnZpY2UudHMiLCJub2RlX21vZHVsZXMvX3RpbnktdW5kb0AwLjAuOEB0aW55LXVuZG8vZGlzdC9UaW55VW5kby5qcyIsInNyYy9ob29rcy91c2VSZWZyZXNoLnRzIiwibm9kZV9tb2R1bGVzL19yZWFjdEAxNy4wLjJAcmVhY3QvY2pzL3JlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdEAxNy4wLjJAcmVhY3QvanN4LXJ1bnRpbWUuanMiLCJyZWFjdC9qc3gtcnVudGltZSIsInNyYy9jb21wb25lbnRzL2NvbW1vbi9Pbmx5V2hlbi50c3giLCJub2RlX21vZHVsZXMvX3RleHRhcmVhLWNhcmV0QDMuMC4yQHRleHRhcmVhLWNhcmV0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19jdXN0b20tZXZlbnRAMS4wLjFAY3VzdG9tLWV2ZW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19Ad2Vic2NvcGVpb19yZWFjdC10ZXh0YXJlYS1hdXRvY29tcGxldGVANC45LjFAQHdlYnNjb3BlaW8vcmVhY3QtdGV4dGFyZWEtYXV0b2NvbXBsZXRlL2Rpc3QvcmVhY3QtdGV4dGFyZWEtYXV0b2NvbXBsZXRlLmVzLmpzIiwic3JjL29iQ29tcG9uZW50cy9vYlRhZ1N1Z2dlc3Rlci50cyIsInNyYy9vYkNvbXBvbmVudHMvb2JGaWxlU3VnZ2VzdGVyLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvYXIudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9jei50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL2RhLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvZGUudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9lbi50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL2VuLWdiLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvZXMudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9mci50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL2hpLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvaWQudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9pdC50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL2phLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUva28udHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9ubC50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL25vLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvcGwudHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9wdC50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL3B0LWJyLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvcm8udHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS9ydS50cyIsInNyYy90cmFuc2xhdGlvbnMvbG9jYWxlL3RyLnRzIiwic3JjL3RyYW5zbGF0aW9ucy9sb2NhbGUvemgtY24udHMiLCJzcmMvdHJhbnNsYXRpb25zL2xvY2FsZS96aC10dy50cyIsInNyYy90cmFuc2xhdGlvbnMvaGVscGVyLnRzIiwic3JjL2NvbXBvbmVudHMvRWRpdG9yL0VkaXRvci50c3giLCJub2RlX21vZHVsZXMvX3RzbGliQDIuMy4xQHRzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy9fQHJlYWNoX3V0aWxzQDAuMTYuMEBAcmVhY2gvdXRpbHMvY2FuLXVzZS1kb20vZGlzdC9yZWFjaC11dGlscy1jYW4tdXNlLWRvbS5lc20uanMiLCJub2RlX21vZHVsZXMvX0ByZWFjaF91dGlsc0AwLjE2LjBAQHJlYWNoL3V0aWxzL3VzZS1pc29tb3JwaGljLWxheW91dC1lZmZlY3QvZGlzdC9yZWFjaC11dGlscy11c2UtaXNvbW9ycGhpYy1sYXlvdXQtZWZmZWN0LmVzbS5qcyIsIm5vZGVfbW9kdWxlcy9fQHJlYWNoX2F1dG8taWRAMC4xNi4wQEByZWFjaC9hdXRvLWlkL2Rpc3QvcmVhY2gtYXV0by1pZC5lc20uanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL19saWIvYnVpbGRGb3JtYXRMb25nRm4vaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL19saWIvYnVpbGRMb2NhbGl6ZUZuL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2xvY2FsZS9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4vaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL19saWIvYnVpbGRNYXRjaEZuL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL3RvRGF0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL3RvSW50ZWdlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL3N0YXJ0T2ZVVENXZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2FkZERheXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vYWRkTW9udGhzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2FkZE1pbGxpc2Vjb25kcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9zdGFydE9mV2Vlay9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vc3RhcnRPZkRheS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vYWRkV2Vla3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vYWRkWWVhcnMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vaXNTYW1lRGF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2lzRGF0ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9pc1ZhbGlkL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2RpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2RpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vZW5kT2ZNb250aC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9zdGFydE9mTW9udGgvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vc3RhcnRPZlllYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vZW5kT2ZXZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdExvbmcvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL2VuLVVTL19saWIvbG9jYWxpemUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL2VuLVVTL19saWIvbWF0Y2gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vbG9jYWxlL2VuLVVTL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL3N1Yk1pbGxpc2Vjb25kcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL2dldFVUQ0RheU9mWWVhci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL3N0YXJ0T2ZVVENJU09XZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvZ2V0VVRDSVNPV2Vla1llYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vX2xpYi9zdGFydE9mVVRDSVNPV2Vla1llYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vX2xpYi9nZXRVVENJU09XZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvZ2V0VVRDV2Vla1llYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vX2xpYi9zdGFydE9mVVRDV2Vla1llYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vX2xpYi9nZXRVVENXZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvYWRkTGVhZGluZ1plcm9zL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvZm9ybWF0L2xpZ2h0Rm9ybWF0dGVycy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL19saWIvcHJvdGVjdGVkVG9rZW5zL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2Zvcm1hdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9nZXREYXlzSW5Nb250aC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9nZXRUaW1lL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2dldFVuaXhUaW1lL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2dldFdlZWtZZWFyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL3N0YXJ0T2ZXZWVrWWVhci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9nZXRXZWVrL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2xhc3REYXlPZk1vbnRoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2dldFdlZWtzSW5Nb250aC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fZGF0ZS1mbnNAMi4yOC4wQGRhdGUtZm5zL2VzbS9pc0FmdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2lzQmVmb3JlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2lzU2FtZU1vbnRoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19kYXRlLWZuc0AyLjI4LjBAZGF0ZS1mbnMvZXNtL2lzU2FtZVllYXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vc2V0TW9udGgvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX2RhdGUtZm5zQDIuMjguMEBkYXRlLWZucy9lc20vc2V0WWVhci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9Nb250aHNEcm9wZG93bi9Nb250aHNEcm9wZG93bi5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9CdXR0b24vQnV0dG9uLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL05hdmlnYXRpb24vTmF2aWdhdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9ZZWFyc0Ryb3Bkb3duL1llYXJzRHJvcGRvd24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2hvb2tzL3VzZUNvbnRyb2xsZWRWYWx1ZS91c2VDb250cm9sbGVkVmFsdWUuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL05hdmlnYXRpb24vdXRpbHMvZ2V0SW5pdGlhbE1vbnRoLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9OYXZpZ2F0aW9uL3VzZU5hdmlnYXRpb25TdGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvTmF2aWdhdGlvbi91dGlscy9nZXREaXNwbGF5TW9udGhzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9OYXZpZ2F0aW9uL3V0aWxzL2dldE5leHRNb250aC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvTmF2aWdhdGlvbi91dGlscy9nZXRQcmV2aW91c01vbnRoLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9OYXZpZ2F0aW9uL05hdmlnYXRpb25Db250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9OYXZpZ2F0aW9uL3VzZU5hdmlnYXRpb24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvQ2FwdGlvbi9DYXB0aW9uLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0NhcHRpb25MYWJlbC9DYXB0aW9uTGFiZWwuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL3R5cGVzL0RheVBpY2tlck11bHRpcGxlLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9TZWxlY3RNdWx0aXBsZS9TZWxlY3RNdWx0aXBsZUNvbnRleHQuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL1NlbGVjdE11bHRpcGxlL3VzZVNlbGVjdE11bHRpcGxlLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC90eXBlcy9EYXlQaWNrZXJSYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvU2VsZWN0UmFuZ2UvdXRpbHMvYWRkVG9SYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvU2VsZWN0UmFuZ2UvU2VsZWN0UmFuZ2VDb250ZXh0LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9TZWxlY3RSYW5nZS91c2VTZWxlY3RSYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvdHlwZXMvRGF5UGlja2VyU2luZ2xlLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9TZWxlY3RTaW5nbGUvU2VsZWN0U2luZ2xlQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvU2VsZWN0U2luZ2xlL3VzZVNlbGVjdFNpbmdsZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvTW9kaWZpZXJzL3V0aWxzL3RvTWF0Y2hlckFycmF5LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9Nb2RpZmllcnMvdXRpbHMvZ2V0Q3VzdG9tTW9kaWZpZXJzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC90eXBlcy9Nb2RpZmllcnMuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL01vZGlmaWVycy91dGlscy9nZXRJbnRlcm5hbE1vZGlmaWVycy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvTW9kaWZpZXJzL01vZGlmaWVyc0NvbnRleHQuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL01vZGlmaWVycy91c2VNb2RpZmllcnMuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL3R5cGVzL01hdGNoZXJzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9ob29rcy91c2VEYXlNb2RpZmllcnMvdXRpbHMvaXNEYXRlSW5SYW5nZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvaG9va3MvdXNlRGF5TW9kaWZpZXJzL3V0aWxzL2lzTWF0Y2guanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2hvb2tzL3VzZURheU1vZGlmaWVycy91dGlscy9nZXRNb2RpZmllclN0YXR1cy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvaG9va3MvdXNlRGF5TW9kaWZpZXJzL3VzZURheU1vZGlmaWVycy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRm9jdXMvZ2V0SW5pdGlhbEZvY3VzVGFyZ2V0LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9Gb2N1cy9Gb2N1c0NvbnRleHQuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0ZvY3VzL3VzZUZvY3VzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0RheS9ob29rcy91c2VEYXlGb2N1cy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9EYXkvaG9va3MvdXNlRGF5LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0RheS9EYXkuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvRGF5Q29udGVudC9EYXlDb250ZW50LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0Ryb3Bkb3duL0Ryb3Bkb3duLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL0Zvb3Rlci9Gb290ZXIuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvSGVhZC91dGlscy9nZXRXZWVrZGF5cy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9IZWFkL0hlYWQuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvSWNvbkRyb3Bkb3duL0ljb25Ecm9wZG93bi5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9JY29uTGVmdC9JY29uTGVmdC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9JY29uUmlnaHQvSWNvblJpZ2h0LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL1Jvdy9Sb3cuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbXBvbmVudHMvV2Vla051bWJlci9XZWVrTnVtYmVyLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvZGVmYXVsdENsYXNzTmFtZXMuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9mb3JtYXR0ZXJzL2Zvcm1hdENhcHRpb24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9mb3JtYXR0ZXJzL2Zvcm1hdERheS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL2Zvcm1hdHRlcnMvZm9ybWF0TW9udGhDYXB0aW9uLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvZm9ybWF0dGVycy9mb3JtYXRXZWVrTnVtYmVyLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvZm9ybWF0dGVycy9mb3JtYXRXZWVrZGF5TmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL2Zvcm1hdHRlcnMvZm9ybWF0WWVhckNhcHRpb24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9sYWJlbHMvbGFiZWxEYXkuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9sYWJlbHMvbGFiZWxNb250aERyb3Bkb3duLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvbGFiZWxzL2xhYmVsTmV4dC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL2xhYmVscy9sYWJlbFByZXZpb3VzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvbGFiZWxzL2xhYmVsV2Vla2RheS5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL2xhYmVscy9sYWJlbFdlZWtOdW1iZXIuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci9sYWJlbHMvbGFiZWxZZWFyRHJvcGRvd24uanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LWRheS1waWNrZXJAOC4wLjAtYmV0YS4zNkByZWFjdC1kYXktcGlja2VyL2J1aWxkL2NvbnRleHRzL0RheVBpY2tlci91dGlscy9wYXJzZUZyb21Ub1Byb3BzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb250ZXh0cy9EYXlQaWNrZXIvRGF5UGlja2VyQ29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvRGF5UGlja2VyL3VzZURheVBpY2tlci5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9UYWJsZS91dGlscy9nZXRPdXRzaWRlRW5kRGF5cy5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29tcG9uZW50cy9UYWJsZS91dGlscy9nZXRPdXRzaWRlU3RhcnREYXlzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL1RhYmxlL3V0aWxzL2dldFdlZWtzLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL1RhYmxlL1RhYmxlLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL01vbnRoL01vbnRoLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9jb21wb25lbnRzL1Jvb3QvUm9vdC5qcyIsIm5vZGVfbW9kdWxlcy9fcmVhY3QtZGF5LXBpY2tlckA4LjAuMC1iZXRhLjM2QHJlYWN0LWRheS1waWNrZXIvYnVpbGQvY29udGV4dHMvUm9vdFByb3ZpZGVyLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1kYXktcGlja2VyQDguMC4wLWJldGEuMzZAcmVhY3QtZGF5LXBpY2tlci9idWlsZC9EYXlQaWNrZXIuanMiLCJub2RlX21vZHVsZXMvX3JlYWN0LXBvcHBlckAyLjIuNUByZWFjdC1wb3BwZXIvbGliL2VzbS91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9lbnVtcy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tYXRoLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2NvbnRhaW5zLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1RhYmxlRWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRQYXJlbnROb2RlLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3dpdGhpbi5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXJyb3cuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0VmFyaWF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRWaWV3cG9ydFJlY3QuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50UmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNTY3JvbGxQYXJlbnQuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9oaWRlLmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9vZmZzZXQuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QWx0QXhpcy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzIiwibm9kZV9tb2R1bGVzL19AcG9wcGVyanNfY29yZUAyLjExLjJAQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRIVE1MRWxlbWVudFNjcm9sbC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZVNjcm9sbC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9vcmRlck1vZGlmaWVycy5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZWJvdW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9tZXJnZUJ5TmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9fQHBvcHBlcmpzX2NvcmVAMi4xMS4yQEBwb3BwZXJqcy9jb3JlL2xpYi9jcmVhdGVQb3BwZXIuanMiLCJub2RlX21vZHVsZXMvX0Bwb3BwZXJqc19jb3JlQDIuMTEuMkBAcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1mYXN0LWNvbXBhcmVAMy4yLjBAcmVhY3QtZmFzdC1jb21wYXJlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL19yZWFjdC1wb3BwZXJAMi4yLjVAcmVhY3QtcG9wcGVyL2xpYi9lc20vdXNlUG9wcGVyLmpzIiwibm9kZV9tb2R1bGVzL19wcm9wLXR5cGVzQDE1LjguMUBwcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIm5vZGVfbW9kdWxlcy9fcHJvcC10eXBlc0AxNS44LjFAcHJvcC10eXBlcy9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanMiLCJub2RlX21vZHVsZXMvX3Byb3AtdHlwZXNAMTUuOC4xQHByb3AtdHlwZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvX3RhYmJhYmxlQDUuMi4xQHRhYmJhYmxlL2Rpc3QvaW5kZXguZXNtLmpzIiwibm9kZV9tb2R1bGVzL19mb2N1cy10cmFwQDYuNy4yQGZvY3VzLXRyYXAvZGlzdC9mb2N1cy10cmFwLmVzbS5qcyIsIm5vZGVfbW9kdWxlcy9fZm9jdXMtdHJhcC1yZWFjdEA4LjkuMUBmb2N1cy10cmFwLXJlYWN0L2Rpc3QvZm9jdXMtdHJhcC1yZWFjdC5qcyIsInNyYy9ob29rcy91c2VUb2dnbGUudHMiLCJzcmMvY29tcG9uZW50cy9NZW1vRWRpdG9yLnRzeCIsInNyYy9oZWxwZXJzL2ZpbHRlci50cyIsInNyYy9jb21wb25lbnRzL1NlYXJjaEJhci50c3giLCJzcmMvY29tcG9uZW50cy9NZW1vc0hlYWRlci50c3giLCJzcmMvaGVscGVycy9tYXJrZWQudHMiLCJzcmMvbGFicy9Qcm92aWRlci50c3giLCJzcmMvY29tcG9uZW50cy9EaWFsb2cudHN4Iiwic3JjL2NvbXBvbmVudHMvUHJldmlld0ltYWdlRGlhbG9nLnRzeCIsInNyYy9jb21wb25lbnRzL0ltYWdlLnRzeCIsInNyYy9jb21wb25lbnRzL01lbW9DYXJkRGlhbG9nLnRzeCIsInNyYy9sYWJzL2h0bWwyaW1hZ2UvY29udmVydFJlc291cmNlVG9EYXRhVVJMLnRzIiwic3JjL2xhYnMvaHRtbDJpbWFnZS9nZXRDbG9uZVN0eWxlZEVsZW1lbnQudHMiLCJzcmMvbGFicy9odG1sMmltYWdlL2dldEZvbnRzU3R5bGVFbGVtZW50LnRzIiwic3JjL2xhYnMvaHRtbDJpbWFnZS9pbmRleC50cyIsInNyYy9jb21wb25lbnRzL1NoYXJlTWVtb0ltYWdlRGlhbG9nLnRzeCIsInNyYy9vYkNvbXBvbmVudHMvb2JTaG93TWVtby50cyIsInNyYy9jb21wb25lbnRzL01lbW8udHN4Iiwic3JjL2NvbXBvbmVudHMvTWVtb0xpc3QudHN4Iiwic3JjL29iQ29tcG9uZW50cy9vYkNvcHlNZW1vcy50cyIsInNyYy9jb21wb25lbnRzL01lbW9GaWx0ZXIudHN4Iiwic3JjL3BhZ2VzL01lbW9zLnRzeCIsInNyYy9ob29rcy91c2VMb2FkaW5nLnRzIiwic3JjL2NvbXBvbmVudHMvRGVsZXRlZE1lbW8udHN4Iiwic3JjL3BhZ2VzL01lbW9UcmFzaC50c3giLCJzcmMvY29tcG9uZW50cy9QcmVmZXJlbmNlc1NlY3Rpb24udHN4Iiwic3JjL3BhZ2VzL1NldHRpbmcudHN4Iiwic3JjL3JvdXRlcnMvaG9tZVJvdXRlci50c3giLCJzcmMvcm91dGVycy9pbmRleC50cyIsInNyYy9jb21wb25lbnRzL0Fib3V0U2l0ZURpYWxvZy50c3giLCJzcmMvY29tcG9uZW50cy9NZW51QnRuc1BvcHVwLnRzeCIsInNyYy9jb21wb25lbnRzL0RhaWx5TWVtby50c3giLCJzcmMvY29tcG9uZW50cy9jb21tb24vRGF0ZVBpY2tlci50c3giLCJzcmMvY29tcG9uZW50cy9EYWlseU1lbW9EaWFyeURpYWxvZy50c3giLCJzcmMvY29tcG9uZW50cy9Vc2VyQmFubmVyLnRzeCIsInNyYy9jb21wb25lbnRzL2NvbW1vbi9TZWxlY3Rvci50c3giLCJzcmMvY29tcG9uZW50cy9DcmVhdGVRdWVyeURpYWxvZy50c3giLCJzcmMvY29tcG9uZW50cy9RdWVyeUxpc3QudHN4Iiwic3JjL2NvbXBvbmVudHMvVGFnTGlzdC50c3giLCJub2RlX21vZHVsZXMvX3JlYWN0LXVzZXN0YXRlcmVmQDEuMC44QHJlYWN0LXVzZXN0YXRlcmVmL2Rpc3QvaW5kZXguanMiLCJzcmMvY29tcG9uZW50cy9Vc2FnZUhlYXRNYXAudHN4Iiwic3JjL2NvbXBvbmVudHMvU2lkZWJhci50c3giLCJzcmMvcGFnZXMvSG9tZS50c3giLCJzcmMvaGVscGVycy9wb2x5ZmlsbC50cyIsInNyYy9BcHAudHN4Iiwic3JjL21lbW9zLnRzIiwic3JjL29iQ29tcG9uZW50cy9jdXN0b21JY29ucy50cyIsInNyYy9zZXR0aW5nLnRzIiwic3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBNRU1PU19WSUVXX1RZUEUgPSAnbWVtb3Nfdmlldyc7XG5leHBvcnQgY29uc3QgVklFV19UWVBFID0gJ3JlYWN0LXZpZXcnO1xuIiwiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTcuMC4yXG4gKiByZWFjdC5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG4ndXNlIHN0cmljdCc7dmFyIGw9cmVxdWlyZShcIm9iamVjdC1hc3NpZ25cIiksbj02MDEwMyxwPTYwMTA2O2V4cG9ydHMuRnJhZ21lbnQ9NjAxMDc7ZXhwb3J0cy5TdHJpY3RNb2RlPTYwMTA4O2V4cG9ydHMuUHJvZmlsZXI9NjAxMTQ7dmFyIHE9NjAxMDkscj02MDExMCx0PTYwMTEyO2V4cG9ydHMuU3VzcGVuc2U9NjAxMTM7dmFyIHU9NjAxMTUsdj02MDExNjtcbmlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5mb3Ipe3ZhciB3PVN5bWJvbC5mb3I7bj13KFwicmVhY3QuZWxlbWVudFwiKTtwPXcoXCJyZWFjdC5wb3J0YWxcIik7ZXhwb3J0cy5GcmFnbWVudD13KFwicmVhY3QuZnJhZ21lbnRcIik7ZXhwb3J0cy5TdHJpY3RNb2RlPXcoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKTtleHBvcnRzLlByb2ZpbGVyPXcoXCJyZWFjdC5wcm9maWxlclwiKTtxPXcoXCJyZWFjdC5wcm92aWRlclwiKTtyPXcoXCJyZWFjdC5jb250ZXh0XCIpO3Q9dyhcInJlYWN0LmZvcndhcmRfcmVmXCIpO2V4cG9ydHMuU3VzcGVuc2U9dyhcInJlYWN0LnN1c3BlbnNlXCIpO3U9dyhcInJlYWN0Lm1lbW9cIik7dj13KFwicmVhY3QubGF6eVwiKX12YXIgeD1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7XG5mdW5jdGlvbiB5KGEpe2lmKG51bGw9PT1hfHxcIm9iamVjdFwiIT09dHlwZW9mIGEpcmV0dXJuIG51bGw7YT14JiZhW3hdfHxhW1wiQEBpdGVyYXRvclwiXTtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYT9hOm51bGx9ZnVuY3Rpb24geihhKXtmb3IodmFyIGI9XCJodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD1cIithLGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWIrPVwiJmFyZ3NbXT1cIitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW2NdKTtyZXR1cm5cIk1pbmlmaWVkIFJlYWN0IGVycm9yICNcIithK1wiOyB2aXNpdCBcIitiK1wiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5cIn1cbnZhciBBPXtpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oKXt9fSxCPXt9O2Z1bmN0aW9uIEMoYSxiLGMpe3RoaXMucHJvcHM9YTt0aGlzLmNvbnRleHQ9Yjt0aGlzLnJlZnM9Qjt0aGlzLnVwZGF0ZXI9Y3x8QX1DLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O0MucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGEsYil7aWYoXCJvYmplY3RcIiE9PXR5cGVvZiBhJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYSYmbnVsbCE9YSl0aHJvdyBFcnJvcih6KDg1KSk7dGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLGEsYixcInNldFN0YXRlXCIpfTtDLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsYSxcImZvcmNlVXBkYXRlXCIpfTtcbmZ1bmN0aW9uIEQoKXt9RC5wcm90b3R5cGU9Qy5wcm90b3R5cGU7ZnVuY3Rpb24gRShhLGIsYyl7dGhpcy5wcm9wcz1hO3RoaXMuY29udGV4dD1iO3RoaXMucmVmcz1CO3RoaXMudXBkYXRlcj1jfHxBfXZhciBGPUUucHJvdG90eXBlPW5ldyBEO0YuY29uc3RydWN0b3I9RTtsKEYsQy5wcm90b3R5cGUpO0YuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7dmFyIEc9e2N1cnJlbnQ6bnVsbH0sSD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEk9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtcbmZ1bmN0aW9uIEooYSxiLGMpe3ZhciBlLGQ9e30saz1udWxsLGg9bnVsbDtpZihudWxsIT1iKWZvcihlIGluIHZvaWQgMCE9PWIucmVmJiYoaD1iLnJlZiksdm9pZCAwIT09Yi5rZXkmJihrPVwiXCIrYi5rZXkpLGIpSC5jYWxsKGIsZSkmJiFJLmhhc093blByb3BlcnR5KGUpJiYoZFtlXT1iW2VdKTt2YXIgZz1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWcpZC5jaGlsZHJlbj1jO2Vsc2UgaWYoMTxnKXtmb3IodmFyIGY9QXJyYXkoZyksbT0wO208ZzttKyspZlttXT1hcmd1bWVudHNbbSsyXTtkLmNoaWxkcmVuPWZ9aWYoYSYmYS5kZWZhdWx0UHJvcHMpZm9yKGUgaW4gZz1hLmRlZmF1bHRQcm9wcyxnKXZvaWQgMD09PWRbZV0mJihkW2VdPWdbZV0pO3JldHVybnskJHR5cGVvZjpuLHR5cGU6YSxrZXk6ayxyZWY6aCxwcm9wczpkLF9vd25lcjpHLmN1cnJlbnR9fVxuZnVuY3Rpb24gSyhhLGIpe3JldHVybnskJHR5cGVvZjpuLHR5cGU6YS50eXBlLGtleTpiLHJlZjphLnJlZixwcm9wczphLnByb3BzLF9vd25lcjphLl9vd25lcn19ZnVuY3Rpb24gTChhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09bn1mdW5jdGlvbiBlc2NhcGUoYSl7dmFyIGI9e1wiPVwiOlwiPTBcIixcIjpcIjpcIj0yXCJ9O3JldHVyblwiJFwiK2EucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKGEpe3JldHVybiBiW2FdfSl9dmFyIE09L1xcLysvZztmdW5jdGlvbiBOKGEsYil7cmV0dXJuXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSYmbnVsbCE9YS5rZXk/ZXNjYXBlKFwiXCIrYS5rZXkpOmIudG9TdHJpbmcoMzYpfVxuZnVuY3Rpb24gTyhhLGIsYyxlLGQpe3ZhciBrPXR5cGVvZiBhO2lmKFwidW5kZWZpbmVkXCI9PT1rfHxcImJvb2xlYW5cIj09PWspYT1udWxsO3ZhciBoPSExO2lmKG51bGw9PT1hKWg9ITA7ZWxzZSBzd2l0Y2goayl7Y2FzZSBcInN0cmluZ1wiOmNhc2UgXCJudW1iZXJcIjpoPSEwO2JyZWFrO2Nhc2UgXCJvYmplY3RcIjpzd2l0Y2goYS4kJHR5cGVvZil7Y2FzZSBuOmNhc2UgcDpoPSEwfX1pZihoKXJldHVybiBoPWEsZD1kKGgpLGE9XCJcIj09PWU/XCIuXCIrTihoLDApOmUsQXJyYXkuaXNBcnJheShkKT8oYz1cIlwiLG51bGwhPWEmJihjPWEucmVwbGFjZShNLFwiJCYvXCIpK1wiL1wiKSxPKGQsYixjLFwiXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGF9KSk6bnVsbCE9ZCYmKEwoZCkmJihkPUsoZCxjKyghZC5rZXl8fGgmJmgua2V5PT09ZC5rZXk/XCJcIjooXCJcIitkLmtleSkucmVwbGFjZShNLFwiJCYvXCIpK1wiL1wiKSthKSksYi5wdXNoKGQpKSwxO2g9MDtlPVwiXCI9PT1lP1wiLlwiOmUrXCI6XCI7aWYoQXJyYXkuaXNBcnJheShhKSlmb3IodmFyIGc9XG4wO2c8YS5sZW5ndGg7ZysrKXtrPWFbZ107dmFyIGY9ZStOKGssZyk7aCs9TyhrLGIsYyxmLGQpfWVsc2UgaWYoZj15KGEpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBmKWZvcihhPWYuY2FsbChhKSxnPTA7IShrPWEubmV4dCgpKS5kb25lOylrPWsudmFsdWUsZj1lK04oayxnKyspLGgrPU8oayxiLGMsZixkKTtlbHNlIGlmKFwib2JqZWN0XCI9PT1rKXRocm93IGI9XCJcIithLEVycm9yKHooMzEsXCJbb2JqZWN0IE9iamVjdF1cIj09PWI/XCJvYmplY3Qgd2l0aCBrZXlzIHtcIitPYmplY3Qua2V5cyhhKS5qb2luKFwiLCBcIikrXCJ9XCI6YikpO3JldHVybiBofWZ1bmN0aW9uIFAoYSxiLGMpe2lmKG51bGw9PWEpcmV0dXJuIGE7dmFyIGU9W10sZD0wO08oYSxlLFwiXCIsXCJcIixmdW5jdGlvbihhKXtyZXR1cm4gYi5jYWxsKGMsYSxkKyspfSk7cmV0dXJuIGV9XG5mdW5jdGlvbiBRKGEpe2lmKC0xPT09YS5fc3RhdHVzKXt2YXIgYj1hLl9yZXN1bHQ7Yj1iKCk7YS5fc3RhdHVzPTA7YS5fcmVzdWx0PWI7Yi50aGVuKGZ1bmN0aW9uKGIpezA9PT1hLl9zdGF0dXMmJihiPWIuZGVmYXVsdCxhLl9zdGF0dXM9MSxhLl9yZXN1bHQ9Yil9LGZ1bmN0aW9uKGIpezA9PT1hLl9zdGF0dXMmJihhLl9zdGF0dXM9MixhLl9yZXN1bHQ9Yil9KX1pZigxPT09YS5fc3RhdHVzKXJldHVybiBhLl9yZXN1bHQ7dGhyb3cgYS5fcmVzdWx0O312YXIgUj17Y3VycmVudDpudWxsfTtmdW5jdGlvbiBTKCl7dmFyIGE9Ui5jdXJyZW50O2lmKG51bGw9PT1hKXRocm93IEVycm9yKHooMzIxKSk7cmV0dXJuIGF9dmFyIFQ9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6UixSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzp7dHJhbnNpdGlvbjowfSxSZWFjdEN1cnJlbnRPd25lcjpHLElzU29tZVJlbmRlcmVyQWN0aW5nOntjdXJyZW50OiExfSxhc3NpZ246bH07XG5leHBvcnRzLkNoaWxkcmVuPXttYXA6UCxmb3JFYWNoOmZ1bmN0aW9uKGEsYixjKXtQKGEsZnVuY3Rpb24oKXtiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYyl9LGNvdW50OmZ1bmN0aW9uKGEpe3ZhciBiPTA7UChhLGZ1bmN0aW9uKCl7YisrfSk7cmV0dXJuIGJ9LHRvQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIFAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYX0pfHxbXX0sb25seTpmdW5jdGlvbihhKXtpZighTChhKSl0aHJvdyBFcnJvcih6KDE0MykpO3JldHVybiBhfX07ZXhwb3J0cy5Db21wb25lbnQ9QztleHBvcnRzLlB1cmVDb21wb25lbnQ9RTtleHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPVQ7XG5leHBvcnRzLmNsb25lRWxlbWVudD1mdW5jdGlvbihhLGIsYyl7aWYobnVsbD09PWF8fHZvaWQgMD09PWEpdGhyb3cgRXJyb3IoeigyNjcsYSkpO3ZhciBlPWwoe30sYS5wcm9wcyksZD1hLmtleSxrPWEucmVmLGg9YS5fb3duZXI7aWYobnVsbCE9Yil7dm9pZCAwIT09Yi5yZWYmJihrPWIucmVmLGg9Ry5jdXJyZW50KTt2b2lkIDAhPT1iLmtleSYmKGQ9XCJcIitiLmtleSk7aWYoYS50eXBlJiZhLnR5cGUuZGVmYXVsdFByb3BzKXZhciBnPWEudHlwZS5kZWZhdWx0UHJvcHM7Zm9yKGYgaW4gYilILmNhbGwoYixmKSYmIUkuaGFzT3duUHJvcGVydHkoZikmJihlW2ZdPXZvaWQgMD09PWJbZl0mJnZvaWQgMCE9PWc/Z1tmXTpiW2ZdKX12YXIgZj1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWYpZS5jaGlsZHJlbj1jO2Vsc2UgaWYoMTxmKXtnPUFycmF5KGYpO2Zvcih2YXIgbT0wO208ZjttKyspZ1ttXT1hcmd1bWVudHNbbSsyXTtlLmNoaWxkcmVuPWd9cmV0dXJueyQkdHlwZW9mOm4sdHlwZTphLnR5cGUsXG5rZXk6ZCxyZWY6ayxwcm9wczplLF9vd25lcjpofX07ZXhwb3J0cy5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGEsYil7dm9pZCAwPT09YiYmKGI9bnVsbCk7YT17JCR0eXBlb2Y6cixfY2FsY3VsYXRlQ2hhbmdlZEJpdHM6YixfY3VycmVudFZhbHVlOmEsX2N1cnJlbnRWYWx1ZTI6YSxfdGhyZWFkQ291bnQ6MCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGx9O2EuUHJvdmlkZXI9eyQkdHlwZW9mOnEsX2NvbnRleHQ6YX07cmV0dXJuIGEuQ29uc3VtZXI9YX07ZXhwb3J0cy5jcmVhdGVFbGVtZW50PUo7ZXhwb3J0cy5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKGEpe3ZhciBiPUouYmluZChudWxsLGEpO2IudHlwZT1hO3JldHVybiBifTtleHBvcnRzLmNyZWF0ZVJlZj1mdW5jdGlvbigpe3JldHVybntjdXJyZW50Om51bGx9fTtleHBvcnRzLmZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJueyQkdHlwZW9mOnQscmVuZGVyOmF9fTtleHBvcnRzLmlzVmFsaWRFbGVtZW50PUw7XG5leHBvcnRzLmxhenk9ZnVuY3Rpb24oYSl7cmV0dXJueyQkdHlwZW9mOnYsX3BheWxvYWQ6e19zdGF0dXM6LTEsX3Jlc3VsdDphfSxfaW5pdDpRfX07ZXhwb3J0cy5tZW1vPWZ1bmN0aW9uKGEsYil7cmV0dXJueyQkdHlwZW9mOnUsdHlwZTphLGNvbXBhcmU6dm9pZCAwPT09Yj9udWxsOmJ9fTtleHBvcnRzLnVzZUNhbGxiYWNrPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFMoKS51c2VDYWxsYmFjayhhLGIpfTtleHBvcnRzLnVzZUNvbnRleHQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUygpLnVzZUNvbnRleHQoYSxiKX07ZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlPWZ1bmN0aW9uKCl7fTtleHBvcnRzLnVzZUVmZmVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBTKCkudXNlRWZmZWN0KGEsYil9O2V4cG9ydHMudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIFMoKS51c2VJbXBlcmF0aXZlSGFuZGxlKGEsYixjKX07XG5leHBvcnRzLnVzZUxheW91dEVmZmVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBTKCkudXNlTGF5b3V0RWZmZWN0KGEsYil9O2V4cG9ydHMudXNlTWVtbz1mdW5jdGlvbihhLGIpe3JldHVybiBTKCkudXNlTWVtbyhhLGIpfTtleHBvcnRzLnVzZVJlZHVjZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBTKCkudXNlUmVkdWNlcihhLGIsYyl9O2V4cG9ydHMudXNlUmVmPWZ1bmN0aW9uKGEpe3JldHVybiBTKCkudXNlUmVmKGEpfTtleHBvcnRzLnVzZVN0YXRlPWZ1bmN0aW9uKGEpe3JldHVybiBTKCkudXNlU3RhdGUoYSl9O2V4cG9ydHMudmVyc2lvbj1cIjE3LjAuMlwiO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjAuMjAuMlxuICogc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbid1c2Ugc3RyaWN0Jzt2YXIgZixnLGgsaztpZihcIm9iamVjdFwiPT09dHlwZW9mIHBlcmZvcm1hbmNlJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgcGVyZm9ybWFuY2Uubm93KXt2YXIgbD1wZXJmb3JtYW5jZTtleHBvcnRzLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBsLm5vdygpfX1lbHNle3ZhciBwPURhdGUscT1wLm5vdygpO2V4cG9ydHMudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHAubm93KCktcX19XG5pZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvd3x8XCJmdW5jdGlvblwiIT09dHlwZW9mIE1lc3NhZ2VDaGFubmVsKXt2YXIgdD1udWxsLHU9bnVsbCx3PWZ1bmN0aW9uKCl7aWYobnVsbCE9PXQpdHJ5e3ZhciBhPWV4cG9ydHMudW5zdGFibGVfbm93KCk7dCghMCxhKTt0PW51bGx9Y2F0Y2goYil7dGhyb3cgc2V0VGltZW91dCh3LDApLGI7fX07Zj1mdW5jdGlvbihhKXtudWxsIT09dD9zZXRUaW1lb3V0KGYsMCxhKToodD1hLHNldFRpbWVvdXQodywwKSl9O2c9ZnVuY3Rpb24oYSxiKXt1PXNldFRpbWVvdXQoYSxiKX07aD1mdW5jdGlvbigpe2NsZWFyVGltZW91dCh1KX07ZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZD1mdW5jdGlvbigpe3JldHVybiExfTtrPWV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oKXt9fWVsc2V7dmFyIHg9d2luZG93LnNldFRpbWVvdXQseT13aW5kb3cuY2xlYXJUaW1lb3V0O2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgY29uc29sZSl7dmFyIHo9XG53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU7XCJmdW5jdGlvblwiIT09dHlwZW9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJmNvbnNvbGUuZXJyb3IoXCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHJlcXVlc3RBbmltYXRpb25GcmFtZS4gTWFrZSBzdXJlIHRoYXQgeW91IGxvYWQgYSBwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxsc1wiKTtcImZ1bmN0aW9uXCIhPT10eXBlb2YgeiYmY29uc29sZS5lcnJvcihcIlRoaXMgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgY2FuY2VsQW5pbWF0aW9uRnJhbWUuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgcG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHNcIil9dmFyIEE9ITEsQj1udWxsLEM9LTEsRD01LEU9MDtleHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkPWZ1bmN0aW9uKCl7cmV0dXJuIGV4cG9ydHMudW5zdGFibGVfbm93KCk+PVxuRX07az1mdW5jdGlvbigpe307ZXhwb3J0cy51bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZT1mdW5jdGlvbihhKXswPmF8fDEyNTxhP2NvbnNvbGUuZXJyb3IoXCJmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWRcIik6RD0wPGE/TWF0aC5mbG9vcigxRTMvYSk6NX07dmFyIEY9bmV3IE1lc3NhZ2VDaGFubmVsLEc9Ri5wb3J0MjtGLnBvcnQxLm9ubWVzc2FnZT1mdW5jdGlvbigpe2lmKG51bGwhPT1CKXt2YXIgYT1leHBvcnRzLnVuc3RhYmxlX25vdygpO0U9YStEO3RyeXtCKCEwLGEpP0cucG9zdE1lc3NhZ2UobnVsbCk6KEE9ITEsQj1udWxsKX1jYXRjaChiKXt0aHJvdyBHLnBvc3RNZXNzYWdlKG51bGwpLGI7fX1lbHNlIEE9ITF9O2Y9ZnVuY3Rpb24oYSl7Qj1hO0F8fChBPSEwLEcucG9zdE1lc3NhZ2UobnVsbCkpfTtnPWZ1bmN0aW9uKGEsYil7Qz1cbngoZnVuY3Rpb24oKXthKGV4cG9ydHMudW5zdGFibGVfbm93KCkpfSxiKX07aD1mdW5jdGlvbigpe3koQyk7Qz0tMX19ZnVuY3Rpb24gSChhLGIpe3ZhciBjPWEubGVuZ3RoO2EucHVzaChiKTthOmZvcig7Oyl7dmFyIGQ9Yy0xPj4+MSxlPWFbZF07aWYodm9pZCAwIT09ZSYmMDxJKGUsYikpYVtkXT1iLGFbY109ZSxjPWQ7ZWxzZSBicmVhayBhfX1mdW5jdGlvbiBKKGEpe2E9YVswXTtyZXR1cm4gdm9pZCAwPT09YT9udWxsOmF9XG5mdW5jdGlvbiBLKGEpe3ZhciBiPWFbMF07aWYodm9pZCAwIT09Yil7dmFyIGM9YS5wb3AoKTtpZihjIT09Yil7YVswXT1jO2E6Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7KXt2YXIgbT0yKihkKzEpLTEsbj1hW21dLHY9bSsxLHI9YVt2XTtpZih2b2lkIDAhPT1uJiYwPkkobixjKSl2b2lkIDAhPT1yJiYwPkkocixuKT8oYVtkXT1yLGFbdl09YyxkPXYpOihhW2RdPW4sYVttXT1jLGQ9bSk7ZWxzZSBpZih2b2lkIDAhPT1yJiYwPkkocixjKSlhW2RdPXIsYVt2XT1jLGQ9djtlbHNlIGJyZWFrIGF9fXJldHVybiBifXJldHVybiBudWxsfWZ1bmN0aW9uIEkoYSxiKXt2YXIgYz1hLnNvcnRJbmRleC1iLnNvcnRJbmRleDtyZXR1cm4gMCE9PWM/YzphLmlkLWIuaWR9dmFyIEw9W10sTT1bXSxOPTEsTz1udWxsLFA9MyxRPSExLFI9ITEsUz0hMTtcbmZ1bmN0aW9uIFQoYSl7Zm9yKHZhciBiPUooTSk7bnVsbCE9PWI7KXtpZihudWxsPT09Yi5jYWxsYmFjaylLKE0pO2Vsc2UgaWYoYi5zdGFydFRpbWU8PWEpSyhNKSxiLnNvcnRJbmRleD1iLmV4cGlyYXRpb25UaW1lLEgoTCxiKTtlbHNlIGJyZWFrO2I9SihNKX19ZnVuY3Rpb24gVShhKXtTPSExO1QoYSk7aWYoIVIpaWYobnVsbCE9PUooTCkpUj0hMCxmKFYpO2Vsc2V7dmFyIGI9SihNKTtudWxsIT09YiYmZyhVLGIuc3RhcnRUaW1lLWEpfX1cbmZ1bmN0aW9uIFYoYSxiKXtSPSExO1MmJihTPSExLGgoKSk7UT0hMDt2YXIgYz1QO3RyeXtUKGIpO2ZvcihPPUooTCk7bnVsbCE9PU8mJighKE8uZXhwaXJhdGlvblRpbWU+Yil8fGEmJiFleHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkKCkpOyl7dmFyIGQ9Ty5jYWxsYmFjaztpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZCl7Ty5jYWxsYmFjaz1udWxsO1A9Ty5wcmlvcml0eUxldmVsO3ZhciBlPWQoTy5leHBpcmF0aW9uVGltZTw9Yik7Yj1leHBvcnRzLnVuc3RhYmxlX25vdygpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBlP08uY2FsbGJhY2s9ZTpPPT09SihMKSYmSyhMKTtUKGIpfWVsc2UgSyhMKTtPPUooTCl9aWYobnVsbCE9PU8pdmFyIG09ITA7ZWxzZXt2YXIgbj1KKE0pO251bGwhPT1uJiZnKFUsbi5zdGFydFRpbWUtYik7bT0hMX1yZXR1cm4gbX1maW5hbGx5e089bnVsbCxQPWMsUT0hMX19dmFyIFc9aztleHBvcnRzLnVuc3RhYmxlX0lkbGVQcmlvcml0eT01O1xuZXhwb3J0cy51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eT0xO2V4cG9ydHMudW5zdGFibGVfTG93UHJpb3JpdHk9NDtleHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5PTM7ZXhwb3J0cy51bnN0YWJsZV9Qcm9maWxpbmc9bnVsbDtleHBvcnRzLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5PTI7ZXhwb3J0cy51bnN0YWJsZV9jYW5jZWxDYWxsYmFjaz1mdW5jdGlvbihhKXthLmNhbGxiYWNrPW51bGx9O2V4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb249ZnVuY3Rpb24oKXtSfHxRfHwoUj0hMCxmKFYpKX07ZXhwb3J0cy51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbD1mdW5jdGlvbigpe3JldHVybiBQfTtleHBvcnRzLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIEooTCl9O1xuZXhwb3J0cy51bnN0YWJsZV9uZXh0PWZ1bmN0aW9uKGEpe3N3aXRjaChQKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgYj0zO2JyZWFrO2RlZmF1bHQ6Yj1QfXZhciBjPVA7UD1iO3RyeXtyZXR1cm4gYSgpfWZpbmFsbHl7UD1jfX07ZXhwb3J0cy51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbj1mdW5jdGlvbigpe307ZXhwb3J0cy51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ9VztleHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihhLGIpe3N3aXRjaChhKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6YT0zfXZhciBjPVA7UD1hO3RyeXtyZXR1cm4gYigpfWZpbmFsbHl7UD1jfX07XG5leHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWV4cG9ydHMudW5zdGFibGVfbm93KCk7XCJvYmplY3RcIj09PXR5cGVvZiBjJiZudWxsIT09Yz8oYz1jLmRlbGF5LGM9XCJudW1iZXJcIj09PXR5cGVvZiBjJiYwPGM/ZCtjOmQpOmM9ZDtzd2l0Y2goYSl7Y2FzZSAxOnZhciBlPS0xO2JyZWFrO2Nhc2UgMjplPTI1MDticmVhaztjYXNlIDU6ZT0xMDczNzQxODIzO2JyZWFrO2Nhc2UgNDplPTFFNDticmVhaztkZWZhdWx0OmU9NUUzfWU9YytlO2E9e2lkOk4rKyxjYWxsYmFjazpiLHByaW9yaXR5TGV2ZWw6YSxzdGFydFRpbWU6YyxleHBpcmF0aW9uVGltZTplLHNvcnRJbmRleDotMX07Yz5kPyhhLnNvcnRJbmRleD1jLEgoTSxhKSxudWxsPT09SihMKSYmYT09PUooTSkmJihTP2goKTpTPSEwLGcoVSxjLWQpKSk6KGEuc29ydEluZGV4PWUsSChMLGEpLFJ8fFF8fChSPSEwLGYoVikpKTtyZXR1cm4gYX07XG5leHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjaz1mdW5jdGlvbihhKXt2YXIgYj1QO3JldHVybiBmdW5jdGlvbigpe3ZhciBjPVA7UD1iO3RyeXtyZXR1cm4gYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtQPWN9fX07XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNy4wLjJcbiAqIHJlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG4vKlxuIE1vZGVybml6ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxkKSB8IE1JVFxuKi9cbid1c2Ugc3RyaWN0Jzt2YXIgYWE9cmVxdWlyZShcInJlYWN0XCIpLG09cmVxdWlyZShcIm9iamVjdC1hc3NpZ25cIikscj1yZXF1aXJlKFwic2NoZWR1bGVyXCIpO2Z1bmN0aW9uIHkoYSl7Zm9yKHZhciBiPVwiaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9XCIrYSxjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyliKz1cIiZhcmdzW109XCIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tjXSk7cmV0dXJuXCJNaW5pZmllZCBSZWFjdCBlcnJvciAjXCIrYStcIjsgdmlzaXQgXCIrYitcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuXCJ9aWYoIWFhKXRocm93IEVycm9yKHkoMjI3KSk7dmFyIGJhPW5ldyBTZXQsY2E9e307ZnVuY3Rpb24gZGEoYSxiKXtlYShhLGIpO2VhKGErXCJDYXB0dXJlXCIsYil9XG5mdW5jdGlvbiBlYShhLGIpe2NhW2FdPWI7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliYS5hZGQoYlthXSl9XG52YXIgZmE9IShcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvd3x8XCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3cuZG9jdW1lbnR8fFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpLGhhPS9eWzpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXVs6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRFxcLS4wLTlcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwXSokLyxpYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxuamE9e30sa2E9e307ZnVuY3Rpb24gbGEoYSl7aWYoaWEuY2FsbChrYSxhKSlyZXR1cm4hMDtpZihpYS5jYWxsKGphLGEpKXJldHVybiExO2lmKGhhLnRlc3QoYSkpcmV0dXJuIGthW2FdPSEwO2phW2FdPSEwO3JldHVybiExfWZ1bmN0aW9uIG1hKGEsYixjLGQpe2lmKG51bGwhPT1jJiYwPT09Yy50eXBlKXJldHVybiExO3N3aXRjaCh0eXBlb2YgYil7Y2FzZSBcImZ1bmN0aW9uXCI6Y2FzZSBcInN5bWJvbFwiOnJldHVybiEwO2Nhc2UgXCJib29sZWFuXCI6aWYoZClyZXR1cm4hMTtpZihudWxsIT09YylyZXR1cm4hYy5hY2NlcHRzQm9vbGVhbnM7YT1hLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCw1KTtyZXR1cm5cImRhdGEtXCIhPT1hJiZcImFyaWEtXCIhPT1hO2RlZmF1bHQ6cmV0dXJuITF9fVxuZnVuY3Rpb24gbmEoYSxiLGMsZCl7aWYobnVsbD09PWJ8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYnx8bWEoYSxiLGMsZCkpcmV0dXJuITA7aWYoZClyZXR1cm4hMTtpZihudWxsIT09Yylzd2l0Y2goYy50eXBlKXtjYXNlIDM6cmV0dXJuIWI7Y2FzZSA0OnJldHVybiExPT09YjtjYXNlIDU6cmV0dXJuIGlzTmFOKGIpO2Nhc2UgNjpyZXR1cm4gaXNOYU4oYil8fDE+Yn1yZXR1cm4hMX1mdW5jdGlvbiBCKGEsYixjLGQsZSxmLGcpe3RoaXMuYWNjZXB0c0Jvb2xlYW5zPTI9PT1ifHwzPT09Ynx8ND09PWI7dGhpcy5hdHRyaWJ1dGVOYW1lPWQ7dGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2U9ZTt0aGlzLm11c3RVc2VQcm9wZXJ0eT1jO3RoaXMucHJvcGVydHlOYW1lPWE7dGhpcy50eXBlPWI7dGhpcy5zYW5pdGl6ZVVSTD1mO3RoaXMucmVtb3ZlRW1wdHlTdHJpbmc9Z312YXIgRD17fTtcblwiY2hpbGRyZW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgZGVmYXVsdFZhbHVlIGRlZmF1bHRDaGVja2VkIGlubmVySFRNTCBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHN0eWxlXCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7RFthXT1uZXcgQihhLDAsITEsYSxudWxsLCExLCExKX0pO1tbXCJhY2NlcHRDaGFyc2V0XCIsXCJhY2NlcHQtY2hhcnNldFwiXSxbXCJjbGFzc05hbWVcIixcImNsYXNzXCJdLFtcImh0bWxGb3JcIixcImZvclwiXSxbXCJodHRwRXF1aXZcIixcImh0dHAtZXF1aXZcIl1dLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YVswXTtEW2JdPW5ldyBCKGIsMSwhMSxhWzFdLG51bGwsITEsITEpfSk7W1wiY29udGVudEVkaXRhYmxlXCIsXCJkcmFnZ2FibGVcIixcInNwZWxsQ2hlY2tcIixcInZhbHVlXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7RFthXT1uZXcgQihhLDIsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7XG5bXCJhdXRvUmV2ZXJzZVwiLFwiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFwiLFwiZm9jdXNhYmxlXCIsXCJwcmVzZXJ2ZUFscGhhXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7RFthXT1uZXcgQihhLDIsITEsYSxudWxsLCExLCExKX0pO1wiYWxsb3dGdWxsU2NyZWVuIGFzeW5jIGF1dG9Gb2N1cyBhdXRvUGxheSBjb250cm9scyBkZWZhdWx0IGRlZmVyIGRpc2FibGVkIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIGRpc2FibGVSZW1vdGVQbGF5YmFjayBmb3JtTm9WYWxpZGF0ZSBoaWRkZW4gbG9vcCBub01vZHVsZSBub1ZhbGlkYXRlIG9wZW4gcGxheXNJbmxpbmUgcmVhZE9ubHkgcmVxdWlyZWQgcmV2ZXJzZWQgc2NvcGVkIHNlYW1sZXNzIGl0ZW1TY29wZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwzLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuW1wiY2hlY2tlZFwiLFwibXVsdGlwbGVcIixcIm11dGVkXCIsXCJzZWxlY3RlZFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSwzLCEwLGEsbnVsbCwhMSwhMSl9KTtbXCJjYXB0dXJlXCIsXCJkb3dubG9hZFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0RbYV09bmV3IEIoYSw0LCExLGEsbnVsbCwhMSwhMSl9KTtbXCJjb2xzXCIsXCJyb3dzXCIsXCJzaXplXCIsXCJzcGFuXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7RFthXT1uZXcgQihhLDYsITEsYSxudWxsLCExLCExKX0pO1tcInJvd1NwYW5cIixcInN0YXJ0XCJdLmZvckVhY2goZnVuY3Rpb24oYSl7RFthXT1uZXcgQihhLDUsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7dmFyIG9hPS9bXFwtOl0oW2Etel0pL2c7ZnVuY3Rpb24gcGEoYSl7cmV0dXJuIGFbMV0udG9VcHBlckNhc2UoKX1cblwiYWNjZW50LWhlaWdodCBhbGlnbm1lbnQtYmFzZWxpbmUgYXJhYmljLWZvcm0gYmFzZWxpbmUtc2hpZnQgY2FwLWhlaWdodCBjbGlwLXBhdGggY2xpcC1ydWxlIGNvbG9yLWludGVycG9sYXRpb24gY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIGNvbG9yLXByb2ZpbGUgY29sb3ItcmVuZGVyaW5nIGRvbWluYW50LWJhc2VsaW5lIGVuYWJsZS1iYWNrZ3JvdW5kIGZpbGwtb3BhY2l0eSBmaWxsLXJ1bGUgZmxvb2QtY29sb3IgZmxvb2Qtb3BhY2l0eSBmb250LWZhbWlseSBmb250LXNpemUgZm9udC1zaXplLWFkanVzdCBmb250LXN0cmV0Y2ggZm9udC1zdHlsZSBmb250LXZhcmlhbnQgZm9udC13ZWlnaHQgZ2x5cGgtbmFtZSBnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIGdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIGhvcml6LWFkdi14IGhvcml6LW9yaWdpbi14IGltYWdlLXJlbmRlcmluZyBsZXR0ZXItc3BhY2luZyBsaWdodGluZy1jb2xvciBtYXJrZXItZW5kIG1hcmtlci1taWQgbWFya2VyLXN0YXJ0IG92ZXJsaW5lLXBvc2l0aW9uIG92ZXJsaW5lLXRoaWNrbmVzcyBwYWludC1vcmRlciBwYW5vc2UtMSBwb2ludGVyLWV2ZW50cyByZW5kZXJpbmctaW50ZW50IHNoYXBlLXJlbmRlcmluZyBzdG9wLWNvbG9yIHN0b3Atb3BhY2l0eSBzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIHN0cm9rZS1kYXNoYXJyYXkgc3Ryb2tlLWRhc2hvZmZzZXQgc3Ryb2tlLWxpbmVjYXAgc3Ryb2tlLWxpbmVqb2luIHN0cm9rZS1taXRlcmxpbWl0IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCB0ZXh0LWFuY2hvciB0ZXh0LWRlY29yYXRpb24gdGV4dC1yZW5kZXJpbmcgdW5kZXJsaW5lLXBvc2l0aW9uIHVuZGVybGluZS10aGlja25lc3MgdW5pY29kZS1iaWRpIHVuaWNvZGUtcmFuZ2UgdW5pdHMtcGVyLWVtIHYtYWxwaGFiZXRpYyB2LWhhbmdpbmcgdi1pZGVvZ3JhcGhpYyB2LW1hdGhlbWF0aWNhbCB2ZWN0b3ItZWZmZWN0IHZlcnQtYWR2LXkgdmVydC1vcmlnaW4teCB2ZXJ0LW9yaWdpbi15IHdvcmQtc3BhY2luZyB3cml0aW5nLW1vZGUgeG1sbnM6eGxpbmsgeC1oZWlnaHRcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2Uob2EsXG5wYSk7RFtiXT1uZXcgQihiLDEsITEsYSxudWxsLCExLCExKX0pO1wieGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOnJvbGUgeGxpbms6c2hvdyB4bGluazp0aXRsZSB4bGluazp0eXBlXCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKG9hLHBhKTtEW2JdPW5ldyBCKGIsMSwhMSxhLFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCExLCExKX0pO1tcInhtbDpiYXNlXCIsXCJ4bWw6bGFuZ1wiLFwieG1sOnNwYWNlXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKG9hLHBhKTtEW2JdPW5ldyBCKGIsMSwhMSxhLFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsITEsITEpfSk7W1widGFiSW5kZXhcIixcImNyb3NzT3JpZ2luXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7RFthXT1uZXcgQihhLDEsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7XG5ELnhsaW5rSHJlZj1uZXcgQihcInhsaW5rSHJlZlwiLDEsITEsXCJ4bGluazpocmVmXCIsXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsITAsITEpO1tcInNyY1wiLFwiaHJlZlwiLFwiYWN0aW9uXCIsXCJmb3JtQWN0aW9uXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7RFthXT1uZXcgQihhLDEsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITAsITApfSk7XG5mdW5jdGlvbiBxYShhLGIsYyxkKXt2YXIgZT1ELmhhc093blByb3BlcnR5KGIpP0RbYl06bnVsbDt2YXIgZj1udWxsIT09ZT8wPT09ZS50eXBlOmQ/ITE6ISgyPGIubGVuZ3RoKXx8XCJvXCIhPT1iWzBdJiZcIk9cIiE9PWJbMF18fFwiblwiIT09YlsxXSYmXCJOXCIhPT1iWzFdPyExOiEwO2Z8fChuYShiLGMsZSxkKSYmKGM9bnVsbCksZHx8bnVsbD09PWU/bGEoYikmJihudWxsPT09Yz9hLnJlbW92ZUF0dHJpYnV0ZShiKTphLnNldEF0dHJpYnV0ZShiLFwiXCIrYykpOmUubXVzdFVzZVByb3BlcnR5P2FbZS5wcm9wZXJ0eU5hbWVdPW51bGw9PT1jPzM9PT1lLnR5cGU/ITE6XCJcIjpjOihiPWUuYXR0cmlidXRlTmFtZSxkPWUuYXR0cmlidXRlTmFtZXNwYWNlLG51bGw9PT1jP2EucmVtb3ZlQXR0cmlidXRlKGIpOihlPWUudHlwZSxjPTM9PT1lfHw0PT09ZSYmITA9PT1jP1wiXCI6XCJcIitjLGQ/YS5zZXRBdHRyaWJ1dGVOUyhkLGIsYyk6YS5zZXRBdHRyaWJ1dGUoYixjKSkpKX1cbnZhciByYT1hYS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCxzYT02MDEwMyx0YT02MDEwNix1YT02MDEwNyx3YT02MDEwOCx4YT02MDExNCx5YT02MDEwOSx6YT02MDExMCxBYT02MDExMixCYT02MDExMyxDYT02MDEyMCxEYT02MDExNSxFYT02MDExNixGYT02MDEyMSxHYT02MDEyOCxIYT02MDEyOSxJYT02MDEzMCxKYT02MDEzMTtcbmlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5mb3Ipe3ZhciBFPVN5bWJvbC5mb3I7c2E9RShcInJlYWN0LmVsZW1lbnRcIik7dGE9RShcInJlYWN0LnBvcnRhbFwiKTt1YT1FKFwicmVhY3QuZnJhZ21lbnRcIik7d2E9RShcInJlYWN0LnN0cmljdF9tb2RlXCIpO3hhPUUoXCJyZWFjdC5wcm9maWxlclwiKTt5YT1FKFwicmVhY3QucHJvdmlkZXJcIik7emE9RShcInJlYWN0LmNvbnRleHRcIik7QWE9RShcInJlYWN0LmZvcndhcmRfcmVmXCIpO0JhPUUoXCJyZWFjdC5zdXNwZW5zZVwiKTtDYT1FKFwicmVhY3Quc3VzcGVuc2VfbGlzdFwiKTtEYT1FKFwicmVhY3QubWVtb1wiKTtFYT1FKFwicmVhY3QubGF6eVwiKTtGYT1FKFwicmVhY3QuYmxvY2tcIik7RShcInJlYWN0LnNjb3BlXCIpO0dhPUUoXCJyZWFjdC5vcGFxdWUuaWRcIik7SGE9RShcInJlYWN0LmRlYnVnX3RyYWNlX21vZGVcIik7SWE9RShcInJlYWN0Lm9mZnNjcmVlblwiKTtKYT1FKFwicmVhY3QubGVnYWN5X2hpZGRlblwiKX1cbnZhciBLYT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7ZnVuY3Rpb24gTGEoYSl7aWYobnVsbD09PWF8fFwib2JqZWN0XCIhPT10eXBlb2YgYSlyZXR1cm4gbnVsbDthPUthJiZhW0thXXx8YVtcIkBAaXRlcmF0b3JcIl07cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGE/YTpudWxsfXZhciBNYTtmdW5jdGlvbiBOYShhKXtpZih2b2lkIDA9PT1NYSl0cnl7dGhyb3cgRXJyb3IoKTt9Y2F0Y2goYyl7dmFyIGI9Yy5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtNYT1iJiZiWzFdfHxcIlwifXJldHVyblwiXFxuXCIrTWErYX12YXIgT2E9ITE7XG5mdW5jdGlvbiBQYShhLGIpe2lmKCFhfHxPYSlyZXR1cm5cIlwiO09hPSEwO3ZhciBjPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO0Vycm9yLnByZXBhcmVTdGFja1RyYWNlPXZvaWQgMDt0cnl7aWYoYilpZihiPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKTt9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLnByb3RvdHlwZSxcInByb3BzXCIse3NldDpmdW5jdGlvbigpe3Rocm93IEVycm9yKCk7fX0pLFwib2JqZWN0XCI9PT10eXBlb2YgUmVmbGVjdCYmUmVmbGVjdC5jb25zdHJ1Y3Qpe3RyeXtSZWZsZWN0LmNvbnN0cnVjdChiLFtdKX1jYXRjaChrKXt2YXIgZD1rfVJlZmxlY3QuY29uc3RydWN0KGEsW10sYil9ZWxzZXt0cnl7Yi5jYWxsKCl9Y2F0Y2goayl7ZD1rfWEuY2FsbChiLnByb3RvdHlwZSl9ZWxzZXt0cnl7dGhyb3cgRXJyb3IoKTt9Y2F0Y2goayl7ZD1rfWEoKX19Y2F0Y2goayl7aWYoayYmZCYmXCJzdHJpbmdcIj09PXR5cGVvZiBrLnN0YWNrKXtmb3IodmFyIGU9ay5zdGFjay5zcGxpdChcIlxcblwiKSxcbmY9ZC5zdGFjay5zcGxpdChcIlxcblwiKSxnPWUubGVuZ3RoLTEsaD1mLmxlbmd0aC0xOzE8PWcmJjA8PWgmJmVbZ10hPT1mW2hdOyloLS07Zm9yKDsxPD1nJiYwPD1oO2ctLSxoLS0paWYoZVtnXSE9PWZbaF0pe2lmKDEhPT1nfHwxIT09aCl7ZG8gaWYoZy0tLGgtLSwwPmh8fGVbZ10hPT1mW2hdKXJldHVyblwiXFxuXCIrZVtnXS5yZXBsYWNlKFwiIGF0IG5ldyBcIixcIiBhdCBcIik7d2hpbGUoMTw9ZyYmMDw9aCl9YnJlYWt9fX1maW5hbGx5e09hPSExLEVycm9yLnByZXBhcmVTdGFja1RyYWNlPWN9cmV0dXJuKGE9YT9hLmRpc3BsYXlOYW1lfHxhLm5hbWU6XCJcIik/TmEoYSk6XCJcIn1cbmZ1bmN0aW9uIFFhKGEpe3N3aXRjaChhLnRhZyl7Y2FzZSA1OnJldHVybiBOYShhLnR5cGUpO2Nhc2UgMTY6cmV0dXJuIE5hKFwiTGF6eVwiKTtjYXNlIDEzOnJldHVybiBOYShcIlN1c3BlbnNlXCIpO2Nhc2UgMTk6cmV0dXJuIE5hKFwiU3VzcGVuc2VMaXN0XCIpO2Nhc2UgMDpjYXNlIDI6Y2FzZSAxNTpyZXR1cm4gYT1QYShhLnR5cGUsITEpLGE7Y2FzZSAxMTpyZXR1cm4gYT1QYShhLnR5cGUucmVuZGVyLCExKSxhO2Nhc2UgMjI6cmV0dXJuIGE9UGEoYS50eXBlLl9yZW5kZXIsITEpLGE7Y2FzZSAxOnJldHVybiBhPVBhKGEudHlwZSwhMCksYTtkZWZhdWx0OnJldHVyblwiXCJ9fVxuZnVuY3Rpb24gUmEoYSl7aWYobnVsbD09YSlyZXR1cm4gbnVsbDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlyZXR1cm4gYS5kaXNwbGF5TmFtZXx8YS5uYW1lfHxudWxsO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlyZXR1cm4gYTtzd2l0Y2goYSl7Y2FzZSB1YTpyZXR1cm5cIkZyYWdtZW50XCI7Y2FzZSB0YTpyZXR1cm5cIlBvcnRhbFwiO2Nhc2UgeGE6cmV0dXJuXCJQcm9maWxlclwiO2Nhc2Ugd2E6cmV0dXJuXCJTdHJpY3RNb2RlXCI7Y2FzZSBCYTpyZXR1cm5cIlN1c3BlbnNlXCI7Y2FzZSBDYTpyZXR1cm5cIlN1c3BlbnNlTGlzdFwifWlmKFwib2JqZWN0XCI9PT10eXBlb2YgYSlzd2l0Y2goYS4kJHR5cGVvZil7Y2FzZSB6YTpyZXR1cm4oYS5kaXNwbGF5TmFtZXx8XCJDb250ZXh0XCIpK1wiLkNvbnN1bWVyXCI7Y2FzZSB5YTpyZXR1cm4oYS5fY29udGV4dC5kaXNwbGF5TmFtZXx8XCJDb250ZXh0XCIpK1wiLlByb3ZpZGVyXCI7Y2FzZSBBYTp2YXIgYj1hLnJlbmRlcjtiPWIuZGlzcGxheU5hbWV8fGIubmFtZXx8XCJcIjtcbnJldHVybiBhLmRpc3BsYXlOYW1lfHwoXCJcIiE9PWI/XCJGb3J3YXJkUmVmKFwiK2IrXCIpXCI6XCJGb3J3YXJkUmVmXCIpO2Nhc2UgRGE6cmV0dXJuIFJhKGEudHlwZSk7Y2FzZSBGYTpyZXR1cm4gUmEoYS5fcmVuZGVyKTtjYXNlIEVhOmI9YS5fcGF5bG9hZDthPWEuX2luaXQ7dHJ5e3JldHVybiBSYShhKGIpKX1jYXRjaChjKXt9fXJldHVybiBudWxsfWZ1bmN0aW9uIFNhKGEpe3N3aXRjaCh0eXBlb2YgYSl7Y2FzZSBcImJvb2xlYW5cIjpjYXNlIFwibnVtYmVyXCI6Y2FzZSBcIm9iamVjdFwiOmNhc2UgXCJzdHJpbmdcIjpjYXNlIFwidW5kZWZpbmVkXCI6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm5cIlwifX1mdW5jdGlvbiBUYShhKXt2YXIgYj1hLnR5cGU7cmV0dXJuKGE9YS5ub2RlTmFtZSkmJlwiaW5wdXRcIj09PWEudG9Mb3dlckNhc2UoKSYmKFwiY2hlY2tib3hcIj09PWJ8fFwicmFkaW9cIj09PWIpfVxuZnVuY3Rpb24gVWEoYSl7dmFyIGI9VGEoYSk/XCJjaGVja2VkXCI6XCJ2YWx1ZVwiLGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSxiKSxkPVwiXCIrYVtiXTtpZighYS5oYXNPd25Qcm9wZXJ0eShiKSYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy5nZXQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBjLnNldCl7dmFyIGU9Yy5nZXQsZj1jLnNldDtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzKX0sc2V0OmZ1bmN0aW9uKGEpe2Q9XCJcIithO2YuY2FsbCh0aGlzLGEpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2VudW1lcmFibGU6Yy5lbnVtZXJhYmxlfSk7cmV0dXJue2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGR9LHNldFZhbHVlOmZ1bmN0aW9uKGEpe2Q9XCJcIithfSxzdG9wVHJhY2tpbmc6ZnVuY3Rpb24oKXthLl92YWx1ZVRyYWNrZXI9XG5udWxsO2RlbGV0ZSBhW2JdfX19fWZ1bmN0aW9uIFZhKGEpe2EuX3ZhbHVlVHJhY2tlcnx8KGEuX3ZhbHVlVHJhY2tlcj1VYShhKSl9ZnVuY3Rpb24gV2EoYSl7aWYoIWEpcmV0dXJuITE7dmFyIGI9YS5fdmFsdWVUcmFja2VyO2lmKCFiKXJldHVybiEwO3ZhciBjPWIuZ2V0VmFsdWUoKTt2YXIgZD1cIlwiO2EmJihkPVRhKGEpP2EuY2hlY2tlZD9cInRydWVcIjpcImZhbHNlXCI6YS52YWx1ZSk7YT1kO3JldHVybiBhIT09Yz8oYi5zZXRWYWx1ZShhKSwhMCk6ITF9ZnVuY3Rpb24gWGEoYSl7YT1hfHwoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudDp2b2lkIDApO2lmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGEuYWN0aXZlRWxlbWVudHx8YS5ib2R5fWNhdGNoKGIpe3JldHVybiBhLmJvZHl9fVxuZnVuY3Rpb24gWWEoYSxiKXt2YXIgYz1iLmNoZWNrZWQ7cmV0dXJuIG0oe30sYix7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoZWNrZWQ6bnVsbCE9Yz9jOmEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZH0pfWZ1bmN0aW9uIFphKGEsYil7dmFyIGM9bnVsbD09Yi5kZWZhdWx0VmFsdWU/XCJcIjpiLmRlZmF1bHRWYWx1ZSxkPW51bGwhPWIuY2hlY2tlZD9iLmNoZWNrZWQ6Yi5kZWZhdWx0Q2hlY2tlZDtjPVNhKG51bGwhPWIudmFsdWU/Yi52YWx1ZTpjKTthLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOmQsaW5pdGlhbFZhbHVlOmMsY29udHJvbGxlZDpcImNoZWNrYm94XCI9PT1iLnR5cGV8fFwicmFkaW9cIj09PWIudHlwZT9udWxsIT1iLmNoZWNrZWQ6bnVsbCE9Yi52YWx1ZX19ZnVuY3Rpb24gJGEoYSxiKXtiPWIuY2hlY2tlZDtudWxsIT1iJiZxYShhLFwiY2hlY2tlZFwiLGIsITEpfVxuZnVuY3Rpb24gYWIoYSxiKXskYShhLGIpO3ZhciBjPVNhKGIudmFsdWUpLGQ9Yi50eXBlO2lmKG51bGwhPWMpaWYoXCJudW1iZXJcIj09PWQpe2lmKDA9PT1jJiZcIlwiPT09YS52YWx1ZXx8YS52YWx1ZSE9YylhLnZhbHVlPVwiXCIrY31lbHNlIGEudmFsdWUhPT1cIlwiK2MmJihhLnZhbHVlPVwiXCIrYyk7ZWxzZSBpZihcInN1Ym1pdFwiPT09ZHx8XCJyZXNldFwiPT09ZCl7YS5yZW1vdmVBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtyZXR1cm59Yi5oYXNPd25Qcm9wZXJ0eShcInZhbHVlXCIpP2JiKGEsYi50eXBlLGMpOmIuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0VmFsdWVcIikmJmJiKGEsYi50eXBlLFNhKGIuZGVmYXVsdFZhbHVlKSk7bnVsbD09Yi5jaGVja2VkJiZudWxsIT1iLmRlZmF1bHRDaGVja2VkJiYoYS5kZWZhdWx0Q2hlY2tlZD0hIWIuZGVmYXVsdENoZWNrZWQpfVxuZnVuY3Rpb24gY2IoYSxiLGMpe2lmKGIuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKXx8Yi5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSl7dmFyIGQ9Yi50eXBlO2lmKCEoXCJzdWJtaXRcIiE9PWQmJlwicmVzZXRcIiE9PWR8fHZvaWQgMCE9PWIudmFsdWUmJm51bGwhPT1iLnZhbHVlKSlyZXR1cm47Yj1cIlwiK2EuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU7Y3x8Yj09PWEudmFsdWV8fChhLnZhbHVlPWIpO2EuZGVmYXVsdFZhbHVlPWJ9Yz1hLm5hbWU7XCJcIiE9PWMmJihhLm5hbWU9XCJcIik7YS5kZWZhdWx0Q2hlY2tlZD0hIWEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDtcIlwiIT09YyYmKGEubmFtZT1jKX1cbmZ1bmN0aW9uIGJiKGEsYixjKXtpZihcIm51bWJlclwiIT09Ynx8WGEoYS5vd25lckRvY3VtZW50KSE9PWEpbnVsbD09Yz9hLmRlZmF1bHRWYWx1ZT1cIlwiK2EuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU6YS5kZWZhdWx0VmFsdWUhPT1cIlwiK2MmJihhLmRlZmF1bHRWYWx1ZT1cIlwiK2MpfWZ1bmN0aW9uIGRiKGEpe3ZhciBiPVwiXCI7YWEuQ2hpbGRyZW4uZm9yRWFjaChhLGZ1bmN0aW9uKGEpe251bGwhPWEmJihiKz1hKX0pO3JldHVybiBifWZ1bmN0aW9uIGViKGEsYil7YT1tKHtjaGlsZHJlbjp2b2lkIDB9LGIpO2lmKGI9ZGIoYi5jaGlsZHJlbikpYS5jaGlsZHJlbj1iO3JldHVybiBhfVxuZnVuY3Rpb24gZmIoYSxiLGMsZCl7YT1hLm9wdGlvbnM7aWYoYil7Yj17fTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyliW1wiJFwiK2NbZV1dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZT1iLmhhc093blByb3BlcnR5KFwiJFwiK2FbY10udmFsdWUpLGFbY10uc2VsZWN0ZWQhPT1lJiYoYVtjXS5zZWxlY3RlZD1lKSxlJiZkJiYoYVtjXS5kZWZhdWx0U2VsZWN0ZWQ9ITApfWVsc2V7Yz1cIlwiK1NhKGMpO2I9bnVsbDtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKXtpZihhW2VdLnZhbHVlPT09Yyl7YVtlXS5zZWxlY3RlZD0hMDtkJiYoYVtlXS5kZWZhdWx0U2VsZWN0ZWQ9ITApO3JldHVybn1udWxsIT09Ynx8YVtlXS5kaXNhYmxlZHx8KGI9YVtlXSl9bnVsbCE9PWImJihiLnNlbGVjdGVkPSEwKX19XG5mdW5jdGlvbiBnYihhLGIpe2lmKG51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpdGhyb3cgRXJyb3IoeSg5MSkpO3JldHVybiBtKHt9LGIse3ZhbHVlOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLGNoaWxkcmVuOlwiXCIrYS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIGhiKGEsYil7dmFyIGM9Yi52YWx1ZTtpZihudWxsPT1jKXtjPWIuY2hpbGRyZW47Yj1iLmRlZmF1bHRWYWx1ZTtpZihudWxsIT1jKXtpZihudWxsIT1iKXRocm93IEVycm9yKHkoOTIpKTtpZihBcnJheS5pc0FycmF5KGMpKXtpZighKDE+PWMubGVuZ3RoKSl0aHJvdyBFcnJvcih5KDkzKSk7Yz1jWzBdfWI9Y31udWxsPT1iJiYoYj1cIlwiKTtjPWJ9YS5fd3JhcHBlclN0YXRlPXtpbml0aWFsVmFsdWU6U2EoYyl9fVxuZnVuY3Rpb24gaWIoYSxiKXt2YXIgYz1TYShiLnZhbHVlKSxkPVNhKGIuZGVmYXVsdFZhbHVlKTtudWxsIT1jJiYoYz1cIlwiK2MsYyE9PWEudmFsdWUmJihhLnZhbHVlPWMpLG51bGw9PWIuZGVmYXVsdFZhbHVlJiZhLmRlZmF1bHRWYWx1ZSE9PWMmJihhLmRlZmF1bHRWYWx1ZT1jKSk7bnVsbCE9ZCYmKGEuZGVmYXVsdFZhbHVlPVwiXCIrZCl9ZnVuY3Rpb24gamIoYSl7dmFyIGI9YS50ZXh0Q29udGVudDtiPT09YS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSYmXCJcIiE9PWImJm51bGwhPT1iJiYoYS52YWx1ZT1iKX12YXIga2I9e2h0bWw6XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIsbWF0aG1sOlwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwiLHN2ZzpcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJ9O1xuZnVuY3Rpb24gbGIoYSl7c3dpdGNoKGEpe2Nhc2UgXCJzdmdcIjpyZXR1cm5cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7Y2FzZSBcIm1hdGhcIjpyZXR1cm5cImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIjtkZWZhdWx0OnJldHVyblwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwifX1mdW5jdGlvbiBtYihhLGIpe3JldHVybiBudWxsPT1hfHxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj09PWE/bGIoYik6XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPT09YSYmXCJmb3JlaWduT2JqZWN0XCI9PT1iP1wiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiOmF9XG52YXIgbmIsb2I9ZnVuY3Rpb24oYSl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBNU0FwcCYmTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24/ZnVuY3Rpb24oYixjLGQsZSl7TVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24oKXtyZXR1cm4gYShiLGMsZCxlKX0pfTphfShmdW5jdGlvbihhLGIpe2lmKGEubmFtZXNwYWNlVVJJIT09a2Iuc3ZnfHxcImlubmVySFRNTFwiaW4gYSlhLmlubmVySFRNTD1iO2Vsc2V7bmI9bmJ8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7bmIuaW5uZXJIVE1MPVwiPHN2Zz5cIitiLnZhbHVlT2YoKS50b1N0cmluZygpK1wiPC9zdmc+XCI7Zm9yKGI9bmIuZmlyc3RDaGlsZDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTtmb3IoO2IuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChiLmZpcnN0Q2hpbGQpfX0pO1xuZnVuY3Rpb24gcGIoYSxiKXtpZihiKXt2YXIgYz1hLmZpcnN0Q2hpbGQ7aWYoYyYmYz09PWEubGFzdENoaWxkJiYzPT09Yy5ub2RlVHlwZSl7Yy5ub2RlVmFsdWU9YjtyZXR1cm59fWEudGV4dENvbnRlbnQ9Yn1cbnZhciBxYj17YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsYm9yZGVySW1hZ2VPdXRzZXQ6ITAsYm9yZGVySW1hZ2VTbGljZTohMCxib3JkZXJJbWFnZVdpZHRoOiEwLGJveEZsZXg6ITAsYm94RmxleEdyb3VwOiEwLGJveE9yZGluYWxHcm91cDohMCxjb2x1bW5Db3VudDohMCxjb2x1bW5zOiEwLGZsZXg6ITAsZmxleEdyb3c6ITAsZmxleFBvc2l0aXZlOiEwLGZsZXhTaHJpbms6ITAsZmxleE5lZ2F0aXZlOiEwLGZsZXhPcmRlcjohMCxncmlkQXJlYTohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1NwYW46ITAsZ3JpZFJvd1N0YXJ0OiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3BhbjohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZm9udFdlaWdodDohMCxsaW5lQ2xhbXA6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsdGFiU2l6ZTohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITAsZmlsbE9wYWNpdHk6ITAsXG5mbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxyYj1bXCJXZWJraXRcIixcIm1zXCIsXCJNb3pcIixcIk9cIl07T2JqZWN0LmtleXMocWIpLmZvckVhY2goZnVuY3Rpb24oYSl7cmIuZm9yRWFjaChmdW5jdGlvbihiKXtiPWIrYS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnN1YnN0cmluZygxKTtxYltiXT1xYlthXX0pfSk7ZnVuY3Rpb24gc2IoYSxiLGMpe3JldHVybiBudWxsPT1ifHxcImJvb2xlYW5cIj09PXR5cGVvZiBifHxcIlwiPT09Yj9cIlwiOmN8fFwibnVtYmVyXCIhPT10eXBlb2YgYnx8MD09PWJ8fHFiLmhhc093blByb3BlcnR5KGEpJiZxYlthXT8oXCJcIitiKS50cmltKCk6YitcInB4XCJ9XG5mdW5jdGlvbiB0YihhLGIpe2E9YS5zdHlsZTtmb3IodmFyIGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXt2YXIgZD0wPT09Yy5pbmRleE9mKFwiLS1cIiksZT1zYihjLGJbY10sZCk7XCJmbG9hdFwiPT09YyYmKGM9XCJjc3NGbG9hdFwiKTtkP2Euc2V0UHJvcGVydHkoYyxlKTphW2NdPWV9fXZhciB1Yj1tKHttZW51aXRlbTohMH0se2FyZWE6ITAsYmFzZTohMCxicjohMCxjb2w6ITAsZW1iZWQ6ITAsaHI6ITAsaW1nOiEwLGlucHV0OiEwLGtleWdlbjohMCxsaW5rOiEwLG1ldGE6ITAscGFyYW06ITAsc291cmNlOiEwLHRyYWNrOiEwLHdicjohMH0pO1xuZnVuY3Rpb24gdmIoYSxiKXtpZihiKXtpZih1YlthXSYmKG51bGwhPWIuY2hpbGRyZW58fG51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKHkoMTM3LGEpKTtpZihudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKXtpZihudWxsIT1iLmNoaWxkcmVuKXRocm93IEVycm9yKHkoNjApKTtpZighKFwib2JqZWN0XCI9PT10eXBlb2YgYi5kYW5nZXJvdXNseVNldElubmVySFRNTCYmXCJfX2h0bWxcImluIGIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKHkoNjEpKTt9aWYobnVsbCE9Yi5zdHlsZSYmXCJvYmplY3RcIiE9PXR5cGVvZiBiLnN0eWxlKXRocm93IEVycm9yKHkoNjIpKTt9fVxuZnVuY3Rpb24gd2IoYSxiKXtpZigtMT09PWEuaW5kZXhPZihcIi1cIikpcmV0dXJuXCJzdHJpbmdcIj09PXR5cGVvZiBiLmlzO3N3aXRjaChhKXtjYXNlIFwiYW5ub3RhdGlvbi14bWxcIjpjYXNlIFwiY29sb3ItcHJvZmlsZVwiOmNhc2UgXCJmb250LWZhY2VcIjpjYXNlIFwiZm9udC1mYWNlLXNyY1wiOmNhc2UgXCJmb250LWZhY2UtdXJpXCI6Y2FzZSBcImZvbnQtZmFjZS1mb3JtYXRcIjpjYXNlIFwiZm9udC1mYWNlLW5hbWVcIjpjYXNlIFwibWlzc2luZy1nbHlwaFwiOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuITB9fWZ1bmN0aW9uIHhiKGEpe2E9YS50YXJnZXR8fGEuc3JjRWxlbWVudHx8d2luZG93O2EuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQmJihhPWEuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpO3JldHVybiAzPT09YS5ub2RlVHlwZT9hLnBhcmVudE5vZGU6YX12YXIgeWI9bnVsbCx6Yj1udWxsLEFiPW51bGw7XG5mdW5jdGlvbiBCYihhKXtpZihhPUNiKGEpKXtpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgeWIpdGhyb3cgRXJyb3IoeSgyODApKTt2YXIgYj1hLnN0YXRlTm9kZTtiJiYoYj1EYihiKSx5YihhLnN0YXRlTm9kZSxhLnR5cGUsYikpfX1mdW5jdGlvbiBFYihhKXt6Yj9BYj9BYi5wdXNoKGEpOkFiPVthXTp6Yj1hfWZ1bmN0aW9uIEZiKCl7aWYoemIpe3ZhciBhPXpiLGI9QWI7QWI9emI9bnVsbDtCYihhKTtpZihiKWZvcihhPTA7YTxiLmxlbmd0aDthKyspQmIoYlthXSl9fWZ1bmN0aW9uIEdiKGEsYil7cmV0dXJuIGEoYil9ZnVuY3Rpb24gSGIoYSxiLGMsZCxlKXtyZXR1cm4gYShiLGMsZCxlKX1mdW5jdGlvbiBJYigpe312YXIgSmI9R2IsS2I9ITEsTGI9ITE7ZnVuY3Rpb24gTWIoKXtpZihudWxsIT09emJ8fG51bGwhPT1BYilJYigpLEZiKCl9XG5mdW5jdGlvbiBOYihhLGIsYyl7aWYoTGIpcmV0dXJuIGEoYixjKTtMYj0hMDt0cnl7cmV0dXJuIEpiKGEsYixjKX1maW5hbGx5e0xiPSExLE1iKCl9fVxuZnVuY3Rpb24gT2IoYSxiKXt2YXIgYz1hLnN0YXRlTm9kZTtpZihudWxsPT09YylyZXR1cm4gbnVsbDt2YXIgZD1EYihjKTtpZihudWxsPT09ZClyZXR1cm4gbnVsbDtjPWRbYl07YTpzd2l0Y2goYil7Y2FzZSBcIm9uQ2xpY2tcIjpjYXNlIFwib25DbGlja0NhcHR1cmVcIjpjYXNlIFwib25Eb3VibGVDbGlja1wiOmNhc2UgXCJvbkRvdWJsZUNsaWNrQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlRG93blwiOmNhc2UgXCJvbk1vdXNlRG93bkNhcHR1cmVcIjpjYXNlIFwib25Nb3VzZU1vdmVcIjpjYXNlIFwib25Nb3VzZU1vdmVDYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VVcFwiOmNhc2UgXCJvbk1vdXNlVXBDYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VFbnRlclwiOihkPSFkLmRpc2FibGVkKXx8KGE9YS50eXBlLGQ9IShcImJ1dHRvblwiPT09YXx8XCJpbnB1dFwiPT09YXx8XCJzZWxlY3RcIj09PWF8fFwidGV4dGFyZWFcIj09PWEpKTthPSFkO2JyZWFrIGE7ZGVmYXVsdDphPSExfWlmKGEpcmV0dXJuIG51bGw7aWYoYyYmXCJmdW5jdGlvblwiIT09XG50eXBlb2YgYyl0aHJvdyBFcnJvcih5KDIzMSxiLHR5cGVvZiBjKSk7cmV0dXJuIGN9dmFyIFBiPSExO2lmKGZhKXRyeXt2YXIgUWI9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFFiLFwicGFzc2l2ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtQYj0hMH19KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInRlc3RcIixRYixRYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsUWIsUWIpfWNhdGNoKGEpe1BiPSExfWZ1bmN0aW9uIFJiKGEsYixjLGQsZSxmLGcsaCxrKXt2YXIgbD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMyk7dHJ5e2IuYXBwbHkoYyxsKX1jYXRjaChuKXt0aGlzLm9uRXJyb3Iobil9fXZhciBTYj0hMSxUYj1udWxsLFViPSExLFZiPW51bGwsV2I9e29uRXJyb3I6ZnVuY3Rpb24oYSl7U2I9ITA7VGI9YX19O2Z1bmN0aW9uIFhiKGEsYixjLGQsZSxmLGcsaCxrKXtTYj0hMTtUYj1udWxsO1JiLmFwcGx5KFdiLGFyZ3VtZW50cyl9XG5mdW5jdGlvbiBZYihhLGIsYyxkLGUsZixnLGgsayl7WGIuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKFNiKXtpZihTYil7dmFyIGw9VGI7U2I9ITE7VGI9bnVsbH1lbHNlIHRocm93IEVycm9yKHkoMTk4KSk7VWJ8fChVYj0hMCxWYj1sKX19ZnVuY3Rpb24gWmIoYSl7dmFyIGI9YSxjPWE7aWYoYS5hbHRlcm5hdGUpZm9yKDtiLnJldHVybjspYj1iLnJldHVybjtlbHNle2E9YjtkbyBiPWEsMCE9PShiLmZsYWdzJjEwMjYpJiYoYz1iLnJldHVybiksYT1iLnJldHVybjt3aGlsZShhKX1yZXR1cm4gMz09PWIudGFnP2M6bnVsbH1mdW5jdGlvbiAkYihhKXtpZigxMz09PWEudGFnKXt2YXIgYj1hLm1lbW9pemVkU3RhdGU7bnVsbD09PWImJihhPWEuYWx0ZXJuYXRlLG51bGwhPT1hJiYoYj1hLm1lbW9pemVkU3RhdGUpKTtpZihudWxsIT09YilyZXR1cm4gYi5kZWh5ZHJhdGVkfXJldHVybiBudWxsfWZ1bmN0aW9uIGFjKGEpe2lmKFpiKGEpIT09YSl0aHJvdyBFcnJvcih5KDE4OCkpO31cbmZ1bmN0aW9uIGJjKGEpe3ZhciBiPWEuYWx0ZXJuYXRlO2lmKCFiKXtiPVpiKGEpO2lmKG51bGw9PT1iKXRocm93IEVycm9yKHkoMTg4KSk7cmV0dXJuIGIhPT1hP251bGw6YX1mb3IodmFyIGM9YSxkPWI7Oyl7dmFyIGU9Yy5yZXR1cm47aWYobnVsbD09PWUpYnJlYWs7dmFyIGY9ZS5hbHRlcm5hdGU7aWYobnVsbD09PWYpe2Q9ZS5yZXR1cm47aWYobnVsbCE9PWQpe2M9ZDtjb250aW51ZX1icmVha31pZihlLmNoaWxkPT09Zi5jaGlsZCl7Zm9yKGY9ZS5jaGlsZDtmOyl7aWYoZj09PWMpcmV0dXJuIGFjKGUpLGE7aWYoZj09PWQpcmV0dXJuIGFjKGUpLGI7Zj1mLnNpYmxpbmd9dGhyb3cgRXJyb3IoeSgxODgpKTt9aWYoYy5yZXR1cm4hPT1kLnJldHVybiljPWUsZD1mO2Vsc2V7Zm9yKHZhciBnPSExLGg9ZS5jaGlsZDtoOyl7aWYoaD09PWMpe2c9ITA7Yz1lO2Q9ZjticmVha31pZihoPT09ZCl7Zz0hMDtkPWU7Yz1mO2JyZWFrfWg9aC5zaWJsaW5nfWlmKCFnKXtmb3IoaD1mLmNoaWxkO2g7KXtpZihoPT09XG5jKXtnPSEwO2M9ZjtkPWU7YnJlYWt9aWYoaD09PWQpe2c9ITA7ZD1mO2M9ZTticmVha31oPWguc2libGluZ31pZighZyl0aHJvdyBFcnJvcih5KDE4OSkpO319aWYoYy5hbHRlcm5hdGUhPT1kKXRocm93IEVycm9yKHkoMTkwKSk7fWlmKDMhPT1jLnRhZyl0aHJvdyBFcnJvcih5KDE4OCkpO3JldHVybiBjLnN0YXRlTm9kZS5jdXJyZW50PT09Yz9hOmJ9ZnVuY3Rpb24gY2MoYSl7YT1iYyhhKTtpZighYSlyZXR1cm4gbnVsbDtmb3IodmFyIGI9YTs7KXtpZig1PT09Yi50YWd8fDY9PT1iLnRhZylyZXR1cm4gYjtpZihiLmNoaWxkKWIuY2hpbGQucmV0dXJuPWIsYj1iLmNoaWxkO2Vsc2V7aWYoYj09PWEpYnJlYWs7Zm9yKDshYi5zaWJsaW5nOyl7aWYoIWIucmV0dXJufHxiLnJldHVybj09PWEpcmV0dXJuIG51bGw7Yj1iLnJldHVybn1iLnNpYmxpbmcucmV0dXJuPWIucmV0dXJuO2I9Yi5zaWJsaW5nfX1yZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIGRjKGEsYil7Zm9yKHZhciBjPWEuYWx0ZXJuYXRlO251bGwhPT1iOyl7aWYoYj09PWF8fGI9PT1jKXJldHVybiEwO2I9Yi5yZXR1cm59cmV0dXJuITF9dmFyIGVjLGZjLGdjLGhjLGljPSExLGpjPVtdLGtjPW51bGwsbGM9bnVsbCxtYz1udWxsLG5jPW5ldyBNYXAsb2M9bmV3IE1hcCxwYz1bXSxxYz1cIm1vdXNlZG93biBtb3VzZXVwIHRvdWNoY2FuY2VsIHRvdWNoZW5kIHRvdWNoc3RhcnQgYXV4Y2xpY2sgZGJsY2xpY2sgcG9pbnRlcmNhbmNlbCBwb2ludGVyZG93biBwb2ludGVydXAgZHJhZ2VuZCBkcmFnc3RhcnQgZHJvcCBjb21wb3NpdGlvbmVuZCBjb21wb3NpdGlvbnN0YXJ0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgaW5wdXQgdGV4dElucHV0IGNvcHkgY3V0IHBhc3RlIGNsaWNrIGNoYW5nZSBjb250ZXh0bWVudSByZXNldCBzdWJtaXRcIi5zcGxpdChcIiBcIik7XG5mdW5jdGlvbiByYyhhLGIsYyxkLGUpe3JldHVybntibG9ja2VkT246YSxkb21FdmVudE5hbWU6YixldmVudFN5c3RlbUZsYWdzOmN8MTYsbmF0aXZlRXZlbnQ6ZSx0YXJnZXRDb250YWluZXJzOltkXX19ZnVuY3Rpb24gc2MoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImZvY3VzaW5cIjpjYXNlIFwiZm9jdXNvdXRcIjprYz1udWxsO2JyZWFrO2Nhc2UgXCJkcmFnZW50ZXJcIjpjYXNlIFwiZHJhZ2xlYXZlXCI6bGM9bnVsbDticmVhaztjYXNlIFwibW91c2VvdmVyXCI6Y2FzZSBcIm1vdXNlb3V0XCI6bWM9bnVsbDticmVhaztjYXNlIFwicG9pbnRlcm92ZXJcIjpjYXNlIFwicG9pbnRlcm91dFwiOm5jLmRlbGV0ZShiLnBvaW50ZXJJZCk7YnJlYWs7Y2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6Y2FzZSBcImxvc3Rwb2ludGVyY2FwdHVyZVwiOm9jLmRlbGV0ZShiLnBvaW50ZXJJZCl9fVxuZnVuY3Rpb24gdGMoYSxiLGMsZCxlLGYpe2lmKG51bGw9PT1hfHxhLm5hdGl2ZUV2ZW50IT09ZilyZXR1cm4gYT1yYyhiLGMsZCxlLGYpLG51bGwhPT1iJiYoYj1DYihiKSxudWxsIT09YiYmZmMoYikpLGE7YS5ldmVudFN5c3RlbUZsYWdzfD1kO2I9YS50YXJnZXRDb250YWluZXJzO251bGwhPT1lJiYtMT09PWIuaW5kZXhPZihlKSYmYi5wdXNoKGUpO3JldHVybiBhfVxuZnVuY3Rpb24gdWMoYSxiLGMsZCxlKXtzd2l0Y2goYil7Y2FzZSBcImZvY3VzaW5cIjpyZXR1cm4ga2M9dGMoa2MsYSxiLGMsZCxlKSwhMDtjYXNlIFwiZHJhZ2VudGVyXCI6cmV0dXJuIGxjPXRjKGxjLGEsYixjLGQsZSksITA7Y2FzZSBcIm1vdXNlb3ZlclwiOnJldHVybiBtYz10YyhtYyxhLGIsYyxkLGUpLCEwO2Nhc2UgXCJwb2ludGVyb3ZlclwiOnZhciBmPWUucG9pbnRlcklkO25jLnNldChmLHRjKG5jLmdldChmKXx8bnVsbCxhLGIsYyxkLGUpKTtyZXR1cm4hMDtjYXNlIFwiZ290cG9pbnRlcmNhcHR1cmVcIjpyZXR1cm4gZj1lLnBvaW50ZXJJZCxvYy5zZXQoZix0YyhvYy5nZXQoZil8fG51bGwsYSxiLGMsZCxlKSksITB9cmV0dXJuITF9XG5mdW5jdGlvbiB2YyhhKXt2YXIgYj13YyhhLnRhcmdldCk7aWYobnVsbCE9PWIpe3ZhciBjPVpiKGIpO2lmKG51bGwhPT1jKWlmKGI9Yy50YWcsMTM9PT1iKXtpZihiPSRiKGMpLG51bGwhPT1iKXthLmJsb2NrZWRPbj1iO2hjKGEubGFuZVByaW9yaXR5LGZ1bmN0aW9uKCl7ci51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkoYS5wcmlvcml0eSxmdW5jdGlvbigpe2djKGMpfSl9KTtyZXR1cm59fWVsc2UgaWYoMz09PWImJmMuc3RhdGVOb2RlLmh5ZHJhdGUpe2EuYmxvY2tlZE9uPTM9PT1jLnRhZz9jLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7cmV0dXJufX1hLmJsb2NrZWRPbj1udWxsfVxuZnVuY3Rpb24geGMoYSl7aWYobnVsbCE9PWEuYmxvY2tlZE9uKXJldHVybiExO2Zvcih2YXIgYj1hLnRhcmdldENvbnRhaW5lcnM7MDxiLmxlbmd0aDspe3ZhciBjPXljKGEuZG9tRXZlbnROYW1lLGEuZXZlbnRTeXN0ZW1GbGFncyxiWzBdLGEubmF0aXZlRXZlbnQpO2lmKG51bGwhPT1jKXJldHVybiBiPUNiKGMpLG51bGwhPT1iJiZmYyhiKSxhLmJsb2NrZWRPbj1jLCExO2Iuc2hpZnQoKX1yZXR1cm4hMH1mdW5jdGlvbiB6YyhhLGIsYyl7eGMoYSkmJmMuZGVsZXRlKGIpfVxuZnVuY3Rpb24gQWMoKXtmb3IoaWM9ITE7MDxqYy5sZW5ndGg7KXt2YXIgYT1qY1swXTtpZihudWxsIT09YS5ibG9ja2VkT24pe2E9Q2IoYS5ibG9ja2VkT24pO251bGwhPT1hJiZlYyhhKTticmVha31mb3IodmFyIGI9YS50YXJnZXRDb250YWluZXJzOzA8Yi5sZW5ndGg7KXt2YXIgYz15YyhhLmRvbUV2ZW50TmFtZSxhLmV2ZW50U3lzdGVtRmxhZ3MsYlswXSxhLm5hdGl2ZUV2ZW50KTtpZihudWxsIT09Yyl7YS5ibG9ja2VkT249YzticmVha31iLnNoaWZ0KCl9bnVsbD09PWEuYmxvY2tlZE9uJiZqYy5zaGlmdCgpfW51bGwhPT1rYyYmeGMoa2MpJiYoa2M9bnVsbCk7bnVsbCE9PWxjJiZ4YyhsYykmJihsYz1udWxsKTtudWxsIT09bWMmJnhjKG1jKSYmKG1jPW51bGwpO25jLmZvckVhY2goemMpO29jLmZvckVhY2goemMpfVxuZnVuY3Rpb24gQmMoYSxiKXthLmJsb2NrZWRPbj09PWImJihhLmJsb2NrZWRPbj1udWxsLGljfHwoaWM9ITAsci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKHIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksQWMpKSl9XG5mdW5jdGlvbiBDYyhhKXtmdW5jdGlvbiBiKGIpe3JldHVybiBCYyhiLGEpfWlmKDA8amMubGVuZ3RoKXtCYyhqY1swXSxhKTtmb3IodmFyIGM9MTtjPGpjLmxlbmd0aDtjKyspe3ZhciBkPWpjW2NdO2QuYmxvY2tlZE9uPT09YSYmKGQuYmxvY2tlZE9uPW51bGwpfX1udWxsIT09a2MmJkJjKGtjLGEpO251bGwhPT1sYyYmQmMobGMsYSk7bnVsbCE9PW1jJiZCYyhtYyxhKTtuYy5mb3JFYWNoKGIpO29jLmZvckVhY2goYik7Zm9yKGM9MDtjPHBjLmxlbmd0aDtjKyspZD1wY1tjXSxkLmJsb2NrZWRPbj09PWEmJihkLmJsb2NrZWRPbj1udWxsKTtmb3IoOzA8cGMubGVuZ3RoJiYoYz1wY1swXSxudWxsPT09Yy5ibG9ja2VkT24pOyl2YyhjKSxudWxsPT09Yy5ibG9ja2VkT24mJnBjLnNoaWZ0KCl9XG5mdW5jdGlvbiBEYyhhLGIpe3ZhciBjPXt9O2NbYS50b0xvd2VyQ2FzZSgpXT1iLnRvTG93ZXJDYXNlKCk7Y1tcIldlYmtpdFwiK2FdPVwid2Via2l0XCIrYjtjW1wiTW96XCIrYV09XCJtb3pcIitiO3JldHVybiBjfXZhciBFYz17YW5pbWF0aW9uZW5kOkRjKFwiQW5pbWF0aW9uXCIsXCJBbmltYXRpb25FbmRcIiksYW5pbWF0aW9uaXRlcmF0aW9uOkRjKFwiQW5pbWF0aW9uXCIsXCJBbmltYXRpb25JdGVyYXRpb25cIiksYW5pbWF0aW9uc3RhcnQ6RGMoXCJBbmltYXRpb25cIixcIkFuaW1hdGlvblN0YXJ0XCIpLHRyYW5zaXRpb25lbmQ6RGMoXCJUcmFuc2l0aW9uXCIsXCJUcmFuc2l0aW9uRW5kXCIpfSxGYz17fSxHYz17fTtcbmZhJiYoR2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKS5zdHlsZSxcIkFuaW1hdGlvbkV2ZW50XCJpbiB3aW5kb3d8fChkZWxldGUgRWMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixkZWxldGUgRWMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUgRWMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSxcIlRyYW5zaXRpb25FdmVudFwiaW4gd2luZG93fHxkZWxldGUgRWMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKTtmdW5jdGlvbiBIYyhhKXtpZihGY1thXSlyZXR1cm4gRmNbYV07aWYoIUVjW2FdKXJldHVybiBhO3ZhciBiPUVjW2FdLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpJiZjIGluIEdjKXJldHVybiBGY1thXT1iW2NdO3JldHVybiBhfVxudmFyIEljPUhjKFwiYW5pbWF0aW9uZW5kXCIpLEpjPUhjKFwiYW5pbWF0aW9uaXRlcmF0aW9uXCIpLEtjPUhjKFwiYW5pbWF0aW9uc3RhcnRcIiksTGM9SGMoXCJ0cmFuc2l0aW9uZW5kXCIpLE1jPW5ldyBNYXAsTmM9bmV3IE1hcCxPYz1bXCJhYm9ydFwiLFwiYWJvcnRcIixJYyxcImFuaW1hdGlvbkVuZFwiLEpjLFwiYW5pbWF0aW9uSXRlcmF0aW9uXCIsS2MsXCJhbmltYXRpb25TdGFydFwiLFwiY2FucGxheVwiLFwiY2FuUGxheVwiLFwiY2FucGxheXRocm91Z2hcIixcImNhblBsYXlUaHJvdWdoXCIsXCJkdXJhdGlvbmNoYW5nZVwiLFwiZHVyYXRpb25DaGFuZ2VcIixcImVtcHRpZWRcIixcImVtcHRpZWRcIixcImVuY3J5cHRlZFwiLFwiZW5jcnlwdGVkXCIsXCJlbmRlZFwiLFwiZW5kZWRcIixcImVycm9yXCIsXCJlcnJvclwiLFwiZ290cG9pbnRlcmNhcHR1cmVcIixcImdvdFBvaW50ZXJDYXB0dXJlXCIsXCJsb2FkXCIsXCJsb2FkXCIsXCJsb2FkZWRkYXRhXCIsXCJsb2FkZWREYXRhXCIsXCJsb2FkZWRtZXRhZGF0YVwiLFwibG9hZGVkTWV0YWRhdGFcIixcImxvYWRzdGFydFwiLFwibG9hZFN0YXJ0XCIsXG5cImxvc3Rwb2ludGVyY2FwdHVyZVwiLFwibG9zdFBvaW50ZXJDYXB0dXJlXCIsXCJwbGF5aW5nXCIsXCJwbGF5aW5nXCIsXCJwcm9ncmVzc1wiLFwicHJvZ3Jlc3NcIixcInNlZWtpbmdcIixcInNlZWtpbmdcIixcInN0YWxsZWRcIixcInN0YWxsZWRcIixcInN1c3BlbmRcIixcInN1c3BlbmRcIixcInRpbWV1cGRhdGVcIixcInRpbWVVcGRhdGVcIixMYyxcInRyYW5zaXRpb25FbmRcIixcIndhaXRpbmdcIixcIndhaXRpbmdcIl07ZnVuY3Rpb24gUGMoYSxiKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrPTIpe3ZhciBkPWFbY10sZT1hW2MrMV07ZT1cIm9uXCIrKGVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpKTtOYy5zZXQoZCxiKTtNYy5zZXQoZCxlKTtkYShlLFtkXSl9fXZhciBRYz1yLnVuc3RhYmxlX25vdztRYygpO3ZhciBGPTg7XG5mdW5jdGlvbiBSYyhhKXtpZigwIT09KDEmYSkpcmV0dXJuIEY9MTUsMTtpZigwIT09KDImYSkpcmV0dXJuIEY9MTQsMjtpZigwIT09KDQmYSkpcmV0dXJuIEY9MTMsNDt2YXIgYj0yNCZhO2lmKDAhPT1iKXJldHVybiBGPTEyLGI7aWYoMCE9PShhJjMyKSlyZXR1cm4gRj0xMSwzMjtiPTE5MiZhO2lmKDAhPT1iKXJldHVybiBGPTEwLGI7aWYoMCE9PShhJjI1NikpcmV0dXJuIEY9OSwyNTY7Yj0zNTg0JmE7aWYoMCE9PWIpcmV0dXJuIEY9OCxiO2lmKDAhPT0oYSY0MDk2KSlyZXR1cm4gRj03LDQwOTY7Yj00MTg2MTEyJmE7aWYoMCE9PWIpcmV0dXJuIEY9NixiO2I9NjI5MTQ1NjAmYTtpZigwIT09YilyZXR1cm4gRj01LGI7aWYoYSY2NzEwODg2NClyZXR1cm4gRj00LDY3MTA4ODY0O2lmKDAhPT0oYSYxMzQyMTc3MjgpKXJldHVybiBGPTMsMTM0MjE3NzI4O2I9ODA1MzA2MzY4JmE7aWYoMCE9PWIpcmV0dXJuIEY9MixiO2lmKDAhPT0oMTA3Mzc0MTgyNCZhKSlyZXR1cm4gRj0xLDEwNzM3NDE4MjQ7XG5GPTg7cmV0dXJuIGF9ZnVuY3Rpb24gU2MoYSl7c3dpdGNoKGEpe2Nhc2UgOTk6cmV0dXJuIDE1O2Nhc2UgOTg6cmV0dXJuIDEwO2Nhc2UgOTc6Y2FzZSA5NjpyZXR1cm4gODtjYXNlIDk1OnJldHVybiAyO2RlZmF1bHQ6cmV0dXJuIDB9fWZ1bmN0aW9uIFRjKGEpe3N3aXRjaChhKXtjYXNlIDE1OmNhc2UgMTQ6cmV0dXJuIDk5O2Nhc2UgMTM6Y2FzZSAxMjpjYXNlIDExOmNhc2UgMTA6cmV0dXJuIDk4O2Nhc2UgOTpjYXNlIDg6Y2FzZSA3OmNhc2UgNjpjYXNlIDQ6Y2FzZSA1OnJldHVybiA5NztjYXNlIDM6Y2FzZSAyOmNhc2UgMTpyZXR1cm4gOTU7Y2FzZSAwOnJldHVybiA5MDtkZWZhdWx0OnRocm93IEVycm9yKHkoMzU4LGEpKTt9fVxuZnVuY3Rpb24gVWMoYSxiKXt2YXIgYz1hLnBlbmRpbmdMYW5lcztpZigwPT09YylyZXR1cm4gRj0wO3ZhciBkPTAsZT0wLGY9YS5leHBpcmVkTGFuZXMsZz1hLnN1c3BlbmRlZExhbmVzLGg9YS5waW5nZWRMYW5lcztpZigwIT09ZilkPWYsZT1GPTE1O2Vsc2UgaWYoZj1jJjEzNDIxNzcyNywwIT09Zil7dmFyIGs9ZiZ+ZzswIT09az8oZD1SYyhrKSxlPUYpOihoJj1mLDAhPT1oJiYoZD1SYyhoKSxlPUYpKX1lbHNlIGY9YyZ+ZywwIT09Zj8oZD1SYyhmKSxlPUYpOjAhPT1oJiYoZD1SYyhoKSxlPUYpO2lmKDA9PT1kKXJldHVybiAwO2Q9MzEtVmMoZCk7ZD1jJigoMD5kPzA6MTw8ZCk8PDEpLTE7aWYoMCE9PWImJmIhPT1kJiYwPT09KGImZykpe1JjKGIpO2lmKGU8PUYpcmV0dXJuIGI7Rj1lfWI9YS5lbnRhbmdsZWRMYW5lcztpZigwIT09Yilmb3IoYT1hLmVudGFuZ2xlbWVudHMsYiY9ZDswPGI7KWM9MzEtVmMoYiksZT0xPDxjLGR8PWFbY10sYiY9fmU7cmV0dXJuIGR9XG5mdW5jdGlvbiBXYyhhKXthPWEucGVuZGluZ0xhbmVzJi0xMDczNzQxODI1O3JldHVybiAwIT09YT9hOmEmMTA3Mzc0MTgyND8xMDczNzQxODI0OjB9ZnVuY3Rpb24gWGMoYSxiKXtzd2l0Y2goYSl7Y2FzZSAxNTpyZXR1cm4gMTtjYXNlIDE0OnJldHVybiAyO2Nhc2UgMTI6cmV0dXJuIGE9WWMoMjQmfmIpLDA9PT1hP1hjKDEwLGIpOmE7Y2FzZSAxMDpyZXR1cm4gYT1ZYygxOTImfmIpLDA9PT1hP1hjKDgsYik6YTtjYXNlIDg6cmV0dXJuIGE9WWMoMzU4NCZ+YiksMD09PWEmJihhPVljKDQxODYxMTImfmIpLDA9PT1hJiYoYT01MTIpKSxhO2Nhc2UgMjpyZXR1cm4gYj1ZYyg4MDUzMDYzNjgmfmIpLDA9PT1iJiYoYj0yNjg0MzU0NTYpLGJ9dGhyb3cgRXJyb3IoeSgzNTgsYSkpO31mdW5jdGlvbiBZYyhhKXtyZXR1cm4gYSYtYX1mdW5jdGlvbiBaYyhhKXtmb3IodmFyIGI9W10sYz0wOzMxPmM7YysrKWIucHVzaChhKTtyZXR1cm4gYn1cbmZ1bmN0aW9uICRjKGEsYixjKXthLnBlbmRpbmdMYW5lc3w9Yjt2YXIgZD1iLTE7YS5zdXNwZW5kZWRMYW5lcyY9ZDthLnBpbmdlZExhbmVzJj1kO2E9YS5ldmVudFRpbWVzO2I9MzEtVmMoYik7YVtiXT1jfXZhciBWYz1NYXRoLmNsejMyP01hdGguY2x6MzI6YWQsYmQ9TWF0aC5sb2csY2Q9TWF0aC5MTjI7ZnVuY3Rpb24gYWQoYSl7cmV0dXJuIDA9PT1hPzMyOjMxLShiZChhKS9jZHwwKXwwfXZhciBkZD1yLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5LGVkPXIudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5LGZkPSEwO2Z1bmN0aW9uIGdkKGEsYixjLGQpe0tifHxJYigpO3ZhciBlPWhkLGY9S2I7S2I9ITA7dHJ5e0hiKGUsYSxiLGMsZCl9ZmluYWxseXsoS2I9Zil8fE1iKCl9fWZ1bmN0aW9uIGlkKGEsYixjLGQpe2VkKGRkLGhkLmJpbmQobnVsbCxhLGIsYyxkKSl9XG5mdW5jdGlvbiBoZChhLGIsYyxkKXtpZihmZCl7dmFyIGU7aWYoKGU9MD09PShiJjQpKSYmMDxqYy5sZW5ndGgmJi0xPHFjLmluZGV4T2YoYSkpYT1yYyhudWxsLGEsYixjLGQpLGpjLnB1c2goYSk7ZWxzZXt2YXIgZj15YyhhLGIsYyxkKTtpZihudWxsPT09ZillJiZzYyhhLGQpO2Vsc2V7aWYoZSl7aWYoLTE8cWMuaW5kZXhPZihhKSl7YT1yYyhmLGEsYixjLGQpO2pjLnB1c2goYSk7cmV0dXJufWlmKHVjKGYsYSxiLGMsZCkpcmV0dXJuO3NjKGEsZCl9amQoYSxiLGQsbnVsbCxjKX19fX1cbmZ1bmN0aW9uIHljKGEsYixjLGQpe3ZhciBlPXhiKGQpO2U9d2MoZSk7aWYobnVsbCE9PWUpe3ZhciBmPVpiKGUpO2lmKG51bGw9PT1mKWU9bnVsbDtlbHNle3ZhciBnPWYudGFnO2lmKDEzPT09Zyl7ZT0kYihmKTtpZihudWxsIT09ZSlyZXR1cm4gZTtlPW51bGx9ZWxzZSBpZigzPT09Zyl7aWYoZi5zdGF0ZU5vZGUuaHlkcmF0ZSlyZXR1cm4gMz09PWYudGFnP2Yuc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDtlPW51bGx9ZWxzZSBmIT09ZSYmKGU9bnVsbCl9fWpkKGEsYixkLGUsYyk7cmV0dXJuIG51bGx9dmFyIGtkPW51bGwsbGQ9bnVsbCxtZD1udWxsO1xuZnVuY3Rpb24gbmQoKXtpZihtZClyZXR1cm4gbWQ7dmFyIGEsYj1sZCxjPWIubGVuZ3RoLGQsZT1cInZhbHVlXCJpbiBrZD9rZC52YWx1ZTprZC50ZXh0Q29udGVudCxmPWUubGVuZ3RoO2ZvcihhPTA7YTxjJiZiW2FdPT09ZVthXTthKyspO3ZhciBnPWMtYTtmb3IoZD0xO2Q8PWcmJmJbYy1kXT09PWVbZi1kXTtkKyspO3JldHVybiBtZD1lLnNsaWNlKGEsMTxkPzEtZDp2b2lkIDApfWZ1bmN0aW9uIG9kKGEpe3ZhciBiPWEua2V5Q29kZTtcImNoYXJDb2RlXCJpbiBhPyhhPWEuY2hhckNvZGUsMD09PWEmJjEzPT09YiYmKGE9MTMpKTphPWI7MTA9PT1hJiYoYT0xMyk7cmV0dXJuIDMyPD1hfHwxMz09PWE/YTowfWZ1bmN0aW9uIHBkKCl7cmV0dXJuITB9ZnVuY3Rpb24gcWQoKXtyZXR1cm4hMX1cbmZ1bmN0aW9uIHJkKGEpe2Z1bmN0aW9uIGIoYixkLGUsZixnKXt0aGlzLl9yZWFjdE5hbWU9Yjt0aGlzLl90YXJnZXRJbnN0PWU7dGhpcy50eXBlPWQ7dGhpcy5uYXRpdmVFdmVudD1mO3RoaXMudGFyZ2V0PWc7dGhpcy5jdXJyZW50VGFyZ2V0PW51bGw7Zm9yKHZhciBjIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShjKSYmKGI9YVtjXSx0aGlzW2NdPWI/YihmKTpmW2NdKTt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD0obnVsbCE9Zi5kZWZhdWx0UHJldmVudGVkP2YuZGVmYXVsdFByZXZlbnRlZDohMT09PWYucmV0dXJuVmFsdWUpP3BkOnFkO3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cWQ7cmV0dXJuIHRoaXN9bShiLnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIGE9dGhpcy5uYXRpdmVFdmVudDthJiYoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6XCJ1bmtub3duXCIhPT10eXBlb2YgYS5yZXR1cm5WYWx1ZSYmXG4oYS5yZXR1cm5WYWx1ZT0hMSksdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cGQpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5hdGl2ZUV2ZW50O2EmJihhLnN0b3BQcm9wYWdhdGlvbj9hLnN0b3BQcm9wYWdhdGlvbigpOlwidW5rbm93blwiIT09dHlwZW9mIGEuY2FuY2VsQnViYmxlJiYoYS5jYW5jZWxCdWJibGU9ITApLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cGQpfSxwZXJzaXN0OmZ1bmN0aW9uKCl7fSxpc1BlcnNpc3RlbnQ6cGR9KTtyZXR1cm4gYn1cbnZhciBzZD17ZXZlbnRQaGFzZTowLGJ1YmJsZXM6MCxjYW5jZWxhYmxlOjAsdGltZVN0YW1wOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRpbWVTdGFtcHx8RGF0ZS5ub3coKX0sZGVmYXVsdFByZXZlbnRlZDowLGlzVHJ1c3RlZDowfSx0ZD1yZChzZCksdWQ9bSh7fSxzZCx7dmlldzowLGRldGFpbDowfSksdmQ9cmQodWQpLHdkLHhkLHlkLEFkPW0oe30sdWQse3NjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxwYWdlWDowLHBhZ2VZOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLGdldE1vZGlmaWVyU3RhdGU6emQsYnV0dG9uOjAsYnV0dG9uczowLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWEucmVsYXRlZFRhcmdldD9hLmZyb21FbGVtZW50PT09YS5zcmNFbGVtZW50P2EudG9FbGVtZW50OmEuZnJvbUVsZW1lbnQ6YS5yZWxhdGVkVGFyZ2V0fSxtb3ZlbWVudFg6ZnVuY3Rpb24oYSl7aWYoXCJtb3ZlbWVudFhcImluXG5hKXJldHVybiBhLm1vdmVtZW50WDthIT09eWQmJih5ZCYmXCJtb3VzZW1vdmVcIj09PWEudHlwZT8od2Q9YS5zY3JlZW5YLXlkLnNjcmVlblgseGQ9YS5zY3JlZW5ZLXlkLnNjcmVlblkpOnhkPXdkPTAseWQ9YSk7cmV0dXJuIHdkfSxtb3ZlbWVudFk6ZnVuY3Rpb24oYSl7cmV0dXJuXCJtb3ZlbWVudFlcImluIGE/YS5tb3ZlbWVudFk6eGR9fSksQmQ9cmQoQWQpLENkPW0oe30sQWQse2RhdGFUcmFuc2ZlcjowfSksRGQ9cmQoQ2QpLEVkPW0oe30sdWQse3JlbGF0ZWRUYXJnZXQ6MH0pLEZkPXJkKEVkKSxHZD1tKHt9LHNkLHthbmltYXRpb25OYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSxIZD1yZChHZCksSWQ9bSh7fSxzZCx7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbihhKXtyZXR1cm5cImNsaXBib2FyZERhdGFcImluIGE/YS5jbGlwYm9hcmREYXRhOndpbmRvdy5jbGlwYm9hcmREYXRhfX0pLEpkPXJkKElkKSxLZD1tKHt9LHNkLHtkYXRhOjB9KSxMZD1yZChLZCksTWQ9e0VzYzpcIkVzY2FwZVwiLFxuU3BhY2ViYXI6XCIgXCIsTGVmdDpcIkFycm93TGVmdFwiLFVwOlwiQXJyb3dVcFwiLFJpZ2h0OlwiQXJyb3dSaWdodFwiLERvd246XCJBcnJvd0Rvd25cIixEZWw6XCJEZWxldGVcIixXaW46XCJPU1wiLE1lbnU6XCJDb250ZXh0TWVudVwiLEFwcHM6XCJDb250ZXh0TWVudVwiLFNjcm9sbDpcIlNjcm9sbExvY2tcIixNb3pQcmludGFibGVLZXk6XCJVbmlkZW50aWZpZWRcIn0sTmQ9ezg6XCJCYWNrc3BhY2VcIiw5OlwiVGFiXCIsMTI6XCJDbGVhclwiLDEzOlwiRW50ZXJcIiwxNjpcIlNoaWZ0XCIsMTc6XCJDb250cm9sXCIsMTg6XCJBbHRcIiwxOTpcIlBhdXNlXCIsMjA6XCJDYXBzTG9ja1wiLDI3OlwiRXNjYXBlXCIsMzI6XCIgXCIsMzM6XCJQYWdlVXBcIiwzNDpcIlBhZ2VEb3duXCIsMzU6XCJFbmRcIiwzNjpcIkhvbWVcIiwzNzpcIkFycm93TGVmdFwiLDM4OlwiQXJyb3dVcFwiLDM5OlwiQXJyb3dSaWdodFwiLDQwOlwiQXJyb3dEb3duXCIsNDU6XCJJbnNlcnRcIiw0NjpcIkRlbGV0ZVwiLDExMjpcIkYxXCIsMTEzOlwiRjJcIiwxMTQ6XCJGM1wiLDExNTpcIkY0XCIsMTE2OlwiRjVcIiwxMTc6XCJGNlwiLDExODpcIkY3XCIsXG4xMTk6XCJGOFwiLDEyMDpcIkY5XCIsMTIxOlwiRjEwXCIsMTIyOlwiRjExXCIsMTIzOlwiRjEyXCIsMTQ0OlwiTnVtTG9ja1wiLDE0NTpcIlNjcm9sbExvY2tcIiwyMjQ6XCJNZXRhXCJ9LE9kPXtBbHQ6XCJhbHRLZXlcIixDb250cm9sOlwiY3RybEtleVwiLE1ldGE6XCJtZXRhS2V5XCIsU2hpZnQ6XCJzaGlmdEtleVwifTtmdW5jdGlvbiBQZChhKXt2YXIgYj10aGlzLm5hdGl2ZUV2ZW50O3JldHVybiBiLmdldE1vZGlmaWVyU3RhdGU/Yi5nZXRNb2RpZmllclN0YXRlKGEpOihhPU9kW2FdKT8hIWJbYV06ITF9ZnVuY3Rpb24gemQoKXtyZXR1cm4gUGR9XG52YXIgUWQ9bSh7fSx1ZCx7a2V5OmZ1bmN0aW9uKGEpe2lmKGEua2V5KXt2YXIgYj1NZFthLmtleV18fGEua2V5O2lmKFwiVW5pZGVudGlmaWVkXCIhPT1iKXJldHVybiBifXJldHVyblwia2V5cHJlc3NcIj09PWEudHlwZT8oYT1vZChhKSwxMz09PWE/XCJFbnRlclwiOlN0cmluZy5mcm9tQ2hhckNvZGUoYSkpOlwia2V5ZG93blwiPT09YS50eXBlfHxcImtleXVwXCI9PT1hLnR5cGU/TmRbYS5rZXlDb2RlXXx8XCJVbmlkZW50aWZpZWRcIjpcIlwifSxjb2RlOjAsbG9jYXRpb246MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAscmVwZWF0OjAsbG9jYWxlOjAsZ2V0TW9kaWZpZXJTdGF0ZTp6ZCxjaGFyQ29kZTpmdW5jdGlvbihhKXtyZXR1cm5cImtleXByZXNzXCI9PT1hLnR5cGU/b2QoYSk6MH0sa2V5Q29kZTpmdW5jdGlvbihhKXtyZXR1cm5cImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP2Eua2V5Q29kZTowfSx3aGljaDpmdW5jdGlvbihhKXtyZXR1cm5cImtleXByZXNzXCI9PT1cbmEudHlwZT9vZChhKTpcImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP2Eua2V5Q29kZTowfX0pLFJkPXJkKFFkKSxTZD1tKHt9LEFkLHtwb2ludGVySWQ6MCx3aWR0aDowLGhlaWdodDowLHByZXNzdXJlOjAsdGFuZ2VudGlhbFByZXNzdXJlOjAsdGlsdFg6MCx0aWx0WTowLHR3aXN0OjAscG9pbnRlclR5cGU6MCxpc1ByaW1hcnk6MH0pLFRkPXJkKFNkKSxVZD1tKHt9LHVkLHt0b3VjaGVzOjAsdGFyZ2V0VG91Y2hlczowLGNoYW5nZWRUb3VjaGVzOjAsYWx0S2V5OjAsbWV0YUtleTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGdldE1vZGlmaWVyU3RhdGU6emR9KSxWZD1yZChVZCksV2Q9bSh7fSxzZCx7cHJvcGVydHlOYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSxYZD1yZChXZCksWWQ9bSh7fSxBZCx7ZGVsdGFYOmZ1bmN0aW9uKGEpe3JldHVyblwiZGVsdGFYXCJpbiBhP2EuZGVsdGFYOlwid2hlZWxEZWx0YVhcImluIGE/LWEud2hlZWxEZWx0YVg6MH0sXG5kZWx0YVk6ZnVuY3Rpb24oYSl7cmV0dXJuXCJkZWx0YVlcImluIGE/YS5kZWx0YVk6XCJ3aGVlbERlbHRhWVwiaW4gYT8tYS53aGVlbERlbHRhWTpcIndoZWVsRGVsdGFcImluIGE/LWEud2hlZWxEZWx0YTowfSxkZWx0YVo6MCxkZWx0YU1vZGU6MH0pLFpkPXJkKFlkKSwkZD1bOSwxMywyNywzMl0sYWU9ZmEmJlwiQ29tcG9zaXRpb25FdmVudFwiaW4gd2luZG93LGJlPW51bGw7ZmEmJlwiZG9jdW1lbnRNb2RlXCJpbiBkb2N1bWVudCYmKGJlPWRvY3VtZW50LmRvY3VtZW50TW9kZSk7dmFyIGNlPWZhJiZcIlRleHRFdmVudFwiaW4gd2luZG93JiYhYmUsZGU9ZmEmJighYWV8fGJlJiY4PGJlJiYxMT49YmUpLGVlPVN0cmluZy5mcm9tQ2hhckNvZGUoMzIpLGZlPSExO1xuZnVuY3Rpb24gZ2UoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImtleXVwXCI6cmV0dXJuLTEhPT0kZC5pbmRleE9mKGIua2V5Q29kZSk7Y2FzZSBcImtleWRvd25cIjpyZXR1cm4gMjI5IT09Yi5rZXlDb2RlO2Nhc2UgXCJrZXlwcmVzc1wiOmNhc2UgXCJtb3VzZWRvd25cIjpjYXNlIFwiZm9jdXNvdXRcIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBoZShhKXthPWEuZGV0YWlsO3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmXCJkYXRhXCJpbiBhP2EuZGF0YTpudWxsfXZhciBpZT0hMTtmdW5jdGlvbiBqZShhLGIpe3N3aXRjaChhKXtjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpyZXR1cm4gaGUoYik7Y2FzZSBcImtleXByZXNzXCI6aWYoMzIhPT1iLndoaWNoKXJldHVybiBudWxsO2ZlPSEwO3JldHVybiBlZTtjYXNlIFwidGV4dElucHV0XCI6cmV0dXJuIGE9Yi5kYXRhLGE9PT1lZSYmZmU/bnVsbDphO2RlZmF1bHQ6cmV0dXJuIG51bGx9fVxuZnVuY3Rpb24ga2UoYSxiKXtpZihpZSlyZXR1cm5cImNvbXBvc2l0aW9uZW5kXCI9PT1hfHwhYWUmJmdlKGEsYik/KGE9bmQoKSxtZD1sZD1rZD1udWxsLGllPSExLGEpOm51bGw7c3dpdGNoKGEpe2Nhc2UgXCJwYXN0ZVwiOnJldHVybiBudWxsO2Nhc2UgXCJrZXlwcmVzc1wiOmlmKCEoYi5jdHJsS2V5fHxiLmFsdEtleXx8Yi5tZXRhS2V5KXx8Yi5jdHJsS2V5JiZiLmFsdEtleSl7aWYoYi5jaGFyJiYxPGIuY2hhci5sZW5ndGgpcmV0dXJuIGIuY2hhcjtpZihiLndoaWNoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIud2hpY2gpfXJldHVybiBudWxsO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOnJldHVybiBkZSYmXCJrb1wiIT09Yi5sb2NhbGU/bnVsbDpiLmRhdGE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19XG52YXIgbGU9e2NvbG9yOiEwLGRhdGU6ITAsZGF0ZXRpbWU6ITAsXCJkYXRldGltZS1sb2NhbFwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07ZnVuY3Rpb24gbWUoYSl7dmFyIGI9YSYmYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVyblwiaW5wdXRcIj09PWI/ISFsZVthLnR5cGVdOlwidGV4dGFyZWFcIj09PWI/ITA6ITF9ZnVuY3Rpb24gbmUoYSxiLGMsZCl7RWIoZCk7Yj1vZShiLFwib25DaGFuZ2VcIik7MDxiLmxlbmd0aCYmKGM9bmV3IHRkKFwib25DaGFuZ2VcIixcImNoYW5nZVwiLG51bGwsYyxkKSxhLnB1c2goe2V2ZW50OmMsbGlzdGVuZXJzOmJ9KSl9dmFyIHBlPW51bGwscWU9bnVsbDtmdW5jdGlvbiByZShhKXtzZShhLDApfWZ1bmN0aW9uIHRlKGEpe3ZhciBiPXVlKGEpO2lmKFdhKGIpKXJldHVybiBhfVxuZnVuY3Rpb24gdmUoYSxiKXtpZihcImNoYW5nZVwiPT09YSlyZXR1cm4gYn12YXIgd2U9ITE7aWYoZmEpe3ZhciB4ZTtpZihmYSl7dmFyIHllPVwib25pbnB1dFwiaW4gZG9jdW1lbnQ7aWYoIXllKXt2YXIgemU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt6ZS5zZXRBdHRyaWJ1dGUoXCJvbmlucHV0XCIsXCJyZXR1cm47XCIpO3llPVwiZnVuY3Rpb25cIj09PXR5cGVvZiB6ZS5vbmlucHV0fXhlPXllfWVsc2UgeGU9ITE7d2U9eGUmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PGRvY3VtZW50LmRvY3VtZW50TW9kZSl9ZnVuY3Rpb24gQWUoKXtwZSYmKHBlLmRldGFjaEV2ZW50KFwib25wcm9wZXJ0eWNoYW5nZVwiLEJlKSxxZT1wZT1udWxsKX1mdW5jdGlvbiBCZShhKXtpZihcInZhbHVlXCI9PT1hLnByb3BlcnR5TmFtZSYmdGUocWUpKXt2YXIgYj1bXTtuZShiLHFlLGEseGIoYSkpO2E9cmU7aWYoS2IpYShiKTtlbHNle0tiPSEwO3RyeXtHYihhLGIpfWZpbmFsbHl7S2I9ITEsTWIoKX19fX1cbmZ1bmN0aW9uIENlKGEsYixjKXtcImZvY3VzaW5cIj09PWE/KEFlKCkscGU9YixxZT1jLHBlLmF0dGFjaEV2ZW50KFwib25wcm9wZXJ0eWNoYW5nZVwiLEJlKSk6XCJmb2N1c291dFwiPT09YSYmQWUoKX1mdW5jdGlvbiBEZShhKXtpZihcInNlbGVjdGlvbmNoYW5nZVwiPT09YXx8XCJrZXl1cFwiPT09YXx8XCJrZXlkb3duXCI9PT1hKXJldHVybiB0ZShxZSl9ZnVuY3Rpb24gRWUoYSxiKXtpZihcImNsaWNrXCI9PT1hKXJldHVybiB0ZShiKX1mdW5jdGlvbiBGZShhLGIpe2lmKFwiaW5wdXRcIj09PWF8fFwiY2hhbmdlXCI9PT1hKXJldHVybiB0ZShiKX1mdW5jdGlvbiBHZShhLGIpe3JldHVybiBhPT09YiYmKDAhPT1hfHwxL2E9PT0xL2IpfHxhIT09YSYmYiE9PWJ9dmFyIEhlPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBPYmplY3QuaXM/T2JqZWN0LmlzOkdlLEllPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5mdW5jdGlvbiBKZShhLGIpe2lmKEhlKGEsYikpcmV0dXJuITA7aWYoXCJvYmplY3RcIiE9PXR5cGVvZiBhfHxudWxsPT09YXx8XCJvYmplY3RcIiE9PXR5cGVvZiBifHxudWxsPT09YilyZXR1cm4hMTt2YXIgYz1PYmplY3Qua2V5cyhhKSxkPU9iamVjdC5rZXlzKGIpO2lmKGMubGVuZ3RoIT09ZC5sZW5ndGgpcmV0dXJuITE7Zm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylpZighSWUuY2FsbChiLGNbZF0pfHwhSGUoYVtjW2RdXSxiW2NbZF1dKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBLZShhKXtmb3IoO2EmJmEuZmlyc3RDaGlsZDspYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9XG5mdW5jdGlvbiBMZShhLGIpe3ZhciBjPUtlKGEpO2E9MDtmb3IodmFyIGQ7Yzspe2lmKDM9PT1jLm5vZGVUeXBlKXtkPWErYy50ZXh0Q29udGVudC5sZW5ndGg7aWYoYTw9YiYmZD49YilyZXR1cm57bm9kZTpjLG9mZnNldDpiLWF9O2E9ZH1hOntmb3IoO2M7KXtpZihjLm5leHRTaWJsaW5nKXtjPWMubmV4dFNpYmxpbmc7YnJlYWsgYX1jPWMucGFyZW50Tm9kZX1jPXZvaWQgMH1jPUtlKGMpfX1mdW5jdGlvbiBNZShhLGIpe3JldHVybiBhJiZiP2E9PT1iPyEwOmEmJjM9PT1hLm5vZGVUeXBlPyExOmImJjM9PT1iLm5vZGVUeXBlP01lKGEsYi5wYXJlbnROb2RlKTpcImNvbnRhaW5zXCJpbiBhP2EuY29udGFpbnMoYik6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8hIShhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJjE2KTohMTohMX1cbmZ1bmN0aW9uIE5lKCl7Zm9yKHZhciBhPXdpbmRvdyxiPVhhKCk7YiBpbnN0YW5jZW9mIGEuSFRNTElGcmFtZUVsZW1lbnQ7KXt0cnl7dmFyIGM9XCJzdHJpbmdcIj09PXR5cGVvZiBiLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZn1jYXRjaChkKXtjPSExfWlmKGMpYT1iLmNvbnRlbnRXaW5kb3c7ZWxzZSBicmVhaztiPVhhKGEuZG9jdW1lbnQpfXJldHVybiBifWZ1bmN0aW9uIE9lKGEpe3ZhciBiPWEmJmEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYiYmKFwiaW5wdXRcIj09PWImJihcInRleHRcIj09PWEudHlwZXx8XCJzZWFyY2hcIj09PWEudHlwZXx8XCJ0ZWxcIj09PWEudHlwZXx8XCJ1cmxcIj09PWEudHlwZXx8XCJwYXNzd29yZFwiPT09YS50eXBlKXx8XCJ0ZXh0YXJlYVwiPT09Ynx8XCJ0cnVlXCI9PT1hLmNvbnRlbnRFZGl0YWJsZSl9XG52YXIgUGU9ZmEmJlwiZG9jdW1lbnRNb2RlXCJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSxRZT1udWxsLFJlPW51bGwsU2U9bnVsbCxUZT0hMTtcbmZ1bmN0aW9uIFVlKGEsYixjKXt2YXIgZD1jLndpbmRvdz09PWM/Yy5kb2N1bWVudDo5PT09Yy5ub2RlVHlwZT9jOmMub3duZXJEb2N1bWVudDtUZXx8bnVsbD09UWV8fFFlIT09WGEoZCl8fChkPVFlLFwic2VsZWN0aW9uU3RhcnRcImluIGQmJk9lKGQpP2Q9e3N0YXJ0OmQuc2VsZWN0aW9uU3RhcnQsZW5kOmQuc2VsZWN0aW9uRW5kfTooZD0oZC5vd25lckRvY3VtZW50JiZkLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCksZD17YW5jaG9yTm9kZTpkLmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OmQuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTpkLmZvY3VzTm9kZSxmb2N1c09mZnNldDpkLmZvY3VzT2Zmc2V0fSksU2UmJkplKFNlLGQpfHwoU2U9ZCxkPW9lKFJlLFwib25TZWxlY3RcIiksMDxkLmxlbmd0aCYmKGI9bmV3IHRkKFwib25TZWxlY3RcIixcInNlbGVjdFwiLG51bGwsYixjKSxhLnB1c2goe2V2ZW50OmIsbGlzdGVuZXJzOmR9KSxiLnRhcmdldD1RZSkpKX1cblBjKFwiY2FuY2VsIGNhbmNlbCBjbGljayBjbGljayBjbG9zZSBjbG9zZSBjb250ZXh0bWVudSBjb250ZXh0TWVudSBjb3B5IGNvcHkgY3V0IGN1dCBhdXhjbGljayBhdXhDbGljayBkYmxjbGljayBkb3VibGVDbGljayBkcmFnZW5kIGRyYWdFbmQgZHJhZ3N0YXJ0IGRyYWdTdGFydCBkcm9wIGRyb3AgZm9jdXNpbiBmb2N1cyBmb2N1c291dCBibHVyIGlucHV0IGlucHV0IGludmFsaWQgaW52YWxpZCBrZXlkb3duIGtleURvd24ga2V5cHJlc3Mga2V5UHJlc3Mga2V5dXAga2V5VXAgbW91c2Vkb3duIG1vdXNlRG93biBtb3VzZXVwIG1vdXNlVXAgcGFzdGUgcGFzdGUgcGF1c2UgcGF1c2UgcGxheSBwbGF5IHBvaW50ZXJjYW5jZWwgcG9pbnRlckNhbmNlbCBwb2ludGVyZG93biBwb2ludGVyRG93biBwb2ludGVydXAgcG9pbnRlclVwIHJhdGVjaGFuZ2UgcmF0ZUNoYW5nZSByZXNldCByZXNldCBzZWVrZWQgc2Vla2VkIHN1Ym1pdCBzdWJtaXQgdG91Y2hjYW5jZWwgdG91Y2hDYW5jZWwgdG91Y2hlbmQgdG91Y2hFbmQgdG91Y2hzdGFydCB0b3VjaFN0YXJ0IHZvbHVtZWNoYW5nZSB2b2x1bWVDaGFuZ2VcIi5zcGxpdChcIiBcIiksXG4wKTtQYyhcImRyYWcgZHJhZyBkcmFnZW50ZXIgZHJhZ0VudGVyIGRyYWdleGl0IGRyYWdFeGl0IGRyYWdsZWF2ZSBkcmFnTGVhdmUgZHJhZ292ZXIgZHJhZ092ZXIgbW91c2Vtb3ZlIG1vdXNlTW92ZSBtb3VzZW91dCBtb3VzZU91dCBtb3VzZW92ZXIgbW91c2VPdmVyIHBvaW50ZXJtb3ZlIHBvaW50ZXJNb3ZlIHBvaW50ZXJvdXQgcG9pbnRlck91dCBwb2ludGVyb3ZlciBwb2ludGVyT3ZlciBzY3JvbGwgc2Nyb2xsIHRvZ2dsZSB0b2dnbGUgdG91Y2htb3ZlIHRvdWNoTW92ZSB3aGVlbCB3aGVlbFwiLnNwbGl0KFwiIFwiKSwxKTtQYyhPYywyKTtmb3IodmFyIFZlPVwiY2hhbmdlIHNlbGVjdGlvbmNoYW5nZSB0ZXh0SW5wdXQgY29tcG9zaXRpb25zdGFydCBjb21wb3NpdGlvbmVuZCBjb21wb3NpdGlvbnVwZGF0ZVwiLnNwbGl0KFwiIFwiKSxXZT0wO1dlPFZlLmxlbmd0aDtXZSsrKU5jLnNldChWZVtXZV0sMCk7ZWEoXCJvbk1vdXNlRW50ZXJcIixbXCJtb3VzZW91dFwiLFwibW91c2VvdmVyXCJdKTtcbmVhKFwib25Nb3VzZUxlYXZlXCIsW1wibW91c2VvdXRcIixcIm1vdXNlb3ZlclwiXSk7ZWEoXCJvblBvaW50ZXJFbnRlclwiLFtcInBvaW50ZXJvdXRcIixcInBvaW50ZXJvdmVyXCJdKTtlYShcIm9uUG9pbnRlckxlYXZlXCIsW1wicG9pbnRlcm91dFwiLFwicG9pbnRlcm92ZXJcIl0pO2RhKFwib25DaGFuZ2VcIixcImNoYW5nZSBjbGljayBmb2N1c2luIGZvY3Vzb3V0IGlucHV0IGtleWRvd24ga2V5dXAgc2VsZWN0aW9uY2hhbmdlXCIuc3BsaXQoXCIgXCIpKTtkYShcIm9uU2VsZWN0XCIsXCJmb2N1c291dCBjb250ZXh0bWVudSBkcmFnZW5kIGZvY3VzaW4ga2V5ZG93biBrZXl1cCBtb3VzZWRvd24gbW91c2V1cCBzZWxlY3Rpb25jaGFuZ2VcIi5zcGxpdChcIiBcIikpO2RhKFwib25CZWZvcmVJbnB1dFwiLFtcImNvbXBvc2l0aW9uZW5kXCIsXCJrZXlwcmVzc1wiLFwidGV4dElucHV0XCIsXCJwYXN0ZVwiXSk7ZGEoXCJvbkNvbXBvc2l0aW9uRW5kXCIsXCJjb21wb3NpdGlvbmVuZCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93blwiLnNwbGl0KFwiIFwiKSk7XG5kYShcIm9uQ29tcG9zaXRpb25TdGFydFwiLFwiY29tcG9zaXRpb25zdGFydCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93blwiLnNwbGl0KFwiIFwiKSk7ZGEoXCJvbkNvbXBvc2l0aW9uVXBkYXRlXCIsXCJjb21wb3NpdGlvbnVwZGF0ZSBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93blwiLnNwbGl0KFwiIFwiKSk7dmFyIFhlPVwiYWJvcnQgY2FucGxheSBjYW5wbGF5dGhyb3VnaCBkdXJhdGlvbmNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBsb2FkZWRkYXRhIGxvYWRlZG1ldGFkYXRhIGxvYWRzdGFydCBwYXVzZSBwbGF5IHBsYXlpbmcgcHJvZ3Jlc3MgcmF0ZWNoYW5nZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1c3BlbmQgdGltZXVwZGF0ZSB2b2x1bWVjaGFuZ2Ugd2FpdGluZ1wiLnNwbGl0KFwiIFwiKSxZZT1uZXcgU2V0KFwiY2FuY2VsIGNsb3NlIGludmFsaWQgbG9hZCBzY3JvbGwgdG9nZ2xlXCIuc3BsaXQoXCIgXCIpLmNvbmNhdChYZSkpO1xuZnVuY3Rpb24gWmUoYSxiLGMpe3ZhciBkPWEudHlwZXx8XCJ1bmtub3duLWV2ZW50XCI7YS5jdXJyZW50VGFyZ2V0PWM7WWIoZCxiLHZvaWQgMCxhKTthLmN1cnJlbnRUYXJnZXQ9bnVsbH1cbmZ1bmN0aW9uIHNlKGEsYil7Yj0wIT09KGImNCk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10sZT1kLmV2ZW50O2Q9ZC5saXN0ZW5lcnM7YTp7dmFyIGY9dm9pZCAwO2lmKGIpZm9yKHZhciBnPWQubGVuZ3RoLTE7MDw9ZztnLS0pe3ZhciBoPWRbZ10saz1oLmluc3RhbmNlLGw9aC5jdXJyZW50VGFyZ2V0O2g9aC5saXN0ZW5lcjtpZihrIT09ZiYmZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGE7WmUoZSxoLGwpO2Y9a31lbHNlIGZvcihnPTA7ZzxkLmxlbmd0aDtnKyspe2g9ZFtnXTtrPWguaW5zdGFuY2U7bD1oLmN1cnJlbnRUYXJnZXQ7aD1oLmxpc3RlbmVyO2lmKGshPT1mJiZlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgYTtaZShlLGgsbCk7Zj1rfX19aWYoVWIpdGhyb3cgYT1WYixVYj0hMSxWYj1udWxsLGE7fVxuZnVuY3Rpb24gRyhhLGIpe3ZhciBjPSRlKGIpLGQ9YStcIl9fYnViYmxlXCI7Yy5oYXMoZCl8fChhZihiLGEsMiwhMSksYy5hZGQoZCkpfXZhciBiZj1cIl9yZWFjdExpc3RlbmluZ1wiK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO2Z1bmN0aW9uIGNmKGEpe2FbYmZdfHwoYVtiZl09ITAsYmEuZm9yRWFjaChmdW5jdGlvbihiKXtZZS5oYXMoYil8fGRmKGIsITEsYSxudWxsKTtkZihiLCEwLGEsbnVsbCl9KSl9XG5mdW5jdGlvbiBkZihhLGIsYyxkKXt2YXIgZT00PGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06MCxmPWM7XCJzZWxlY3Rpb25jaGFuZ2VcIj09PWEmJjkhPT1jLm5vZGVUeXBlJiYoZj1jLm93bmVyRG9jdW1lbnQpO2lmKG51bGwhPT1kJiYhYiYmWWUuaGFzKGEpKXtpZihcInNjcm9sbFwiIT09YSlyZXR1cm47ZXw9MjtmPWR9dmFyIGc9JGUoZiksaD1hK1wiX19cIisoYj9cImNhcHR1cmVcIjpcImJ1YmJsZVwiKTtnLmhhcyhoKXx8KGImJihlfD00KSxhZihmLGEsZSxiKSxnLmFkZChoKSl9XG5mdW5jdGlvbiBhZihhLGIsYyxkKXt2YXIgZT1OYy5nZXQoYik7c3dpdGNoKHZvaWQgMD09PWU/MjplKXtjYXNlIDA6ZT1nZDticmVhaztjYXNlIDE6ZT1pZDticmVhaztkZWZhdWx0OmU9aGR9Yz1lLmJpbmQobnVsbCxiLGMsYSk7ZT12b2lkIDA7IVBifHxcInRvdWNoc3RhcnRcIiE9PWImJlwidG91Y2htb3ZlXCIhPT1iJiZcIndoZWVsXCIhPT1ifHwoZT0hMCk7ZD92b2lkIDAhPT1lP2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMse2NhcHR1cmU6ITAscGFzc2l2ZTplfSk6YS5hZGRFdmVudExpc3RlbmVyKGIsYywhMCk6dm9pZCAwIT09ZT9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLHtwYXNzaXZlOmV9KTphLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX1cbmZ1bmN0aW9uIGpkKGEsYixjLGQsZSl7dmFyIGY9ZDtpZigwPT09KGImMSkmJjA9PT0oYiYyKSYmbnVsbCE9PWQpYTpmb3IoOzspe2lmKG51bGw9PT1kKXJldHVybjt2YXIgZz1kLnRhZztpZigzPT09Z3x8ND09PWcpe3ZhciBoPWQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87aWYoaD09PWV8fDg9PT1oLm5vZGVUeXBlJiZoLnBhcmVudE5vZGU9PT1lKWJyZWFrO2lmKDQ9PT1nKWZvcihnPWQucmV0dXJuO251bGwhPT1nOyl7dmFyIGs9Zy50YWc7aWYoMz09PWt8fDQ9PT1rKWlmKGs9Zy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxrPT09ZXx8OD09PWsubm9kZVR5cGUmJmsucGFyZW50Tm9kZT09PWUpcmV0dXJuO2c9Zy5yZXR1cm59Zm9yKDtudWxsIT09aDspe2c9d2MoaCk7aWYobnVsbD09PWcpcmV0dXJuO2s9Zy50YWc7aWYoNT09PWt8fDY9PT1rKXtkPWY9Zztjb250aW51ZSBhfWg9aC5wYXJlbnROb2RlfX1kPWQucmV0dXJufU5iKGZ1bmN0aW9uKCl7dmFyIGQ9ZixlPXhiKGMpLGc9W107XG5hOnt2YXIgaD1NYy5nZXQoYSk7aWYodm9pZCAwIT09aCl7dmFyIGs9dGQseD1hO3N3aXRjaChhKXtjYXNlIFwia2V5cHJlc3NcIjppZigwPT09b2QoYykpYnJlYWsgYTtjYXNlIFwia2V5ZG93blwiOmNhc2UgXCJrZXl1cFwiOms9UmQ7YnJlYWs7Y2FzZSBcImZvY3VzaW5cIjp4PVwiZm9jdXNcIjtrPUZkO2JyZWFrO2Nhc2UgXCJmb2N1c291dFwiOng9XCJibHVyXCI7az1GZDticmVhaztjYXNlIFwiYmVmb3JlYmx1clwiOmNhc2UgXCJhZnRlcmJsdXJcIjprPUZkO2JyZWFrO2Nhc2UgXCJjbGlja1wiOmlmKDI9PT1jLmJ1dHRvbilicmVhayBhO2Nhc2UgXCJhdXhjbGlja1wiOmNhc2UgXCJkYmxjbGlja1wiOmNhc2UgXCJtb3VzZWRvd25cIjpjYXNlIFwibW91c2Vtb3ZlXCI6Y2FzZSBcIm1vdXNldXBcIjpjYXNlIFwibW91c2VvdXRcIjpjYXNlIFwibW91c2VvdmVyXCI6Y2FzZSBcImNvbnRleHRtZW51XCI6az1CZDticmVhaztjYXNlIFwiZHJhZ1wiOmNhc2UgXCJkcmFnZW5kXCI6Y2FzZSBcImRyYWdlbnRlclwiOmNhc2UgXCJkcmFnZXhpdFwiOmNhc2UgXCJkcmFnbGVhdmVcIjpjYXNlIFwiZHJhZ292ZXJcIjpjYXNlIFwiZHJhZ3N0YXJ0XCI6Y2FzZSBcImRyb3BcIjprPVxuRGQ7YnJlYWs7Y2FzZSBcInRvdWNoY2FuY2VsXCI6Y2FzZSBcInRvdWNoZW5kXCI6Y2FzZSBcInRvdWNobW92ZVwiOmNhc2UgXCJ0b3VjaHN0YXJ0XCI6az1WZDticmVhaztjYXNlIEljOmNhc2UgSmM6Y2FzZSBLYzprPUhkO2JyZWFrO2Nhc2UgTGM6az1YZDticmVhaztjYXNlIFwic2Nyb2xsXCI6az12ZDticmVhaztjYXNlIFwid2hlZWxcIjprPVpkO2JyZWFrO2Nhc2UgXCJjb3B5XCI6Y2FzZSBcImN1dFwiOmNhc2UgXCJwYXN0ZVwiOms9SmQ7YnJlYWs7Y2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6Y2FzZSBcImxvc3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJwb2ludGVyY2FuY2VsXCI6Y2FzZSBcInBvaW50ZXJkb3duXCI6Y2FzZSBcInBvaW50ZXJtb3ZlXCI6Y2FzZSBcInBvaW50ZXJvdXRcIjpjYXNlIFwicG9pbnRlcm92ZXJcIjpjYXNlIFwicG9pbnRlcnVwXCI6az1UZH12YXIgdz0wIT09KGImNCksej0hdyYmXCJzY3JvbGxcIj09PWEsdT13P251bGwhPT1oP2grXCJDYXB0dXJlXCI6bnVsbDpoO3c9W107Zm9yKHZhciB0PWQscTtudWxsIT09XG50Oyl7cT10O3ZhciB2PXEuc3RhdGVOb2RlOzU9PT1xLnRhZyYmbnVsbCE9PXYmJihxPXYsbnVsbCE9PXUmJih2PU9iKHQsdSksbnVsbCE9diYmdy5wdXNoKGVmKHQsdixxKSkpKTtpZih6KWJyZWFrO3Q9dC5yZXR1cm59MDx3Lmxlbmd0aCYmKGg9bmV3IGsoaCx4LG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OmgsbGlzdGVuZXJzOnd9KSl9fWlmKDA9PT0oYiY3KSl7YTp7aD1cIm1vdXNlb3ZlclwiPT09YXx8XCJwb2ludGVyb3ZlclwiPT09YTtrPVwibW91c2VvdXRcIj09PWF8fFwicG9pbnRlcm91dFwiPT09YTtpZihoJiYwPT09KGImMTYpJiYoeD1jLnJlbGF0ZWRUYXJnZXR8fGMuZnJvbUVsZW1lbnQpJiYod2MoeCl8fHhbZmZdKSlicmVhayBhO2lmKGt8fGgpe2g9ZS53aW5kb3c9PT1lP2U6KGg9ZS5vd25lckRvY3VtZW50KT9oLmRlZmF1bHRWaWV3fHxoLnBhcmVudFdpbmRvdzp3aW5kb3c7aWYoayl7aWYoeD1jLnJlbGF0ZWRUYXJnZXR8fGMudG9FbGVtZW50LGs9ZCx4PXg/d2MoeCk6bnVsbCxudWxsIT09XG54JiYoej1aYih4KSx4IT09enx8NSE9PXgudGFnJiY2IT09eC50YWcpKXg9bnVsbH1lbHNlIGs9bnVsbCx4PWQ7aWYoayE9PXgpe3c9QmQ7dj1cIm9uTW91c2VMZWF2ZVwiO3U9XCJvbk1vdXNlRW50ZXJcIjt0PVwibW91c2VcIjtpZihcInBvaW50ZXJvdXRcIj09PWF8fFwicG9pbnRlcm92ZXJcIj09PWEpdz1UZCx2PVwib25Qb2ludGVyTGVhdmVcIix1PVwib25Qb2ludGVyRW50ZXJcIix0PVwicG9pbnRlclwiO3o9bnVsbD09az9oOnVlKGspO3E9bnVsbD09eD9oOnVlKHgpO2g9bmV3IHcodix0K1wibGVhdmVcIixrLGMsZSk7aC50YXJnZXQ9ejtoLnJlbGF0ZWRUYXJnZXQ9cTt2PW51bGw7d2MoZSk9PT1kJiYodz1uZXcgdyh1LHQrXCJlbnRlclwiLHgsYyxlKSx3LnRhcmdldD1xLHcucmVsYXRlZFRhcmdldD16LHY9dyk7ej12O2lmKGsmJngpYjp7dz1rO3U9eDt0PTA7Zm9yKHE9dztxO3E9Z2YocSkpdCsrO3E9MDtmb3Iodj11O3Y7dj1nZih2KSlxKys7Zm9yKDswPHQtcTspdz1nZih3KSx0LS07Zm9yKDswPHEtdDspdT1cbmdmKHUpLHEtLTtmb3IoO3QtLTspe2lmKHc9PT11fHxudWxsIT09dSYmdz09PXUuYWx0ZXJuYXRlKWJyZWFrIGI7dz1nZih3KTt1PWdmKHUpfXc9bnVsbH1lbHNlIHc9bnVsbDtudWxsIT09ayYmaGYoZyxoLGssdywhMSk7bnVsbCE9PXgmJm51bGwhPT16JiZoZihnLHoseCx3LCEwKX19fWE6e2g9ZD91ZShkKTp3aW5kb3c7az1oLm5vZGVOYW1lJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoXCJzZWxlY3RcIj09PWt8fFwiaW5wdXRcIj09PWsmJlwiZmlsZVwiPT09aC50eXBlKXZhciBKPXZlO2Vsc2UgaWYobWUoaCkpaWYod2UpSj1GZTtlbHNle0o9RGU7dmFyIEs9Q2V9ZWxzZShrPWgubm9kZU5hbWUpJiZcImlucHV0XCI9PT1rLnRvTG93ZXJDYXNlKCkmJihcImNoZWNrYm94XCI9PT1oLnR5cGV8fFwicmFkaW9cIj09PWgudHlwZSkmJihKPUVlKTtpZihKJiYoSj1KKGEsZCkpKXtuZShnLEosYyxlKTticmVhayBhfUsmJksoYSxoLGQpO1wiZm9jdXNvdXRcIj09PWEmJihLPWguX3dyYXBwZXJTdGF0ZSkmJlxuSy5jb250cm9sbGVkJiZcIm51bWJlclwiPT09aC50eXBlJiZiYihoLFwibnVtYmVyXCIsaC52YWx1ZSl9Sz1kP3VlKGQpOndpbmRvdztzd2l0Y2goYSl7Y2FzZSBcImZvY3VzaW5cIjppZihtZShLKXx8XCJ0cnVlXCI9PT1LLmNvbnRlbnRFZGl0YWJsZSlRZT1LLFJlPWQsU2U9bnVsbDticmVhaztjYXNlIFwiZm9jdXNvdXRcIjpTZT1SZT1RZT1udWxsO2JyZWFrO2Nhc2UgXCJtb3VzZWRvd25cIjpUZT0hMDticmVhaztjYXNlIFwiY29udGV4dG1lbnVcIjpjYXNlIFwibW91c2V1cFwiOmNhc2UgXCJkcmFnZW5kXCI6VGU9ITE7VWUoZyxjLGUpO2JyZWFrO2Nhc2UgXCJzZWxlY3Rpb25jaGFuZ2VcIjppZihQZSlicmVhaztjYXNlIFwia2V5ZG93blwiOmNhc2UgXCJrZXl1cFwiOlVlKGcsYyxlKX12YXIgUTtpZihhZSliOntzd2l0Y2goYSl7Y2FzZSBcImNvbXBvc2l0aW9uc3RhcnRcIjp2YXIgTD1cIm9uQ29tcG9zaXRpb25TdGFydFwiO2JyZWFrIGI7Y2FzZSBcImNvbXBvc2l0aW9uZW5kXCI6TD1cIm9uQ29tcG9zaXRpb25FbmRcIjticmVhayBiO1xuY2FzZSBcImNvbXBvc2l0aW9udXBkYXRlXCI6TD1cIm9uQ29tcG9zaXRpb25VcGRhdGVcIjticmVhayBifUw9dm9pZCAwfWVsc2UgaWU/Z2UoYSxjKSYmKEw9XCJvbkNvbXBvc2l0aW9uRW5kXCIpOlwia2V5ZG93blwiPT09YSYmMjI5PT09Yy5rZXlDb2RlJiYoTD1cIm9uQ29tcG9zaXRpb25TdGFydFwiKTtMJiYoZGUmJlwia29cIiE9PWMubG9jYWxlJiYoaWV8fFwib25Db21wb3NpdGlvblN0YXJ0XCIhPT1MP1wib25Db21wb3NpdGlvbkVuZFwiPT09TCYmaWUmJihRPW5kKCkpOihrZD1lLGxkPVwidmFsdWVcImluIGtkP2tkLnZhbHVlOmtkLnRleHRDb250ZW50LGllPSEwKSksSz1vZShkLEwpLDA8Sy5sZW5ndGgmJihMPW5ldyBMZChMLGEsbnVsbCxjLGUpLGcucHVzaCh7ZXZlbnQ6TCxsaXN0ZW5lcnM6S30pLFE/TC5kYXRhPVE6KFE9aGUoYyksbnVsbCE9PVEmJihMLmRhdGE9USkpKSk7aWYoUT1jZT9qZShhLGMpOmtlKGEsYykpZD1vZShkLFwib25CZWZvcmVJbnB1dFwiKSwwPGQubGVuZ3RoJiYoZT1uZXcgTGQoXCJvbkJlZm9yZUlucHV0XCIsXG5cImJlZm9yZWlucHV0XCIsbnVsbCxjLGUpLGcucHVzaCh7ZXZlbnQ6ZSxsaXN0ZW5lcnM6ZH0pLGUuZGF0YT1RKX1zZShnLGIpfSl9ZnVuY3Rpb24gZWYoYSxiLGMpe3JldHVybntpbnN0YW5jZTphLGxpc3RlbmVyOmIsY3VycmVudFRhcmdldDpjfX1mdW5jdGlvbiBvZShhLGIpe2Zvcih2YXIgYz1iK1wiQ2FwdHVyZVwiLGQ9W107bnVsbCE9PWE7KXt2YXIgZT1hLGY9ZS5zdGF0ZU5vZGU7NT09PWUudGFnJiZudWxsIT09ZiYmKGU9ZixmPU9iKGEsYyksbnVsbCE9ZiYmZC51bnNoaWZ0KGVmKGEsZixlKSksZj1PYihhLGIpLG51bGwhPWYmJmQucHVzaChlZihhLGYsZSkpKTthPWEucmV0dXJufXJldHVybiBkfWZ1bmN0aW9uIGdmKGEpe2lmKG51bGw9PT1hKXJldHVybiBudWxsO2RvIGE9YS5yZXR1cm47d2hpbGUoYSYmNSE9PWEudGFnKTtyZXR1cm4gYT9hOm51bGx9XG5mdW5jdGlvbiBoZihhLGIsYyxkLGUpe2Zvcih2YXIgZj1iLl9yZWFjdE5hbWUsZz1bXTtudWxsIT09YyYmYyE9PWQ7KXt2YXIgaD1jLGs9aC5hbHRlcm5hdGUsbD1oLnN0YXRlTm9kZTtpZihudWxsIT09ayYmaz09PWQpYnJlYWs7NT09PWgudGFnJiZudWxsIT09bCYmKGg9bCxlPyhrPU9iKGMsZiksbnVsbCE9ayYmZy51bnNoaWZ0KGVmKGMsayxoKSkpOmV8fChrPU9iKGMsZiksbnVsbCE9ayYmZy5wdXNoKGVmKGMsayxoKSkpKTtjPWMucmV0dXJufTAhPT1nLmxlbmd0aCYmYS5wdXNoKHtldmVudDpiLGxpc3RlbmVyczpnfSl9ZnVuY3Rpb24gamYoKXt9dmFyIGtmPW51bGwsbGY9bnVsbDtmdW5jdGlvbiBtZihhLGIpe3N3aXRjaChhKXtjYXNlIFwiYnV0dG9uXCI6Y2FzZSBcImlucHV0XCI6Y2FzZSBcInNlbGVjdFwiOmNhc2UgXCJ0ZXh0YXJlYVwiOnJldHVybiEhYi5hdXRvRm9jdXN9cmV0dXJuITF9XG5mdW5jdGlvbiBuZihhLGIpe3JldHVyblwidGV4dGFyZWFcIj09PWF8fFwib3B0aW9uXCI9PT1hfHxcIm5vc2NyaXB0XCI9PT1hfHxcInN0cmluZ1wiPT09dHlwZW9mIGIuY2hpbGRyZW58fFwibnVtYmVyXCI9PT10eXBlb2YgYi5jaGlsZHJlbnx8XCJvYmplY3RcIj09PXR5cGVvZiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZudWxsIT09Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCYmbnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWx9dmFyIG9mPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6dm9pZCAwLHBmPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OnZvaWQgMDtmdW5jdGlvbiBxZihhKXsxPT09YS5ub2RlVHlwZT9hLnRleHRDb250ZW50PVwiXCI6OT09PWEubm9kZVR5cGUmJihhPWEuYm9keSxudWxsIT1hJiYoYS50ZXh0Q29udGVudD1cIlwiKSl9XG5mdW5jdGlvbiByZihhKXtmb3IoO251bGwhPWE7YT1hLm5leHRTaWJsaW5nKXt2YXIgYj1hLm5vZGVUeXBlO2lmKDE9PT1ifHwzPT09YilicmVha31yZXR1cm4gYX1mdW5jdGlvbiBzZihhKXthPWEucHJldmlvdXNTaWJsaW5nO2Zvcih2YXIgYj0wO2E7KXtpZig4PT09YS5ub2RlVHlwZSl7dmFyIGM9YS5kYXRhO2lmKFwiJFwiPT09Y3x8XCIkIVwiPT09Y3x8XCIkP1wiPT09Yyl7aWYoMD09PWIpcmV0dXJuIGE7Yi0tfWVsc2VcIi8kXCI9PT1jJiZiKyt9YT1hLnByZXZpb3VzU2libGluZ31yZXR1cm4gbnVsbH12YXIgdGY9MDtmdW5jdGlvbiB1ZihhKXtyZXR1cm57JCR0eXBlb2Y6R2EsdG9TdHJpbmc6YSx2YWx1ZU9mOmF9fXZhciB2Zj1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSx3Zj1cIl9fcmVhY3RGaWJlciRcIit2Zix4Zj1cIl9fcmVhY3RQcm9wcyRcIit2ZixmZj1cIl9fcmVhY3RDb250YWluZXIkXCIrdmYseWY9XCJfX3JlYWN0RXZlbnRzJFwiK3ZmO1xuZnVuY3Rpb24gd2MoYSl7dmFyIGI9YVt3Zl07aWYoYilyZXR1cm4gYjtmb3IodmFyIGM9YS5wYXJlbnROb2RlO2M7KXtpZihiPWNbZmZdfHxjW3dmXSl7Yz1iLmFsdGVybmF0ZTtpZihudWxsIT09Yi5jaGlsZHx8bnVsbCE9PWMmJm51bGwhPT1jLmNoaWxkKWZvcihhPXNmKGEpO251bGwhPT1hOyl7aWYoYz1hW3dmXSlyZXR1cm4gYzthPXNmKGEpfXJldHVybiBifWE9YztjPWEucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBDYihhKXthPWFbd2ZdfHxhW2ZmXTtyZXR1cm4hYXx8NSE9PWEudGFnJiY2IT09YS50YWcmJjEzIT09YS50YWcmJjMhPT1hLnRhZz9udWxsOmF9ZnVuY3Rpb24gdWUoYSl7aWYoNT09PWEudGFnfHw2PT09YS50YWcpcmV0dXJuIGEuc3RhdGVOb2RlO3Rocm93IEVycm9yKHkoMzMpKTt9ZnVuY3Rpb24gRGIoYSl7cmV0dXJuIGFbeGZdfHxudWxsfVxuZnVuY3Rpb24gJGUoYSl7dmFyIGI9YVt5Zl07dm9pZCAwPT09YiYmKGI9YVt5Zl09bmV3IFNldCk7cmV0dXJuIGJ9dmFyIHpmPVtdLEFmPS0xO2Z1bmN0aW9uIEJmKGEpe3JldHVybntjdXJyZW50OmF9fWZ1bmN0aW9uIEgoYSl7MD5BZnx8KGEuY3VycmVudD16ZltBZl0semZbQWZdPW51bGwsQWYtLSl9ZnVuY3Rpb24gSShhLGIpe0FmKys7emZbQWZdPWEuY3VycmVudDthLmN1cnJlbnQ9Yn12YXIgQ2Y9e30sTT1CZihDZiksTj1CZighMSksRGY9Q2Y7XG5mdW5jdGlvbiBFZihhLGIpe3ZhciBjPWEudHlwZS5jb250ZXh0VHlwZXM7aWYoIWMpcmV0dXJuIENmO3ZhciBkPWEuc3RhdGVOb2RlO2lmKGQmJmQuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD09PWIpcmV0dXJuIGQuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7dmFyIGU9e30sZjtmb3IoZiBpbiBjKWVbZl09YltmXTtkJiYoYT1hLnN0YXRlTm9kZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9YixhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWUpO3JldHVybiBlfWZ1bmN0aW9uIEZmKGEpe2E9YS5jaGlsZENvbnRleHRUeXBlcztyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWF9ZnVuY3Rpb24gR2YoKXtIKE4pO0goTSl9ZnVuY3Rpb24gSGYoYSxiLGMpe2lmKE0uY3VycmVudCE9PUNmKXRocm93IEVycm9yKHkoMTY4KSk7SShNLGIpO0koTixjKX1cbmZ1bmN0aW9uIElmKGEsYixjKXt2YXIgZD1hLnN0YXRlTm9kZTthPWIuY2hpbGRDb250ZXh0VHlwZXM7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGQuZ2V0Q2hpbGRDb250ZXh0KXJldHVybiBjO2Q9ZC5nZXRDaGlsZENvbnRleHQoKTtmb3IodmFyIGUgaW4gZClpZighKGUgaW4gYSkpdGhyb3cgRXJyb3IoeSgxMDgsUmEoYil8fFwiVW5rbm93blwiLGUpKTtyZXR1cm4gbSh7fSxjLGQpfWZ1bmN0aW9uIEpmKGEpe2E9KGE9YS5zdGF0ZU5vZGUpJiZhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0fHxDZjtEZj1NLmN1cnJlbnQ7SShNLGEpO0koTixOLmN1cnJlbnQpO3JldHVybiEwfWZ1bmN0aW9uIEtmKGEsYixjKXt2YXIgZD1hLnN0YXRlTm9kZTtpZighZCl0aHJvdyBFcnJvcih5KDE2OSkpO2M/KGE9SWYoYSxiLERmKSxkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0PWEsSChOKSxIKE0pLEkoTSxhKSk6SChOKTtJKE4sYyl9XG52YXIgTGY9bnVsbCxNZj1udWxsLE5mPXIudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5LE9mPXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayxQZj1yLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrLFFmPXIudW5zdGFibGVfc2hvdWxkWWllbGQsUmY9ci51bnN0YWJsZV9yZXF1ZXN0UGFpbnQsU2Y9ci51bnN0YWJsZV9ub3csVGY9ci51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCxVZj1yLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LFZmPXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksV2Y9ci51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSxYZj1yLnVuc3RhYmxlX0xvd1ByaW9yaXR5LFlmPXIudW5zdGFibGVfSWRsZVByaW9yaXR5LFpmPXt9LCRmPXZvaWQgMCE9PVJmP1JmOmZ1bmN0aW9uKCl7fSxhZz1udWxsLGJnPW51bGwsY2c9ITEsZGc9U2YoKSxPPTFFND5kZz9TZjpmdW5jdGlvbigpe3JldHVybiBTZigpLWRnfTtcbmZ1bmN0aW9uIGVnKCl7c3dpdGNoKFRmKCkpe2Nhc2UgVWY6cmV0dXJuIDk5O2Nhc2UgVmY6cmV0dXJuIDk4O2Nhc2UgV2Y6cmV0dXJuIDk3O2Nhc2UgWGY6cmV0dXJuIDk2O2Nhc2UgWWY6cmV0dXJuIDk1O2RlZmF1bHQ6dGhyb3cgRXJyb3IoeSgzMzIpKTt9fWZ1bmN0aW9uIGZnKGEpe3N3aXRjaChhKXtjYXNlIDk5OnJldHVybiBVZjtjYXNlIDk4OnJldHVybiBWZjtjYXNlIDk3OnJldHVybiBXZjtjYXNlIDk2OnJldHVybiBYZjtjYXNlIDk1OnJldHVybiBZZjtkZWZhdWx0OnRocm93IEVycm9yKHkoMzMyKSk7fX1mdW5jdGlvbiBnZyhhLGIpe2E9ZmcoYSk7cmV0dXJuIE5mKGEsYil9ZnVuY3Rpb24gaGcoYSxiLGMpe2E9ZmcoYSk7cmV0dXJuIE9mKGEsYixjKX1mdW5jdGlvbiBpZygpe2lmKG51bGwhPT1iZyl7dmFyIGE9Ymc7Ymc9bnVsbDtQZihhKX1qZygpfVxuZnVuY3Rpb24gamcoKXtpZighY2cmJm51bGwhPT1hZyl7Y2c9ITA7dmFyIGE9MDt0cnl7dmFyIGI9YWc7Z2coOTksZnVuY3Rpb24oKXtmb3IoO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1iW2FdO2RvIGM9YyghMCk7d2hpbGUobnVsbCE9PWMpfX0pO2FnPW51bGx9Y2F0Y2goYyl7dGhyb3cgbnVsbCE9PWFnJiYoYWc9YWcuc2xpY2UoYSsxKSksT2YoVWYsaWcpLGM7fWZpbmFsbHl7Y2c9ITF9fX12YXIga2c9cmEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7ZnVuY3Rpb24gbGcoYSxiKXtpZihhJiZhLmRlZmF1bHRQcm9wcyl7Yj1tKHt9LGIpO2E9YS5kZWZhdWx0UHJvcHM7Zm9yKHZhciBjIGluIGEpdm9pZCAwPT09YltjXSYmKGJbY109YVtjXSk7cmV0dXJuIGJ9cmV0dXJuIGJ9dmFyIG1nPUJmKG51bGwpLG5nPW51bGwsb2c9bnVsbCxwZz1udWxsO2Z1bmN0aW9uIHFnKCl7cGc9b2c9bmc9bnVsbH1cbmZ1bmN0aW9uIHJnKGEpe3ZhciBiPW1nLmN1cnJlbnQ7SChtZyk7YS50eXBlLl9jb250ZXh0Ll9jdXJyZW50VmFsdWU9Yn1mdW5jdGlvbiBzZyhhLGIpe2Zvcig7bnVsbCE9PWE7KXt2YXIgYz1hLmFsdGVybmF0ZTtpZigoYS5jaGlsZExhbmVzJmIpPT09YilpZihudWxsPT09Y3x8KGMuY2hpbGRMYW5lcyZiKT09PWIpYnJlYWs7ZWxzZSBjLmNoaWxkTGFuZXN8PWI7ZWxzZSBhLmNoaWxkTGFuZXN8PWIsbnVsbCE9PWMmJihjLmNoaWxkTGFuZXN8PWIpO2E9YS5yZXR1cm59fWZ1bmN0aW9uIHRnKGEsYil7bmc9YTtwZz1vZz1udWxsO2E9YS5kZXBlbmRlbmNpZXM7bnVsbCE9PWEmJm51bGwhPT1hLmZpcnN0Q29udGV4dCYmKDAhPT0oYS5sYW5lcyZiKSYmKHVnPSEwKSxhLmZpcnN0Q29udGV4dD1udWxsKX1cbmZ1bmN0aW9uIHZnKGEsYil7aWYocGchPT1hJiYhMSE9PWImJjAhPT1iKXtpZihcIm51bWJlclwiIT09dHlwZW9mIGJ8fDEwNzM3NDE4MjM9PT1iKXBnPWEsYj0xMDczNzQxODIzO2I9e2NvbnRleHQ6YSxvYnNlcnZlZEJpdHM6YixuZXh0Om51bGx9O2lmKG51bGw9PT1vZyl7aWYobnVsbD09PW5nKXRocm93IEVycm9yKHkoMzA4KSk7b2c9YjtuZy5kZXBlbmRlbmNpZXM9e2xhbmVzOjAsZmlyc3RDb250ZXh0OmIscmVzcG9uZGVyczpudWxsfX1lbHNlIG9nPW9nLm5leHQ9Yn1yZXR1cm4gYS5fY3VycmVudFZhbHVlfXZhciB3Zz0hMTtmdW5jdGlvbiB4ZyhhKXthLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6YS5tZW1vaXplZFN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpudWxsLGxhc3RCYXNlVXBkYXRlOm51bGwsc2hhcmVkOntwZW5kaW5nOm51bGx9LGVmZmVjdHM6bnVsbH19XG5mdW5jdGlvbiB5ZyhhLGIpe2E9YS51cGRhdGVRdWV1ZTtiLnVwZGF0ZVF1ZXVlPT09YSYmKGIudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTphLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6YS5maXJzdEJhc2VVcGRhdGUsbGFzdEJhc2VVcGRhdGU6YS5sYXN0QmFzZVVwZGF0ZSxzaGFyZWQ6YS5zaGFyZWQsZWZmZWN0czphLmVmZmVjdHN9KX1mdW5jdGlvbiB6ZyhhLGIpe3JldHVybntldmVudFRpbWU6YSxsYW5lOmIsdGFnOjAscGF5bG9hZDpudWxsLGNhbGxiYWNrOm51bGwsbmV4dDpudWxsfX1mdW5jdGlvbiBBZyhhLGIpe2E9YS51cGRhdGVRdWV1ZTtpZihudWxsIT09YSl7YT1hLnNoYXJlZDt2YXIgYz1hLnBlbmRpbmc7bnVsbD09PWM/Yi5uZXh0PWI6KGIubmV4dD1jLm5leHQsYy5uZXh0PWIpO2EucGVuZGluZz1ifX1cbmZ1bmN0aW9uIEJnKGEsYil7dmFyIGM9YS51cGRhdGVRdWV1ZSxkPWEuYWx0ZXJuYXRlO2lmKG51bGwhPT1kJiYoZD1kLnVwZGF0ZVF1ZXVlLGM9PT1kKSl7dmFyIGU9bnVsbCxmPW51bGw7Yz1jLmZpcnN0QmFzZVVwZGF0ZTtpZihudWxsIT09Yyl7ZG97dmFyIGc9e2V2ZW50VGltZTpjLmV2ZW50VGltZSxsYW5lOmMubGFuZSx0YWc6Yy50YWcscGF5bG9hZDpjLnBheWxvYWQsY2FsbGJhY2s6Yy5jYWxsYmFjayxuZXh0Om51bGx9O251bGw9PT1mP2U9Zj1nOmY9Zi5uZXh0PWc7Yz1jLm5leHR9d2hpbGUobnVsbCE9PWMpO251bGw9PT1mP2U9Zj1iOmY9Zi5uZXh0PWJ9ZWxzZSBlPWY9YjtjPXtiYXNlU3RhdGU6ZC5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmUsbGFzdEJhc2VVcGRhdGU6ZixzaGFyZWQ6ZC5zaGFyZWQsZWZmZWN0czpkLmVmZmVjdHN9O2EudXBkYXRlUXVldWU9YztyZXR1cm59YT1jLmxhc3RCYXNlVXBkYXRlO251bGw9PT1hP2MuZmlyc3RCYXNlVXBkYXRlPWI6YS5uZXh0PVxuYjtjLmxhc3RCYXNlVXBkYXRlPWJ9XG5mdW5jdGlvbiBDZyhhLGIsYyxkKXt2YXIgZT1hLnVwZGF0ZVF1ZXVlO3dnPSExO3ZhciBmPWUuZmlyc3RCYXNlVXBkYXRlLGc9ZS5sYXN0QmFzZVVwZGF0ZSxoPWUuc2hhcmVkLnBlbmRpbmc7aWYobnVsbCE9PWgpe2Uuc2hhcmVkLnBlbmRpbmc9bnVsbDt2YXIgaz1oLGw9ay5uZXh0O2submV4dD1udWxsO251bGw9PT1nP2Y9bDpnLm5leHQ9bDtnPWs7dmFyIG49YS5hbHRlcm5hdGU7aWYobnVsbCE9PW4pe249bi51cGRhdGVRdWV1ZTt2YXIgQT1uLmxhc3RCYXNlVXBkYXRlO0EhPT1nJiYobnVsbD09PUE/bi5maXJzdEJhc2VVcGRhdGU9bDpBLm5leHQ9bCxuLmxhc3RCYXNlVXBkYXRlPWspfX1pZihudWxsIT09Zil7QT1lLmJhc2VTdGF0ZTtnPTA7bj1sPWs9bnVsbDtkb3toPWYubGFuZTt2YXIgcD1mLmV2ZW50VGltZTtpZigoZCZoKT09PWgpe251bGwhPT1uJiYobj1uLm5leHQ9e2V2ZW50VGltZTpwLGxhbmU6MCx0YWc6Zi50YWcscGF5bG9hZDpmLnBheWxvYWQsY2FsbGJhY2s6Zi5jYWxsYmFjayxcbm5leHQ6bnVsbH0pO2E6e3ZhciBDPWEseD1mO2g9YjtwPWM7c3dpdGNoKHgudGFnKXtjYXNlIDE6Qz14LnBheWxvYWQ7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIEMpe0E9Qy5jYWxsKHAsQSxoKTticmVhayBhfUE9QzticmVhayBhO2Nhc2UgMzpDLmZsYWdzPUMuZmxhZ3MmLTQwOTd8NjQ7Y2FzZSAwOkM9eC5wYXlsb2FkO2g9XCJmdW5jdGlvblwiPT09dHlwZW9mIEM/Qy5jYWxsKHAsQSxoKTpDO2lmKG51bGw9PT1ofHx2b2lkIDA9PT1oKWJyZWFrIGE7QT1tKHt9LEEsaCk7YnJlYWsgYTtjYXNlIDI6d2c9ITB9fW51bGwhPT1mLmNhbGxiYWNrJiYoYS5mbGFnc3w9MzIsaD1lLmVmZmVjdHMsbnVsbD09PWg/ZS5lZmZlY3RzPVtmXTpoLnB1c2goZikpfWVsc2UgcD17ZXZlbnRUaW1lOnAsbGFuZTpoLHRhZzpmLnRhZyxwYXlsb2FkOmYucGF5bG9hZCxjYWxsYmFjazpmLmNhbGxiYWNrLG5leHQ6bnVsbH0sbnVsbD09PW4/KGw9bj1wLGs9QSk6bj1uLm5leHQ9cCxnfD1oO2Y9Zi5uZXh0O2lmKG51bGw9PT1cbmYpaWYoaD1lLnNoYXJlZC5wZW5kaW5nLG51bGw9PT1oKWJyZWFrO2Vsc2UgZj1oLm5leHQsaC5uZXh0PW51bGwsZS5sYXN0QmFzZVVwZGF0ZT1oLGUuc2hhcmVkLnBlbmRpbmc9bnVsbH13aGlsZSgxKTtudWxsPT09biYmKGs9QSk7ZS5iYXNlU3RhdGU9aztlLmZpcnN0QmFzZVVwZGF0ZT1sO2UubGFzdEJhc2VVcGRhdGU9bjtEZ3w9ZzthLmxhbmVzPWc7YS5tZW1vaXplZFN0YXRlPUF9fWZ1bmN0aW9uIEVnKGEsYixjKXthPWIuZWZmZWN0cztiLmVmZmVjdHM9bnVsbDtpZihudWxsIT09YSlmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLGU9ZC5jYWxsYmFjaztpZihudWxsIT09ZSl7ZC5jYWxsYmFjaz1udWxsO2Q9YztpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZSl0aHJvdyBFcnJvcih5KDE5MSxlKSk7ZS5jYWxsKGQpfX19dmFyIEZnPShuZXcgYWEuQ29tcG9uZW50KS5yZWZzO1xuZnVuY3Rpb24gR2coYSxiLGMsZCl7Yj1hLm1lbW9pemVkU3RhdGU7Yz1jKGQsYik7Yz1udWxsPT09Y3x8dm9pZCAwPT09Yz9iOm0oe30sYixjKTthLm1lbW9pemVkU3RhdGU9YzswPT09YS5sYW5lcyYmKGEudXBkYXRlUXVldWUuYmFzZVN0YXRlPWMpfVxudmFyIEtnPXtpc01vdW50ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE9YS5fcmVhY3RJbnRlcm5hbHMpP1piKGEpPT09YTohMX0sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKGEsYixjKXthPWEuX3JlYWN0SW50ZXJuYWxzO3ZhciBkPUhnKCksZT1JZyhhKSxmPXpnKGQsZSk7Zi5wYXlsb2FkPWI7dm9pZCAwIT09YyYmbnVsbCE9PWMmJihmLmNhbGxiYWNrPWMpO0FnKGEsZik7SmcoYSxlLGQpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGEsYixjKXthPWEuX3JlYWN0SW50ZXJuYWxzO3ZhciBkPUhnKCksZT1JZyhhKSxmPXpnKGQsZSk7Zi50YWc9MTtmLnBheWxvYWQ9Yjt2b2lkIDAhPT1jJiZudWxsIT09YyYmKGYuY2FsbGJhY2s9Yyk7QWcoYSxmKTtKZyhhLGUsZCl9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihhLGIpe2E9YS5fcmVhY3RJbnRlcm5hbHM7dmFyIGM9SGcoKSxkPUlnKGEpLGU9emcoYyxkKTtlLnRhZz0yO3ZvaWQgMCE9PWImJm51bGwhPT1iJiYoZS5jYWxsYmFjaz1cbmIpO0FnKGEsZSk7SmcoYSxkLGMpfX07ZnVuY3Rpb24gTGcoYSxiLGMsZCxlLGYsZyl7YT1hLnN0YXRlTm9kZTtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYS5zaG91bGRDb21wb25lbnRVcGRhdGU/YS5zaG91bGRDb21wb25lbnRVcGRhdGUoZCxmLGcpOmIucHJvdG90eXBlJiZiLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudD8hSmUoYyxkKXx8IUplKGUsZik6ITB9XG5mdW5jdGlvbiBNZyhhLGIsYyl7dmFyIGQ9ITEsZT1DZjt2YXIgZj1iLmNvbnRleHRUeXBlO1wib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWY/Zj12ZyhmKTooZT1GZihiKT9EZjpNLmN1cnJlbnQsZD1iLmNvbnRleHRUeXBlcyxmPShkPW51bGwhPT1kJiZ2b2lkIDAhPT1kKT9FZihhLGUpOkNmKTtiPW5ldyBiKGMsZik7YS5tZW1vaXplZFN0YXRlPW51bGwhPT1iLnN0YXRlJiZ2b2lkIDAhPT1iLnN0YXRlP2Iuc3RhdGU6bnVsbDtiLnVwZGF0ZXI9S2c7YS5zdGF0ZU5vZGU9YjtiLl9yZWFjdEludGVybmFscz1hO2QmJihhPWEuc3RhdGVOb2RlLGEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD1lLGEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9Zik7cmV0dXJuIGJ9XG5mdW5jdGlvbiBOZyhhLGIsYyxkKXthPWIuc3RhdGU7XCJmdW5jdGlvblwiPT09dHlwZW9mIGIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmYi5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKGMsZCk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGIuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJmIuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoYyxkKTtiLnN0YXRlIT09YSYmS2cuZW5xdWV1ZVJlcGxhY2VTdGF0ZShiLGIuc3RhdGUsbnVsbCl9XG5mdW5jdGlvbiBPZyhhLGIsYyxkKXt2YXIgZT1hLnN0YXRlTm9kZTtlLnByb3BzPWM7ZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGU7ZS5yZWZzPUZnO3hnKGEpO3ZhciBmPWIuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBmJiZudWxsIT09Zj9lLmNvbnRleHQ9dmcoZik6KGY9RmYoYik/RGY6TS5jdXJyZW50LGUuY29udGV4dD1FZihhLGYpKTtDZyhhLGMsZSxkKTtlLnN0YXRlPWEubWVtb2l6ZWRTdGF0ZTtmPWIuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBmJiYoR2coYSxiLGYsYyksZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGUpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc3x8XCJmdW5jdGlvblwiPT09dHlwZW9mIGUuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGV8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBlLmNvbXBvbmVudFdpbGxNb3VudHx8XG4oYj1lLnN0YXRlLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLmNvbXBvbmVudFdpbGxNb3VudCYmZS5jb21wb25lbnRXaWxsTW91bnQoKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSxiIT09ZS5zdGF0ZSYmS2cuZW5xdWV1ZVJlcGxhY2VTdGF0ZShlLGUuc3RhdGUsbnVsbCksQ2coYSxjLGUsZCksZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGUpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBlLmNvbXBvbmVudERpZE1vdW50JiYoYS5mbGFnc3w9NCl9dmFyIFBnPUFycmF5LmlzQXJyYXk7XG5mdW5jdGlvbiBRZyhhLGIsYyl7YT1jLnJlZjtpZihudWxsIT09YSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGEmJlwib2JqZWN0XCIhPT10eXBlb2YgYSl7aWYoYy5fb3duZXIpe2M9Yy5fb3duZXI7aWYoYyl7aWYoMSE9PWMudGFnKXRocm93IEVycm9yKHkoMzA5KSk7dmFyIGQ9Yy5zdGF0ZU5vZGV9aWYoIWQpdGhyb3cgRXJyb3IoeSgxNDcsYSkpO3ZhciBlPVwiXCIrYTtpZihudWxsIT09YiYmbnVsbCE9PWIucmVmJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi5yZWYmJmIucmVmLl9zdHJpbmdSZWY9PT1lKXJldHVybiBiLnJlZjtiPWZ1bmN0aW9uKGEpe3ZhciBiPWQucmVmcztiPT09RmcmJihiPWQucmVmcz17fSk7bnVsbD09PWE/ZGVsZXRlIGJbZV06YltlXT1hfTtiLl9zdHJpbmdSZWY9ZTtyZXR1cm4gYn1pZihcInN0cmluZ1wiIT09dHlwZW9mIGEpdGhyb3cgRXJyb3IoeSgyODQpKTtpZighYy5fb3duZXIpdGhyb3cgRXJyb3IoeSgyOTAsYSkpO31yZXR1cm4gYX1cbmZ1bmN0aW9uIFJnKGEsYil7aWYoXCJ0ZXh0YXJlYVwiIT09YS50eXBlKXRocm93IEVycm9yKHkoMzEsXCJbb2JqZWN0IE9iamVjdF1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChiKT9cIm9iamVjdCB3aXRoIGtleXMge1wiK09iamVjdC5rZXlzKGIpLmpvaW4oXCIsIFwiKStcIn1cIjpiKSk7fVxuZnVuY3Rpb24gU2coYSl7ZnVuY3Rpb24gYihiLGMpe2lmKGEpe3ZhciBkPWIubGFzdEVmZmVjdDtudWxsIT09ZD8oZC5uZXh0RWZmZWN0PWMsYi5sYXN0RWZmZWN0PWMpOmIuZmlyc3RFZmZlY3Q9Yi5sYXN0RWZmZWN0PWM7Yy5uZXh0RWZmZWN0PW51bGw7Yy5mbGFncz04fX1mdW5jdGlvbiBjKGMsZCl7aWYoIWEpcmV0dXJuIG51bGw7Zm9yKDtudWxsIT09ZDspYihjLGQpLGQ9ZC5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIGQoYSxiKXtmb3IoYT1uZXcgTWFwO251bGwhPT1iOyludWxsIT09Yi5rZXk/YS5zZXQoYi5rZXksYik6YS5zZXQoYi5pbmRleCxiKSxiPWIuc2libGluZztyZXR1cm4gYX1mdW5jdGlvbiBlKGEsYil7YT1UZyhhLGIpO2EuaW5kZXg9MDthLnNpYmxpbmc9bnVsbDtyZXR1cm4gYX1mdW5jdGlvbiBmKGIsYyxkKXtiLmluZGV4PWQ7aWYoIWEpcmV0dXJuIGM7ZD1iLmFsdGVybmF0ZTtpZihudWxsIT09ZClyZXR1cm4gZD1kLmluZGV4LGQ8Yz8oYi5mbGFncz0yLFxuYyk6ZDtiLmZsYWdzPTI7cmV0dXJuIGN9ZnVuY3Rpb24gZyhiKXthJiZudWxsPT09Yi5hbHRlcm5hdGUmJihiLmZsYWdzPTIpO3JldHVybiBifWZ1bmN0aW9uIGgoYSxiLGMsZCl7aWYobnVsbD09PWJ8fDYhPT1iLnRhZylyZXR1cm4gYj1VZyhjLGEubW9kZSxkKSxiLnJldHVybj1hLGI7Yj1lKGIsYyk7Yi5yZXR1cm49YTtyZXR1cm4gYn1mdW5jdGlvbiBrKGEsYixjLGQpe2lmKG51bGwhPT1iJiZiLmVsZW1lbnRUeXBlPT09Yy50eXBlKXJldHVybiBkPWUoYixjLnByb3BzKSxkLnJlZj1RZyhhLGIsYyksZC5yZXR1cm49YSxkO2Q9VmcoYy50eXBlLGMua2V5LGMucHJvcHMsbnVsbCxhLm1vZGUsZCk7ZC5yZWY9UWcoYSxiLGMpO2QucmV0dXJuPWE7cmV0dXJuIGR9ZnVuY3Rpb24gbChhLGIsYyxkKXtpZihudWxsPT09Ynx8NCE9PWIudGFnfHxiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvIT09Yy5jb250YWluZXJJbmZvfHxiLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiE9PWMuaW1wbGVtZW50YXRpb24pcmV0dXJuIGI9XG5XZyhjLGEubW9kZSxkKSxiLnJldHVybj1hLGI7Yj1lKGIsYy5jaGlsZHJlbnx8W10pO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gbihhLGIsYyxkLGYpe2lmKG51bGw9PT1ifHw3IT09Yi50YWcpcmV0dXJuIGI9WGcoYyxhLm1vZGUsZCxmKSxiLnJldHVybj1hLGI7Yj1lKGIsYyk7Yi5yZXR1cm49YTtyZXR1cm4gYn1mdW5jdGlvbiBBKGEsYixjKXtpZihcInN0cmluZ1wiPT09dHlwZW9mIGJ8fFwibnVtYmVyXCI9PT10eXBlb2YgYilyZXR1cm4gYj1VZyhcIlwiK2IsYS5tb2RlLGMpLGIucmV0dXJuPWEsYjtpZihcIm9iamVjdFwiPT09dHlwZW9mIGImJm51bGwhPT1iKXtzd2l0Y2goYi4kJHR5cGVvZil7Y2FzZSBzYTpyZXR1cm4gYz1WZyhiLnR5cGUsYi5rZXksYi5wcm9wcyxudWxsLGEubW9kZSxjKSxjLnJlZj1RZyhhLG51bGwsYiksYy5yZXR1cm49YSxjO2Nhc2UgdGE6cmV0dXJuIGI9V2coYixhLm1vZGUsYyksYi5yZXR1cm49YSxifWlmKFBnKGIpfHxMYShiKSlyZXR1cm4gYj1YZyhiLFxuYS5tb2RlLGMsbnVsbCksYi5yZXR1cm49YSxiO1JnKGEsYil9cmV0dXJuIG51bGx9ZnVuY3Rpb24gcChhLGIsYyxkKXt2YXIgZT1udWxsIT09Yj9iLmtleTpudWxsO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgY3x8XCJudW1iZXJcIj09PXR5cGVvZiBjKXJldHVybiBudWxsIT09ZT9udWxsOmgoYSxiLFwiXCIrYyxkKTtpZihcIm9iamVjdFwiPT09dHlwZW9mIGMmJm51bGwhPT1jKXtzd2l0Y2goYy4kJHR5cGVvZil7Y2FzZSBzYTpyZXR1cm4gYy5rZXk9PT1lP2MudHlwZT09PXVhP24oYSxiLGMucHJvcHMuY2hpbGRyZW4sZCxlKTprKGEsYixjLGQpOm51bGw7Y2FzZSB0YTpyZXR1cm4gYy5rZXk9PT1lP2woYSxiLGMsZCk6bnVsbH1pZihQZyhjKXx8TGEoYykpcmV0dXJuIG51bGwhPT1lP251bGw6bihhLGIsYyxkLG51bGwpO1JnKGEsYyl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gQyhhLGIsYyxkLGUpe2lmKFwic3RyaW5nXCI9PT10eXBlb2YgZHx8XCJudW1iZXJcIj09PXR5cGVvZiBkKXJldHVybiBhPWEuZ2V0KGMpfHxcbm51bGwsaChiLGEsXCJcIitkLGUpO2lmKFwib2JqZWN0XCI9PT10eXBlb2YgZCYmbnVsbCE9PWQpe3N3aXRjaChkLiQkdHlwZW9mKXtjYXNlIHNhOnJldHVybiBhPWEuZ2V0KG51bGw9PT1kLmtleT9jOmQua2V5KXx8bnVsbCxkLnR5cGU9PT11YT9uKGIsYSxkLnByb3BzLmNoaWxkcmVuLGUsZC5rZXkpOmsoYixhLGQsZSk7Y2FzZSB0YTpyZXR1cm4gYT1hLmdldChudWxsPT09ZC5rZXk/YzpkLmtleSl8fG51bGwsbChiLGEsZCxlKX1pZihQZyhkKXx8TGEoZCkpcmV0dXJuIGE9YS5nZXQoYyl8fG51bGwsbihiLGEsZCxlLG51bGwpO1JnKGIsZCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24geChlLGcsaCxrKXtmb3IodmFyIGw9bnVsbCx0PW51bGwsdT1nLHo9Zz0wLHE9bnVsbDtudWxsIT09dSYmejxoLmxlbmd0aDt6Kyspe3UuaW5kZXg+ej8ocT11LHU9bnVsbCk6cT11LnNpYmxpbmc7dmFyIG49cChlLHUsaFt6XSxrKTtpZihudWxsPT09bil7bnVsbD09PXUmJih1PXEpO2JyZWFrfWEmJnUmJm51bGw9PT1cbm4uYWx0ZXJuYXRlJiZiKGUsdSk7Zz1mKG4sZyx6KTtudWxsPT09dD9sPW46dC5zaWJsaW5nPW47dD1uO3U9cX1pZih6PT09aC5sZW5ndGgpcmV0dXJuIGMoZSx1KSxsO2lmKG51bGw9PT11KXtmb3IoO3o8aC5sZW5ndGg7eisrKXU9QShlLGhbel0sayksbnVsbCE9PXUmJihnPWYodSxnLHopLG51bGw9PT10P2w9dTp0LnNpYmxpbmc9dSx0PXUpO3JldHVybiBsfWZvcih1PWQoZSx1KTt6PGgubGVuZ3RoO3orKylxPUModSxlLHosaFt6XSxrKSxudWxsIT09cSYmKGEmJm51bGwhPT1xLmFsdGVybmF0ZSYmdS5kZWxldGUobnVsbD09PXEua2V5P3o6cS5rZXkpLGc9ZihxLGcseiksbnVsbD09PXQ/bD1xOnQuc2libGluZz1xLHQ9cSk7YSYmdS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBiKGUsYSl9KTtyZXR1cm4gbH1mdW5jdGlvbiB3KGUsZyxoLGspe3ZhciBsPUxhKGgpO2lmKFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBsKXRocm93IEVycm9yKHkoMTUwKSk7aD1sLmNhbGwoaCk7aWYobnVsbD09XG5oKXRocm93IEVycm9yKHkoMTUxKSk7Zm9yKHZhciB0PWw9bnVsbCx1PWcsej1nPTAscT1udWxsLG49aC5uZXh0KCk7bnVsbCE9PXUmJiFuLmRvbmU7eisrLG49aC5uZXh0KCkpe3UuaW5kZXg+ej8ocT11LHU9bnVsbCk6cT11LnNpYmxpbmc7dmFyIHc9cChlLHUsbi52YWx1ZSxrKTtpZihudWxsPT09dyl7bnVsbD09PXUmJih1PXEpO2JyZWFrfWEmJnUmJm51bGw9PT13LmFsdGVybmF0ZSYmYihlLHUpO2c9Zih3LGcseik7bnVsbD09PXQ/bD13OnQuc2libGluZz13O3Q9dzt1PXF9aWYobi5kb25lKXJldHVybiBjKGUsdSksbDtpZihudWxsPT09dSl7Zm9yKDshbi5kb25lO3orKyxuPWgubmV4dCgpKW49QShlLG4udmFsdWUsayksbnVsbCE9PW4mJihnPWYobixnLHopLG51bGw9PT10P2w9bjp0LnNpYmxpbmc9bix0PW4pO3JldHVybiBsfWZvcih1PWQoZSx1KTshbi5kb25lO3orKyxuPWgubmV4dCgpKW49Qyh1LGUseixuLnZhbHVlLGspLG51bGwhPT1uJiYoYSYmbnVsbCE9PW4uYWx0ZXJuYXRlJiZcbnUuZGVsZXRlKG51bGw9PT1uLmtleT96Om4ua2V5KSxnPWYobixnLHopLG51bGw9PT10P2w9bjp0LnNpYmxpbmc9bix0PW4pO2EmJnUuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYihlLGEpfSk7cmV0dXJuIGx9cmV0dXJuIGZ1bmN0aW9uKGEsZCxmLGgpe3ZhciBrPVwib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWYmJmYudHlwZT09PXVhJiZudWxsPT09Zi5rZXk7ayYmKGY9Zi5wcm9wcy5jaGlsZHJlbik7dmFyIGw9XCJvYmplY3RcIj09PXR5cGVvZiBmJiZudWxsIT09ZjtpZihsKXN3aXRjaChmLiQkdHlwZW9mKXtjYXNlIHNhOmE6e2w9Zi5rZXk7Zm9yKGs9ZDtudWxsIT09azspe2lmKGsua2V5PT09bCl7c3dpdGNoKGsudGFnKXtjYXNlIDc6aWYoZi50eXBlPT09dWEpe2MoYSxrLnNpYmxpbmcpO2Q9ZShrLGYucHJvcHMuY2hpbGRyZW4pO2QucmV0dXJuPWE7YT1kO2JyZWFrIGF9YnJlYWs7ZGVmYXVsdDppZihrLmVsZW1lbnRUeXBlPT09Zi50eXBlKXtjKGEsay5zaWJsaW5nKTtcbmQ9ZShrLGYucHJvcHMpO2QucmVmPVFnKGEsayxmKTtkLnJldHVybj1hO2E9ZDticmVhayBhfX1jKGEsayk7YnJlYWt9ZWxzZSBiKGEsayk7az1rLnNpYmxpbmd9Zi50eXBlPT09dWE/KGQ9WGcoZi5wcm9wcy5jaGlsZHJlbixhLm1vZGUsaCxmLmtleSksZC5yZXR1cm49YSxhPWQpOihoPVZnKGYudHlwZSxmLmtleSxmLnByb3BzLG51bGwsYS5tb2RlLGgpLGgucmVmPVFnKGEsZCxmKSxoLnJldHVybj1hLGE9aCl9cmV0dXJuIGcoYSk7Y2FzZSB0YTphOntmb3Ioaz1mLmtleTtudWxsIT09ZDspe2lmKGQua2V5PT09aylpZig0PT09ZC50YWcmJmQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT1mLmNvbnRhaW5lckluZm8mJmQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09Zi5pbXBsZW1lbnRhdGlvbil7YyhhLGQuc2libGluZyk7ZD1lKGQsZi5jaGlsZHJlbnx8W10pO2QucmV0dXJuPWE7YT1kO2JyZWFrIGF9ZWxzZXtjKGEsZCk7YnJlYWt9ZWxzZSBiKGEsZCk7ZD1kLnNpYmxpbmd9ZD1cbldnKGYsYS5tb2RlLGgpO2QucmV0dXJuPWE7YT1kfXJldHVybiBnKGEpfWlmKFwic3RyaW5nXCI9PT10eXBlb2YgZnx8XCJudW1iZXJcIj09PXR5cGVvZiBmKXJldHVybiBmPVwiXCIrZixudWxsIT09ZCYmNj09PWQudGFnPyhjKGEsZC5zaWJsaW5nKSxkPWUoZCxmKSxkLnJldHVybj1hLGE9ZCk6KGMoYSxkKSxkPVVnKGYsYS5tb2RlLGgpLGQucmV0dXJuPWEsYT1kKSxnKGEpO2lmKFBnKGYpKXJldHVybiB4KGEsZCxmLGgpO2lmKExhKGYpKXJldHVybiB3KGEsZCxmLGgpO2wmJlJnKGEsZik7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBmJiYhaylzd2l0Y2goYS50YWcpe2Nhc2UgMTpjYXNlIDIyOmNhc2UgMDpjYXNlIDExOmNhc2UgMTU6dGhyb3cgRXJyb3IoeSgxNTIsUmEoYS50eXBlKXx8XCJDb21wb25lbnRcIikpO31yZXR1cm4gYyhhLGQpfX12YXIgWWc9U2coITApLFpnPVNnKCExKSwkZz17fSxhaD1CZigkZyksYmg9QmYoJGcpLGNoPUJmKCRnKTtcbmZ1bmN0aW9uIGRoKGEpe2lmKGE9PT0kZyl0aHJvdyBFcnJvcih5KDE3NCkpO3JldHVybiBhfWZ1bmN0aW9uIGVoKGEsYil7SShjaCxiKTtJKGJoLGEpO0koYWgsJGcpO2E9Yi5ub2RlVHlwZTtzd2l0Y2goYSl7Y2FzZSA5OmNhc2UgMTE6Yj0oYj1iLmRvY3VtZW50RWxlbWVudCk/Yi5uYW1lc3BhY2VVUkk6bWIobnVsbCxcIlwiKTticmVhaztkZWZhdWx0OmE9OD09PWE/Yi5wYXJlbnROb2RlOmIsYj1hLm5hbWVzcGFjZVVSSXx8bnVsbCxhPWEudGFnTmFtZSxiPW1iKGIsYSl9SChhaCk7SShhaCxiKX1mdW5jdGlvbiBmaCgpe0goYWgpO0goYmgpO0goY2gpfWZ1bmN0aW9uIGdoKGEpe2RoKGNoLmN1cnJlbnQpO3ZhciBiPWRoKGFoLmN1cnJlbnQpO3ZhciBjPW1iKGIsYS50eXBlKTtiIT09YyYmKEkoYmgsYSksSShhaCxjKSl9ZnVuY3Rpb24gaGgoYSl7YmguY3VycmVudD09PWEmJihIKGFoKSxIKGJoKSl9dmFyIFA9QmYoMCk7XG5mdW5jdGlvbiBpaChhKXtmb3IodmFyIGI9YTtudWxsIT09Yjspe2lmKDEzPT09Yi50YWcpe3ZhciBjPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09YyYmKGM9Yy5kZWh5ZHJhdGVkLG51bGw9PT1jfHxcIiQ/XCI9PT1jLmRhdGF8fFwiJCFcIj09PWMuZGF0YSkpcmV0dXJuIGJ9ZWxzZSBpZigxOT09PWIudGFnJiZ2b2lkIDAhPT1iLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIpe2lmKDAhPT0oYi5mbGFncyY2NCkpcmV0dXJuIGJ9ZWxzZSBpZihudWxsIT09Yi5jaGlsZCl7Yi5jaGlsZC5yZXR1cm49YjtiPWIuY2hpbGQ7Y29udGludWV9aWYoYj09PWEpYnJlYWs7Zm9yKDtudWxsPT09Yi5zaWJsaW5nOyl7aWYobnVsbD09PWIucmV0dXJufHxiLnJldHVybj09PWEpcmV0dXJuIG51bGw7Yj1iLnJldHVybn1iLnNpYmxpbmcucmV0dXJuPWIucmV0dXJuO2I9Yi5zaWJsaW5nfXJldHVybiBudWxsfXZhciBqaD1udWxsLGtoPW51bGwsbGg9ITE7XG5mdW5jdGlvbiBtaChhLGIpe3ZhciBjPW5oKDUsbnVsbCxudWxsLDApO2MuZWxlbWVudFR5cGU9XCJERUxFVEVEXCI7Yy50eXBlPVwiREVMRVRFRFwiO2Muc3RhdGVOb2RlPWI7Yy5yZXR1cm49YTtjLmZsYWdzPTg7bnVsbCE9PWEubGFzdEVmZmVjdD8oYS5sYXN0RWZmZWN0Lm5leHRFZmZlY3Q9YyxhLmxhc3RFZmZlY3Q9Yyk6YS5maXJzdEVmZmVjdD1hLmxhc3RFZmZlY3Q9Y31mdW5jdGlvbiBvaChhLGIpe3N3aXRjaChhLnRhZyl7Y2FzZSA1OnZhciBjPWEudHlwZTtiPTEhPT1iLm5vZGVUeXBlfHxjLnRvTG93ZXJDYXNlKCkhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/bnVsbDpiO3JldHVybiBudWxsIT09Yj8oYS5zdGF0ZU5vZGU9YiwhMCk6ITE7Y2FzZSA2OnJldHVybiBiPVwiXCI9PT1hLnBlbmRpbmdQcm9wc3x8MyE9PWIubm9kZVR5cGU/bnVsbDpiLG51bGwhPT1iPyhhLnN0YXRlTm9kZT1iLCEwKTohMTtjYXNlIDEzOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuITF9fVxuZnVuY3Rpb24gcGgoYSl7aWYobGgpe3ZhciBiPWtoO2lmKGIpe3ZhciBjPWI7aWYoIW9oKGEsYikpe2I9cmYoYy5uZXh0U2libGluZyk7aWYoIWJ8fCFvaChhLGIpKXthLmZsYWdzPWEuZmxhZ3MmLTEwMjV8MjtsaD0hMTtqaD1hO3JldHVybn1taChqaCxjKX1qaD1hO2toPXJmKGIuZmlyc3RDaGlsZCl9ZWxzZSBhLmZsYWdzPWEuZmxhZ3MmLTEwMjV8MixsaD0hMSxqaD1hfX1mdW5jdGlvbiBxaChhKXtmb3IoYT1hLnJldHVybjtudWxsIT09YSYmNSE9PWEudGFnJiYzIT09YS50YWcmJjEzIT09YS50YWc7KWE9YS5yZXR1cm47amg9YX1cbmZ1bmN0aW9uIHJoKGEpe2lmKGEhPT1qaClyZXR1cm4hMTtpZighbGgpcmV0dXJuIHFoKGEpLGxoPSEwLCExO3ZhciBiPWEudHlwZTtpZig1IT09YS50YWd8fFwiaGVhZFwiIT09YiYmXCJib2R5XCIhPT1iJiYhbmYoYixhLm1lbW9pemVkUHJvcHMpKWZvcihiPWtoO2I7KW1oKGEsYiksYj1yZihiLm5leHRTaWJsaW5nKTtxaChhKTtpZigxMz09PWEudGFnKXthPWEubWVtb2l6ZWRTdGF0ZTthPW51bGwhPT1hP2EuZGVoeWRyYXRlZDpudWxsO2lmKCFhKXRocm93IEVycm9yKHkoMzE3KSk7YTp7YT1hLm5leHRTaWJsaW5nO2ZvcihiPTA7YTspe2lmKDg9PT1hLm5vZGVUeXBlKXt2YXIgYz1hLmRhdGE7aWYoXCIvJFwiPT09Yyl7aWYoMD09PWIpe2toPXJmKGEubmV4dFNpYmxpbmcpO2JyZWFrIGF9Yi0tfWVsc2VcIiRcIiE9PWMmJlwiJCFcIiE9PWMmJlwiJD9cIiE9PWN8fGIrK31hPWEubmV4dFNpYmxpbmd9a2g9bnVsbH19ZWxzZSBraD1qaD9yZihhLnN0YXRlTm9kZS5uZXh0U2libGluZyk6bnVsbDtyZXR1cm4hMH1cbmZ1bmN0aW9uIHNoKCl7a2g9amg9bnVsbDtsaD0hMX12YXIgdGg9W107ZnVuY3Rpb24gdWgoKXtmb3IodmFyIGE9MDthPHRoLmxlbmd0aDthKyspdGhbYV0uX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnk9bnVsbDt0aC5sZW5ndGg9MH12YXIgdmg9cmEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcix3aD1yYS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyx4aD0wLFI9bnVsbCxTPW51bGwsVD1udWxsLHloPSExLHpoPSExO2Z1bmN0aW9uIEFoKCl7dGhyb3cgRXJyb3IoeSgzMjEpKTt9ZnVuY3Rpb24gQmgoYSxiKXtpZihudWxsPT09YilyZXR1cm4hMTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoJiZjPGEubGVuZ3RoO2MrKylpZighSGUoYVtjXSxiW2NdKSlyZXR1cm4hMTtyZXR1cm4hMH1cbmZ1bmN0aW9uIENoKGEsYixjLGQsZSxmKXt4aD1mO1I9YjtiLm1lbW9pemVkU3RhdGU9bnVsbDtiLnVwZGF0ZVF1ZXVlPW51bGw7Yi5sYW5lcz0wO3ZoLmN1cnJlbnQ9bnVsbD09PWF8fG51bGw9PT1hLm1lbW9pemVkU3RhdGU/RGg6RWg7YT1jKGQsZSk7aWYoemgpe2Y9MDtkb3t6aD0hMTtpZighKDI1PmYpKXRocm93IEVycm9yKHkoMzAxKSk7Zis9MTtUPVM9bnVsbDtiLnVwZGF0ZVF1ZXVlPW51bGw7dmguY3VycmVudD1GaDthPWMoZCxlKX13aGlsZSh6aCl9dmguY3VycmVudD1HaDtiPW51bGwhPT1TJiZudWxsIT09Uy5uZXh0O3hoPTA7VD1TPVI9bnVsbDt5aD0hMTtpZihiKXRocm93IEVycm9yKHkoMzAwKSk7cmV0dXJuIGF9ZnVuY3Rpb24gSGgoKXt2YXIgYT17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtudWxsPT09VD9SLm1lbW9pemVkU3RhdGU9VD1hOlQ9VC5uZXh0PWE7cmV0dXJuIFR9XG5mdW5jdGlvbiBJaCgpe2lmKG51bGw9PT1TKXt2YXIgYT1SLmFsdGVybmF0ZTthPW51bGwhPT1hP2EubWVtb2l6ZWRTdGF0ZTpudWxsfWVsc2UgYT1TLm5leHQ7dmFyIGI9bnVsbD09PVQ/Ui5tZW1vaXplZFN0YXRlOlQubmV4dDtpZihudWxsIT09YilUPWIsUz1hO2Vsc2V7aWYobnVsbD09PWEpdGhyb3cgRXJyb3IoeSgzMTApKTtTPWE7YT17bWVtb2l6ZWRTdGF0ZTpTLm1lbW9pemVkU3RhdGUsYmFzZVN0YXRlOlMuYmFzZVN0YXRlLGJhc2VRdWV1ZTpTLmJhc2VRdWV1ZSxxdWV1ZTpTLnF1ZXVlLG5leHQ6bnVsbH07bnVsbD09PVQ/Ui5tZW1vaXplZFN0YXRlPVQ9YTpUPVQubmV4dD1hfXJldHVybiBUfWZ1bmN0aW9uIEpoKGEsYil7cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGI/YihhKTpifVxuZnVuY3Rpb24gS2goYSl7dmFyIGI9SWgoKSxjPWIucXVldWU7aWYobnVsbD09PWMpdGhyb3cgRXJyb3IoeSgzMTEpKTtjLmxhc3RSZW5kZXJlZFJlZHVjZXI9YTt2YXIgZD1TLGU9ZC5iYXNlUXVldWUsZj1jLnBlbmRpbmc7aWYobnVsbCE9PWYpe2lmKG51bGwhPT1lKXt2YXIgZz1lLm5leHQ7ZS5uZXh0PWYubmV4dDtmLm5leHQ9Z31kLmJhc2VRdWV1ZT1lPWY7Yy5wZW5kaW5nPW51bGx9aWYobnVsbCE9PWUpe2U9ZS5uZXh0O2Q9ZC5iYXNlU3RhdGU7dmFyIGg9Zz1mPW51bGwsaz1lO2Rve3ZhciBsPWsubGFuZTtpZigoeGgmbCk9PT1sKW51bGwhPT1oJiYoaD1oLm5leHQ9e2xhbmU6MCxhY3Rpb246ay5hY3Rpb24sZWFnZXJSZWR1Y2VyOmsuZWFnZXJSZWR1Y2VyLGVhZ2VyU3RhdGU6ay5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLGQ9ay5lYWdlclJlZHVjZXI9PT1hP2suZWFnZXJTdGF0ZTphKGQsay5hY3Rpb24pO2Vsc2V7dmFyIG49e2xhbmU6bCxhY3Rpb246ay5hY3Rpb24sZWFnZXJSZWR1Y2VyOmsuZWFnZXJSZWR1Y2VyLFxuZWFnZXJTdGF0ZTprLmVhZ2VyU3RhdGUsbmV4dDpudWxsfTtudWxsPT09aD8oZz1oPW4sZj1kKTpoPWgubmV4dD1uO1IubGFuZXN8PWw7RGd8PWx9az1rLm5leHR9d2hpbGUobnVsbCE9PWsmJmshPT1lKTtudWxsPT09aD9mPWQ6aC5uZXh0PWc7SGUoZCxiLm1lbW9pemVkU3RhdGUpfHwodWc9ITApO2IubWVtb2l6ZWRTdGF0ZT1kO2IuYmFzZVN0YXRlPWY7Yi5iYXNlUXVldWU9aDtjLmxhc3RSZW5kZXJlZFN0YXRlPWR9cmV0dXJuW2IubWVtb2l6ZWRTdGF0ZSxjLmRpc3BhdGNoXX1cbmZ1bmN0aW9uIExoKGEpe3ZhciBiPUloKCksYz1iLnF1ZXVlO2lmKG51bGw9PT1jKXRocm93IEVycm9yKHkoMzExKSk7Yy5sYXN0UmVuZGVyZWRSZWR1Y2VyPWE7dmFyIGQ9Yy5kaXNwYXRjaCxlPWMucGVuZGluZyxmPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09ZSl7Yy5wZW5kaW5nPW51bGw7dmFyIGc9ZT1lLm5leHQ7ZG8gZj1hKGYsZy5hY3Rpb24pLGc9Zy5uZXh0O3doaWxlKGchPT1lKTtIZShmLGIubWVtb2l6ZWRTdGF0ZSl8fCh1Zz0hMCk7Yi5tZW1vaXplZFN0YXRlPWY7bnVsbD09PWIuYmFzZVF1ZXVlJiYoYi5iYXNlU3RhdGU9Zik7Yy5sYXN0UmVuZGVyZWRTdGF0ZT1mfXJldHVybltmLGRdfVxuZnVuY3Rpb24gTWgoYSxiLGMpe3ZhciBkPWIuX2dldFZlcnNpb247ZD1kKGIuX3NvdXJjZSk7dmFyIGU9Yi5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeTtpZihudWxsIT09ZSlhPWU9PT1kO2Vsc2UgaWYoYT1hLm11dGFibGVSZWFkTGFuZXMsYT0oeGgmYSk9PT1hKWIuX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnk9ZCx0aC5wdXNoKGIpO2lmKGEpcmV0dXJuIGMoYi5fc291cmNlKTt0aC5wdXNoKGIpO3Rocm93IEVycm9yKHkoMzUwKSk7fVxuZnVuY3Rpb24gTmgoYSxiLGMsZCl7dmFyIGU9VTtpZihudWxsPT09ZSl0aHJvdyBFcnJvcih5KDM0OSkpO3ZhciBmPWIuX2dldFZlcnNpb24sZz1mKGIuX3NvdXJjZSksaD12aC5jdXJyZW50LGs9aC51c2VTdGF0ZShmdW5jdGlvbigpe3JldHVybiBNaChlLGIsYyl9KSxsPWtbMV0sbj1rWzBdO2s9VDt2YXIgQT1hLm1lbW9pemVkU3RhdGUscD1BLnJlZnMsQz1wLmdldFNuYXBzaG90LHg9QS5zb3VyY2U7QT1BLnN1YnNjcmliZTt2YXIgdz1SO2EubWVtb2l6ZWRTdGF0ZT17cmVmczpwLHNvdXJjZTpiLHN1YnNjcmliZTpkfTtoLnVzZUVmZmVjdChmdW5jdGlvbigpe3AuZ2V0U25hcHNob3Q9YztwLnNldFNuYXBzaG90PWw7dmFyIGE9ZihiLl9zb3VyY2UpO2lmKCFIZShnLGEpKXthPWMoYi5fc291cmNlKTtIZShuLGEpfHwobChhKSxhPUlnKHcpLGUubXV0YWJsZVJlYWRMYW5lc3w9YSZlLnBlbmRpbmdMYW5lcyk7YT1lLm11dGFibGVSZWFkTGFuZXM7ZS5lbnRhbmdsZWRMYW5lc3w9YTtmb3IodmFyIGQ9XG5lLmVudGFuZ2xlbWVudHMsaD1hOzA8aDspe3ZhciBrPTMxLVZjKGgpLHY9MTw8aztkW2tdfD1hO2gmPX52fX19LFtjLGIsZF0pO2gudXNlRWZmZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIGQoYi5fc291cmNlLGZ1bmN0aW9uKCl7dmFyIGE9cC5nZXRTbmFwc2hvdCxjPXAuc2V0U25hcHNob3Q7dHJ5e2MoYShiLl9zb3VyY2UpKTt2YXIgZD1JZyh3KTtlLm11dGFibGVSZWFkTGFuZXN8PWQmZS5wZW5kaW5nTGFuZXN9Y2F0Y2gocSl7YyhmdW5jdGlvbigpe3Rocm93IHE7fSl9fSl9LFtiLGRdKTtIZShDLGMpJiZIZSh4LGIpJiZIZShBLGQpfHwoYT17cGVuZGluZzpudWxsLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjpKaCxsYXN0UmVuZGVyZWRTdGF0ZTpufSxhLmRpc3BhdGNoPWw9T2guYmluZChudWxsLFIsYSksay5xdWV1ZT1hLGsuYmFzZVF1ZXVlPW51bGwsbj1NaChlLGIsYyksay5tZW1vaXplZFN0YXRlPWsuYmFzZVN0YXRlPW4pO3JldHVybiBufVxuZnVuY3Rpb24gUGgoYSxiLGMpe3ZhciBkPUloKCk7cmV0dXJuIE5oKGQsYSxiLGMpfWZ1bmN0aW9uIFFoKGEpe3ZhciBiPUhoKCk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGEmJihhPWEoKSk7Yi5tZW1vaXplZFN0YXRlPWIuYmFzZVN0YXRlPWE7YT1iLnF1ZXVlPXtwZW5kaW5nOm51bGwsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOkpoLGxhc3RSZW5kZXJlZFN0YXRlOmF9O2E9YS5kaXNwYXRjaD1PaC5iaW5kKG51bGwsUixhKTtyZXR1cm5bYi5tZW1vaXplZFN0YXRlLGFdfVxuZnVuY3Rpb24gUmgoYSxiLGMsZCl7YT17dGFnOmEsY3JlYXRlOmIsZGVzdHJveTpjLGRlcHM6ZCxuZXh0Om51bGx9O2I9Ui51cGRhdGVRdWV1ZTtudWxsPT09Yj8oYj17bGFzdEVmZmVjdDpudWxsfSxSLnVwZGF0ZVF1ZXVlPWIsYi5sYXN0RWZmZWN0PWEubmV4dD1hKTooYz1iLmxhc3RFZmZlY3QsbnVsbD09PWM/Yi5sYXN0RWZmZWN0PWEubmV4dD1hOihkPWMubmV4dCxjLm5leHQ9YSxhLm5leHQ9ZCxiLmxhc3RFZmZlY3Q9YSkpO3JldHVybiBhfWZ1bmN0aW9uIFNoKGEpe3ZhciBiPUhoKCk7YT17Y3VycmVudDphfTtyZXR1cm4gYi5tZW1vaXplZFN0YXRlPWF9ZnVuY3Rpb24gVGgoKXtyZXR1cm4gSWgoKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIFVoKGEsYixjLGQpe3ZhciBlPUhoKCk7Ui5mbGFnc3w9YTtlLm1lbW9pemVkU3RhdGU9UmgoMXxiLGMsdm9pZCAwLHZvaWQgMD09PWQ/bnVsbDpkKX1cbmZ1bmN0aW9uIFZoKGEsYixjLGQpe3ZhciBlPUloKCk7ZD12b2lkIDA9PT1kP251bGw6ZDt2YXIgZj12b2lkIDA7aWYobnVsbCE9PVMpe3ZhciBnPVMubWVtb2l6ZWRTdGF0ZTtmPWcuZGVzdHJveTtpZihudWxsIT09ZCYmQmgoZCxnLmRlcHMpKXtSaChiLGMsZixkKTtyZXR1cm59fVIuZmxhZ3N8PWE7ZS5tZW1vaXplZFN0YXRlPVJoKDF8YixjLGYsZCl9ZnVuY3Rpb24gV2goYSxiKXtyZXR1cm4gVWgoNTE2LDQsYSxiKX1mdW5jdGlvbiBYaChhLGIpe3JldHVybiBWaCg1MTYsNCxhLGIpfWZ1bmN0aW9uIFloKGEsYil7cmV0dXJuIFZoKDQsMixhLGIpfWZ1bmN0aW9uIFpoKGEsYil7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGIpcmV0dXJuIGE9YSgpLGIoYSksZnVuY3Rpb24oKXtiKG51bGwpfTtpZihudWxsIT09YiYmdm9pZCAwIT09YilyZXR1cm4gYT1hKCksYi5jdXJyZW50PWEsZnVuY3Rpb24oKXtiLmN1cnJlbnQ9bnVsbH19XG5mdW5jdGlvbiAkaChhLGIsYyl7Yz1udWxsIT09YyYmdm9pZCAwIT09Yz9jLmNvbmNhdChbYV0pOm51bGw7cmV0dXJuIFZoKDQsMixaaC5iaW5kKG51bGwsYixhKSxjKX1mdW5jdGlvbiBhaSgpe31mdW5jdGlvbiBiaShhLGIpe3ZhciBjPUloKCk7Yj12b2lkIDA9PT1iP251bGw6Yjt2YXIgZD1jLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWQmJm51bGwhPT1iJiZCaChiLGRbMV0pKXJldHVybiBkWzBdO2MubWVtb2l6ZWRTdGF0ZT1bYSxiXTtyZXR1cm4gYX1mdW5jdGlvbiBjaShhLGIpe3ZhciBjPUloKCk7Yj12b2lkIDA9PT1iP251bGw6Yjt2YXIgZD1jLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWQmJm51bGwhPT1iJiZCaChiLGRbMV0pKXJldHVybiBkWzBdO2E9YSgpO2MubWVtb2l6ZWRTdGF0ZT1bYSxiXTtyZXR1cm4gYX1cbmZ1bmN0aW9uIGRpKGEsYil7dmFyIGM9ZWcoKTtnZyg5OD5jPzk4OmMsZnVuY3Rpb24oKXthKCEwKX0pO2dnKDk3PGM/OTc6YyxmdW5jdGlvbigpe3ZhciBjPXdoLnRyYW5zaXRpb247d2gudHJhbnNpdGlvbj0xO3RyeXthKCExKSxiKCl9ZmluYWxseXt3aC50cmFuc2l0aW9uPWN9fSl9XG5mdW5jdGlvbiBPaChhLGIsYyl7dmFyIGQ9SGcoKSxlPUlnKGEpLGY9e2xhbmU6ZSxhY3Rpb246YyxlYWdlclJlZHVjZXI6bnVsbCxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfSxnPWIucGVuZGluZztudWxsPT09Zz9mLm5leHQ9ZjooZi5uZXh0PWcubmV4dCxnLm5leHQ9Zik7Yi5wZW5kaW5nPWY7Zz1hLmFsdGVybmF0ZTtpZihhPT09Unx8bnVsbCE9PWcmJmc9PT1SKXpoPXloPSEwO2Vsc2V7aWYoMD09PWEubGFuZXMmJihudWxsPT09Z3x8MD09PWcubGFuZXMpJiYoZz1iLmxhc3RSZW5kZXJlZFJlZHVjZXIsbnVsbCE9PWcpKXRyeXt2YXIgaD1iLmxhc3RSZW5kZXJlZFN0YXRlLGs9ZyhoLGMpO2YuZWFnZXJSZWR1Y2VyPWc7Zi5lYWdlclN0YXRlPWs7aWYoSGUoayxoKSlyZXR1cm59Y2F0Y2gobCl7fWZpbmFsbHl7fUpnKGEsZSxkKX19XG52YXIgR2g9e3JlYWRDb250ZXh0OnZnLHVzZUNhbGxiYWNrOkFoLHVzZUNvbnRleHQ6QWgsdXNlRWZmZWN0OkFoLHVzZUltcGVyYXRpdmVIYW5kbGU6QWgsdXNlTGF5b3V0RWZmZWN0OkFoLHVzZU1lbW86QWgsdXNlUmVkdWNlcjpBaCx1c2VSZWY6QWgsdXNlU3RhdGU6QWgsdXNlRGVidWdWYWx1ZTpBaCx1c2VEZWZlcnJlZFZhbHVlOkFoLHVzZVRyYW5zaXRpb246QWgsdXNlTXV0YWJsZVNvdXJjZTpBaCx1c2VPcGFxdWVJZGVudGlmaWVyOkFoLHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sRGg9e3JlYWRDb250ZXh0OnZnLHVzZUNhbGxiYWNrOmZ1bmN0aW9uKGEsYil7SGgoKS5tZW1vaXplZFN0YXRlPVthLHZvaWQgMD09PWI/bnVsbDpiXTtyZXR1cm4gYX0sdXNlQ29udGV4dDp2Zyx1c2VFZmZlY3Q6V2gsdXNlSW1wZXJhdGl2ZUhhbmRsZTpmdW5jdGlvbihhLGIsYyl7Yz1udWxsIT09YyYmdm9pZCAwIT09Yz9jLmNvbmNhdChbYV0pOm51bGw7cmV0dXJuIFVoKDQsMixaaC5iaW5kKG51bGwsXG5iLGEpLGMpfSx1c2VMYXlvdXRFZmZlY3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVWgoNCwyLGEsYil9LHVzZU1lbW86ZnVuY3Rpb24oYSxiKXt2YXIgYz1IaCgpO2I9dm9pZCAwPT09Yj9udWxsOmI7YT1hKCk7Yy5tZW1vaXplZFN0YXRlPVthLGJdO3JldHVybiBhfSx1c2VSZWR1Y2VyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1IaCgpO2I9dm9pZCAwIT09Yz9jKGIpOmI7ZC5tZW1vaXplZFN0YXRlPWQuYmFzZVN0YXRlPWI7YT1kLnF1ZXVlPXtwZW5kaW5nOm51bGwsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOmEsbGFzdFJlbmRlcmVkU3RhdGU6Yn07YT1hLmRpc3BhdGNoPU9oLmJpbmQobnVsbCxSLGEpO3JldHVybltkLm1lbW9pemVkU3RhdGUsYV19LHVzZVJlZjpTaCx1c2VTdGF0ZTpRaCx1c2VEZWJ1Z1ZhbHVlOmFpLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oYSl7dmFyIGI9UWgoYSksYz1iWzBdLGQ9YlsxXTtXaChmdW5jdGlvbigpe3ZhciBiPXdoLnRyYW5zaXRpb247XG53aC50cmFuc2l0aW9uPTE7dHJ5e2QoYSl9ZmluYWxseXt3aC50cmFuc2l0aW9uPWJ9fSxbYV0pO3JldHVybiBjfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9UWgoITEpLGI9YVswXTthPWRpLmJpbmQobnVsbCxhWzFdKTtTaChhKTtyZXR1cm5bYSxiXX0sdXNlTXV0YWJsZVNvdXJjZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9SGgoKTtkLm1lbW9pemVkU3RhdGU9e3JlZnM6e2dldFNuYXBzaG90OmIsc2V0U25hcHNob3Q6bnVsbH0sc291cmNlOmEsc3Vic2NyaWJlOmN9O3JldHVybiBOaChkLGEsYixjKX0sdXNlT3BhcXVlSWRlbnRpZmllcjpmdW5jdGlvbigpe2lmKGxoKXt2YXIgYT0hMSxiPXVmKGZ1bmN0aW9uKCl7YXx8KGE9ITAsYyhcInI6XCIrKHRmKyspLnRvU3RyaW5nKDM2KSkpO3Rocm93IEVycm9yKHkoMzU1KSk7fSksYz1RaChiKVsxXTswPT09KFIubW9kZSYyKSYmKFIuZmxhZ3N8PTUxNixSaCg1LGZ1bmN0aW9uKCl7YyhcInI6XCIrKHRmKyspLnRvU3RyaW5nKDM2KSl9LFxudm9pZCAwLG51bGwpKTtyZXR1cm4gYn1iPVwicjpcIisodGYrKykudG9TdHJpbmcoMzYpO1FoKGIpO3JldHVybiBifSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LEVoPXtyZWFkQ29udGV4dDp2Zyx1c2VDYWxsYmFjazpiaSx1c2VDb250ZXh0OnZnLHVzZUVmZmVjdDpYaCx1c2VJbXBlcmF0aXZlSGFuZGxlOiRoLHVzZUxheW91dEVmZmVjdDpZaCx1c2VNZW1vOmNpLHVzZVJlZHVjZXI6S2gsdXNlUmVmOlRoLHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIEtoKEpoKX0sdXNlRGVidWdWYWx1ZTphaSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPUtoKEpoKSxjPWJbMF0sZD1iWzFdO1hoKGZ1bmN0aW9uKCl7dmFyIGI9d2gudHJhbnNpdGlvbjt3aC50cmFuc2l0aW9uPTE7dHJ5e2QoYSl9ZmluYWxseXt3aC50cmFuc2l0aW9uPWJ9fSxbYV0pO3JldHVybiBjfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9S2goSmgpWzBdO3JldHVybltUaCgpLmN1cnJlbnQsXG5hXX0sdXNlTXV0YWJsZVNvdXJjZTpQaCx1c2VPcGFxdWVJZGVudGlmaWVyOmZ1bmN0aW9uKCl7cmV0dXJuIEtoKEpoKVswXX0sdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxGaD17cmVhZENvbnRleHQ6dmcsdXNlQ2FsbGJhY2s6YmksdXNlQ29udGV4dDp2Zyx1c2VFZmZlY3Q6WGgsdXNlSW1wZXJhdGl2ZUhhbmRsZTokaCx1c2VMYXlvdXRFZmZlY3Q6WWgsdXNlTWVtbzpjaSx1c2VSZWR1Y2VyOkxoLHVzZVJlZjpUaCx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBMaChKaCl9LHVzZURlYnVnVmFsdWU6YWksdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihhKXt2YXIgYj1MaChKaCksYz1iWzBdLGQ9YlsxXTtYaChmdW5jdGlvbigpe3ZhciBiPXdoLnRyYW5zaXRpb247d2gudHJhbnNpdGlvbj0xO3RyeXtkKGEpfWZpbmFsbHl7d2gudHJhbnNpdGlvbj1ifX0sW2FdKTtyZXR1cm4gY30sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBhPUxoKEpoKVswXTtyZXR1cm5bVGgoKS5jdXJyZW50LFxuYV19LHVzZU11dGFibGVTb3VyY2U6UGgsdXNlT3BhcXVlSWRlbnRpZmllcjpmdW5jdGlvbigpe3JldHVybiBMaChKaClbMF19LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sZWk9cmEuUmVhY3RDdXJyZW50T3duZXIsdWc9ITE7ZnVuY3Rpb24gZmkoYSxiLGMsZCl7Yi5jaGlsZD1udWxsPT09YT9aZyhiLG51bGwsYyxkKTpZZyhiLGEuY2hpbGQsYyxkKX1mdW5jdGlvbiBnaShhLGIsYyxkLGUpe2M9Yy5yZW5kZXI7dmFyIGY9Yi5yZWY7dGcoYixlKTtkPUNoKGEsYixjLGQsZixlKTtpZihudWxsIT09YSYmIXVnKXJldHVybiBiLnVwZGF0ZVF1ZXVlPWEudXBkYXRlUXVldWUsYi5mbGFncyY9LTUxNyxhLmxhbmVzJj1+ZSxoaShhLGIsZSk7Yi5mbGFnc3w9MTtmaShhLGIsZCxlKTtyZXR1cm4gYi5jaGlsZH1cbmZ1bmN0aW9uIGlpKGEsYixjLGQsZSxmKXtpZihudWxsPT09YSl7dmFyIGc9Yy50eXBlO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnJiYhamkoZykmJnZvaWQgMD09PWcuZGVmYXVsdFByb3BzJiZudWxsPT09Yy5jb21wYXJlJiZ2b2lkIDA9PT1jLmRlZmF1bHRQcm9wcylyZXR1cm4gYi50YWc9MTUsYi50eXBlPWcsa2koYSxiLGcsZCxlLGYpO2E9VmcoYy50eXBlLG51bGwsZCxiLGIubW9kZSxmKTthLnJlZj1iLnJlZjthLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWF9Zz1hLmNoaWxkO2lmKDA9PT0oZSZmKSYmKGU9Zy5tZW1vaXplZFByb3BzLGM9Yy5jb21wYXJlLGM9bnVsbCE9PWM/YzpKZSxjKGUsZCkmJmEucmVmPT09Yi5yZWYpKXJldHVybiBoaShhLGIsZik7Yi5mbGFnc3w9MTthPVRnKGcsZCk7YS5yZWY9Yi5yZWY7YS5yZXR1cm49YjtyZXR1cm4gYi5jaGlsZD1hfVxuZnVuY3Rpb24ga2koYSxiLGMsZCxlLGYpe2lmKG51bGwhPT1hJiZKZShhLm1lbW9pemVkUHJvcHMsZCkmJmEucmVmPT09Yi5yZWYpaWYodWc9ITEsMCE9PShmJmUpKTAhPT0oYS5mbGFncyYxNjM4NCkmJih1Zz0hMCk7ZWxzZSByZXR1cm4gYi5sYW5lcz1hLmxhbmVzLGhpKGEsYixmKTtyZXR1cm4gbGkoYSxiLGMsZCxmKX1cbmZ1bmN0aW9uIG1pKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcyxlPWQuY2hpbGRyZW4sZj1udWxsIT09YT9hLm1lbW9pemVkU3RhdGU6bnVsbDtpZihcImhpZGRlblwiPT09ZC5tb2RlfHxcInVuc3RhYmxlLWRlZmVyLXdpdGhvdXQtaGlkaW5nXCI9PT1kLm1vZGUpaWYoMD09PShiLm1vZGUmNCkpYi5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MH0sbmkoYixjKTtlbHNlIGlmKDAhPT0oYyYxMDczNzQxODI0KSliLm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczowfSxuaShiLG51bGwhPT1mP2YuYmFzZUxhbmVzOmMpO2Vsc2UgcmV0dXJuIGE9bnVsbCE9PWY/Zi5iYXNlTGFuZXN8YzpjLGIubGFuZXM9Yi5jaGlsZExhbmVzPTEwNzM3NDE4MjQsYi5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6YX0sbmkoYixhKSxudWxsO2Vsc2UgbnVsbCE9PWY/KGQ9Zi5iYXNlTGFuZXN8YyxiLm1lbW9pemVkU3RhdGU9bnVsbCk6ZD1jLG5pKGIsZCk7ZmkoYSxiLGUsYyk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBvaShhLGIpe3ZhciBjPWIucmVmO2lmKG51bGw9PT1hJiZudWxsIT09Y3x8bnVsbCE9PWEmJmEucmVmIT09YyliLmZsYWdzfD0xMjh9ZnVuY3Rpb24gbGkoYSxiLGMsZCxlKXt2YXIgZj1GZihjKT9EZjpNLmN1cnJlbnQ7Zj1FZihiLGYpO3RnKGIsZSk7Yz1DaChhLGIsYyxkLGYsZSk7aWYobnVsbCE9PWEmJiF1ZylyZXR1cm4gYi51cGRhdGVRdWV1ZT1hLnVwZGF0ZVF1ZXVlLGIuZmxhZ3MmPS01MTcsYS5sYW5lcyY9fmUsaGkoYSxiLGUpO2IuZmxhZ3N8PTE7ZmkoYSxiLGMsZSk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBwaShhLGIsYyxkLGUpe2lmKEZmKGMpKXt2YXIgZj0hMDtKZihiKX1lbHNlIGY9ITE7dGcoYixlKTtpZihudWxsPT09Yi5zdGF0ZU5vZGUpbnVsbCE9PWEmJihhLmFsdGVybmF0ZT1udWxsLGIuYWx0ZXJuYXRlPW51bGwsYi5mbGFnc3w9MiksTWcoYixjLGQpLE9nKGIsYyxkLGUpLGQ9ITA7ZWxzZSBpZihudWxsPT09YSl7dmFyIGc9Yi5zdGF0ZU5vZGUsaD1iLm1lbW9pemVkUHJvcHM7Zy5wcm9wcz1oO3ZhciBrPWcuY29udGV4dCxsPWMuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBsJiZudWxsIT09bD9sPXZnKGwpOihsPUZmKGMpP0RmOk0uY3VycmVudCxsPUVmKGIsbCkpO3ZhciBuPWMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLEE9XCJmdW5jdGlvblwiPT09dHlwZW9mIG58fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlO0F8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZcblwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHN8fChoIT09ZHx8ayE9PWwpJiZOZyhiLGcsZCxsKTt3Zz0hMTt2YXIgcD1iLm1lbW9pemVkU3RhdGU7Zy5zdGF0ZT1wO0NnKGIsZCxnLGUpO2s9Yi5tZW1vaXplZFN0YXRlO2ghPT1kfHxwIT09a3x8Ti5jdXJyZW50fHx3Zz8oXCJmdW5jdGlvblwiPT09dHlwZW9mIG4mJihHZyhiLGMsbixkKSxrPWIubWVtb2l6ZWRTdGF0ZSksKGg9d2d8fExnKGIsYyxoLGQscCxrLGwpKT8oQXx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50V2lsbE1vdW50fHwoXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuY29tcG9uZW50V2lsbE1vdW50JiZnLmNvbXBvbmVudFdpbGxNb3VudCgpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJmcuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpKSxcImZ1bmN0aW9uXCI9PT1cbnR5cGVvZiBnLmNvbXBvbmVudERpZE1vdW50JiYoYi5mbGFnc3w9NCkpOihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZmxhZ3N8PTQpLGIubWVtb2l6ZWRQcm9wcz1kLGIubWVtb2l6ZWRTdGF0ZT1rKSxnLnByb3BzPWQsZy5zdGF0ZT1rLGcuY29udGV4dD1sLGQ9aCk6KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudERpZE1vdW50JiYoYi5mbGFnc3w9NCksZD0hMSl9ZWxzZXtnPWIuc3RhdGVOb2RlO3lnKGEsYik7aD1iLm1lbW9pemVkUHJvcHM7bD1iLnR5cGU9PT1iLmVsZW1lbnRUeXBlP2g6bGcoYi50eXBlLGgpO2cucHJvcHM9bDtBPWIucGVuZGluZ1Byb3BzO3A9Zy5jb250ZXh0O2s9Yy5jb250ZXh0VHlwZTtcIm9iamVjdFwiPT09dHlwZW9mIGsmJm51bGwhPT1rP2s9dmcoayk6KGs9RmYoYyk/RGY6TS5jdXJyZW50LGs9RWYoYixrKSk7dmFyIEM9Yy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7KG49XCJmdW5jdGlvblwiPT09dHlwZW9mIEN8fFxuXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUpfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc3x8KGghPT1BfHxwIT09aykmJk5nKGIsZyxkLGspO3dnPSExO3A9Yi5tZW1vaXplZFN0YXRlO2cuc3RhdGU9cDtDZyhiLGQsZyxlKTt2YXIgeD1iLm1lbW9pemVkU3RhdGU7aCE9PUF8fHAhPT14fHxOLmN1cnJlbnR8fHdnPyhcImZ1bmN0aW9uXCI9PT10eXBlb2YgQyYmKEdnKGIsYyxDLGQpLHg9Yi5tZW1vaXplZFN0YXRlKSwobD13Z3x8TGcoYixjLGwsZCxwLHgsaykpPyhufHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50V2lsbFVwZGF0ZXx8KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxVcGRhdGUmJmcuY29tcG9uZW50V2lsbFVwZGF0ZShkLFxueCxrKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSYmZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShkLHgsaykpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudERpZFVwZGF0ZSYmKGIuZmxhZ3N8PTQpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlJiYoYi5mbGFnc3w9MjU2KSk6KFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudERpZFVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmcD09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTQpLFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHxoPT09YS5tZW1vaXplZFByb3BzJiZwPT09YS5tZW1vaXplZFN0YXRlfHwoYi5mbGFnc3w9MjU2KSxiLm1lbW9pemVkUHJvcHM9ZCxiLm1lbW9pemVkU3RhdGU9eCksZy5wcm9wcz1kLGcuc3RhdGU9eCxnLmNvbnRleHQ9ayxkPWwpOihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGV8fFxuaD09PWEubWVtb2l6ZWRQcm9wcyYmcD09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTQpLFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHxoPT09YS5tZW1vaXplZFByb3BzJiZwPT09YS5tZW1vaXplZFN0YXRlfHwoYi5mbGFnc3w9MjU2KSxkPSExKX1yZXR1cm4gcWkoYSxiLGMsZCxmLGUpfVxuZnVuY3Rpb24gcWkoYSxiLGMsZCxlLGYpe29pKGEsYik7dmFyIGc9MCE9PShiLmZsYWdzJjY0KTtpZighZCYmIWcpcmV0dXJuIGUmJktmKGIsYywhMSksaGkoYSxiLGYpO2Q9Yi5zdGF0ZU5vZGU7ZWkuY3VycmVudD1iO3ZhciBoPWcmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBjLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj9udWxsOmQucmVuZGVyKCk7Yi5mbGFnc3w9MTtudWxsIT09YSYmZz8oYi5jaGlsZD1ZZyhiLGEuY2hpbGQsbnVsbCxmKSxiLmNoaWxkPVlnKGIsbnVsbCxoLGYpKTpmaShhLGIsaCxmKTtiLm1lbW9pemVkU3RhdGU9ZC5zdGF0ZTtlJiZLZihiLGMsITApO3JldHVybiBiLmNoaWxkfWZ1bmN0aW9uIHJpKGEpe3ZhciBiPWEuc3RhdGVOb2RlO2IucGVuZGluZ0NvbnRleHQ/SGYoYSxiLnBlbmRpbmdDb250ZXh0LGIucGVuZGluZ0NvbnRleHQhPT1iLmNvbnRleHQpOmIuY29udGV4dCYmSGYoYSxiLmNvbnRleHQsITEpO2VoKGEsYi5jb250YWluZXJJbmZvKX1cbnZhciBzaT17ZGVoeWRyYXRlZDpudWxsLHJldHJ5TGFuZTowfTtcbmZ1bmN0aW9uIHRpKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcyxlPVAuY3VycmVudCxmPSExLGc7KGc9MCE9PShiLmZsYWdzJjY0KSl8fChnPW51bGwhPT1hJiZudWxsPT09YS5tZW1vaXplZFN0YXRlPyExOjAhPT0oZSYyKSk7Zz8oZj0hMCxiLmZsYWdzJj0tNjUpOm51bGwhPT1hJiZudWxsPT09YS5tZW1vaXplZFN0YXRlfHx2b2lkIDA9PT1kLmZhbGxiYWNrfHwhMD09PWQudW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2t8fChlfD0xKTtJKFAsZSYxKTtpZihudWxsPT09YSl7dm9pZCAwIT09ZC5mYWxsYmFjayYmcGgoYik7YT1kLmNoaWxkcmVuO2U9ZC5mYWxsYmFjaztpZihmKXJldHVybiBhPXVpKGIsYSxlLGMpLGIuY2hpbGQubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOmN9LGIubWVtb2l6ZWRTdGF0ZT1zaSxhO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZC51bnN0YWJsZV9leHBlY3RlZExvYWRUaW1lKXJldHVybiBhPXVpKGIsYSxlLGMpLGIuY2hpbGQubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOmN9LFxuYi5tZW1vaXplZFN0YXRlPXNpLGIubGFuZXM9MzM1NTQ0MzIsYTtjPXZpKHttb2RlOlwidmlzaWJsZVwiLGNoaWxkcmVuOmF9LGIubW9kZSxjLG51bGwpO2MucmV0dXJuPWI7cmV0dXJuIGIuY2hpbGQ9Y31pZihudWxsIT09YS5tZW1vaXplZFN0YXRlKXtpZihmKXJldHVybiBkPXdpKGEsYixkLmNoaWxkcmVuLGQuZmFsbGJhY2ssYyksZj1iLmNoaWxkLGU9YS5jaGlsZC5tZW1vaXplZFN0YXRlLGYubWVtb2l6ZWRTdGF0ZT1udWxsPT09ZT97YmFzZUxhbmVzOmN9OntiYXNlTGFuZXM6ZS5iYXNlTGFuZXN8Y30sZi5jaGlsZExhbmVzPWEuY2hpbGRMYW5lcyZ+YyxiLm1lbW9pemVkU3RhdGU9c2ksZDtjPXhpKGEsYixkLmNoaWxkcmVuLGMpO2IubWVtb2l6ZWRTdGF0ZT1udWxsO3JldHVybiBjfWlmKGYpcmV0dXJuIGQ9d2koYSxiLGQuY2hpbGRyZW4sZC5mYWxsYmFjayxjKSxmPWIuY2hpbGQsZT1hLmNoaWxkLm1lbW9pemVkU3RhdGUsZi5tZW1vaXplZFN0YXRlPW51bGw9PT1lP3tiYXNlTGFuZXM6Y306XG57YmFzZUxhbmVzOmUuYmFzZUxhbmVzfGN9LGYuY2hpbGRMYW5lcz1hLmNoaWxkTGFuZXMmfmMsYi5tZW1vaXplZFN0YXRlPXNpLGQ7Yz14aShhLGIsZC5jaGlsZHJlbixjKTtiLm1lbW9pemVkU3RhdGU9bnVsbDtyZXR1cm4gY31mdW5jdGlvbiB1aShhLGIsYyxkKXt2YXIgZT1hLm1vZGUsZj1hLmNoaWxkO2I9e21vZGU6XCJoaWRkZW5cIixjaGlsZHJlbjpifTswPT09KGUmMikmJm51bGwhPT1mPyhmLmNoaWxkTGFuZXM9MCxmLnBlbmRpbmdQcm9wcz1iKTpmPXZpKGIsZSwwLG51bGwpO2M9WGcoYyxlLGQsbnVsbCk7Zi5yZXR1cm49YTtjLnJldHVybj1hO2Yuc2libGluZz1jO2EuY2hpbGQ9ZjtyZXR1cm4gY31cbmZ1bmN0aW9uIHhpKGEsYixjLGQpe3ZhciBlPWEuY2hpbGQ7YT1lLnNpYmxpbmc7Yz1UZyhlLHttb2RlOlwidmlzaWJsZVwiLGNoaWxkcmVuOmN9KTswPT09KGIubW9kZSYyKSYmKGMubGFuZXM9ZCk7Yy5yZXR1cm49YjtjLnNpYmxpbmc9bnVsbDtudWxsIT09YSYmKGEubmV4dEVmZmVjdD1udWxsLGEuZmxhZ3M9OCxiLmZpcnN0RWZmZWN0PWIubGFzdEVmZmVjdD1hKTtyZXR1cm4gYi5jaGlsZD1jfVxuZnVuY3Rpb24gd2koYSxiLGMsZCxlKXt2YXIgZj1iLm1vZGUsZz1hLmNoaWxkO2E9Zy5zaWJsaW5nO3ZhciBoPXttb2RlOlwiaGlkZGVuXCIsY2hpbGRyZW46Y307MD09PShmJjIpJiZiLmNoaWxkIT09Zz8oYz1iLmNoaWxkLGMuY2hpbGRMYW5lcz0wLGMucGVuZGluZ1Byb3BzPWgsZz1jLmxhc3RFZmZlY3QsbnVsbCE9PWc/KGIuZmlyc3RFZmZlY3Q9Yy5maXJzdEVmZmVjdCxiLmxhc3RFZmZlY3Q9ZyxnLm5leHRFZmZlY3Q9bnVsbCk6Yi5maXJzdEVmZmVjdD1iLmxhc3RFZmZlY3Q9bnVsbCk6Yz1UZyhnLGgpO251bGwhPT1hP2Q9VGcoYSxkKTooZD1YZyhkLGYsZSxudWxsKSxkLmZsYWdzfD0yKTtkLnJldHVybj1iO2MucmV0dXJuPWI7Yy5zaWJsaW5nPWQ7Yi5jaGlsZD1jO3JldHVybiBkfWZ1bmN0aW9uIHlpKGEsYil7YS5sYW5lc3w9Yjt2YXIgYz1hLmFsdGVybmF0ZTtudWxsIT09YyYmKGMubGFuZXN8PWIpO3NnKGEucmV0dXJuLGIpfVxuZnVuY3Rpb24gemkoYSxiLGMsZCxlLGYpe3ZhciBnPWEubWVtb2l6ZWRTdGF0ZTtudWxsPT09Zz9hLm1lbW9pemVkU3RhdGU9e2lzQmFja3dhcmRzOmIscmVuZGVyaW5nOm51bGwscmVuZGVyaW5nU3RhcnRUaW1lOjAsbGFzdDpkLHRhaWw6Yyx0YWlsTW9kZTplLGxhc3RFZmZlY3Q6Zn06KGcuaXNCYWNrd2FyZHM9YixnLnJlbmRlcmluZz1udWxsLGcucmVuZGVyaW5nU3RhcnRUaW1lPTAsZy5sYXN0PWQsZy50YWlsPWMsZy50YWlsTW9kZT1lLGcubGFzdEVmZmVjdD1mKX1cbmZ1bmN0aW9uIEFpKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcyxlPWQucmV2ZWFsT3JkZXIsZj1kLnRhaWw7ZmkoYSxiLGQuY2hpbGRyZW4sYyk7ZD1QLmN1cnJlbnQ7aWYoMCE9PShkJjIpKWQ9ZCYxfDIsYi5mbGFnc3w9NjQ7ZWxzZXtpZihudWxsIT09YSYmMCE9PShhLmZsYWdzJjY0KSlhOmZvcihhPWIuY2hpbGQ7bnVsbCE9PWE7KXtpZigxMz09PWEudGFnKW51bGwhPT1hLm1lbW9pemVkU3RhdGUmJnlpKGEsYyk7ZWxzZSBpZigxOT09PWEudGFnKXlpKGEsYyk7ZWxzZSBpZihudWxsIT09YS5jaGlsZCl7YS5jaGlsZC5yZXR1cm49YTthPWEuY2hpbGQ7Y29udGludWV9aWYoYT09PWIpYnJlYWsgYTtmb3IoO251bGw9PT1hLnNpYmxpbmc7KXtpZihudWxsPT09YS5yZXR1cm58fGEucmV0dXJuPT09YilicmVhayBhO2E9YS5yZXR1cm59YS5zaWJsaW5nLnJldHVybj1hLnJldHVybjthPWEuc2libGluZ31kJj0xfUkoUCxkKTtpZigwPT09KGIubW9kZSYyKSliLm1lbW9pemVkU3RhdGU9XG5udWxsO2Vsc2Ugc3dpdGNoKGUpe2Nhc2UgXCJmb3J3YXJkc1wiOmM9Yi5jaGlsZDtmb3IoZT1udWxsO251bGwhPT1jOylhPWMuYWx0ZXJuYXRlLG51bGwhPT1hJiZudWxsPT09aWgoYSkmJihlPWMpLGM9Yy5zaWJsaW5nO2M9ZTtudWxsPT09Yz8oZT1iLmNoaWxkLGIuY2hpbGQ9bnVsbCk6KGU9Yy5zaWJsaW5nLGMuc2libGluZz1udWxsKTt6aShiLCExLGUsYyxmLGIubGFzdEVmZmVjdCk7YnJlYWs7Y2FzZSBcImJhY2t3YXJkc1wiOmM9bnVsbDtlPWIuY2hpbGQ7Zm9yKGIuY2hpbGQ9bnVsbDtudWxsIT09ZTspe2E9ZS5hbHRlcm5hdGU7aWYobnVsbCE9PWEmJm51bGw9PT1paChhKSl7Yi5jaGlsZD1lO2JyZWFrfWE9ZS5zaWJsaW5nO2Uuc2libGluZz1jO2M9ZTtlPWF9emkoYiwhMCxjLG51bGwsZixiLmxhc3RFZmZlY3QpO2JyZWFrO2Nhc2UgXCJ0b2dldGhlclwiOnppKGIsITEsbnVsbCxudWxsLHZvaWQgMCxiLmxhc3RFZmZlY3QpO2JyZWFrO2RlZmF1bHQ6Yi5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBoaShhLGIsYyl7bnVsbCE9PWEmJihiLmRlcGVuZGVuY2llcz1hLmRlcGVuZGVuY2llcyk7RGd8PWIubGFuZXM7aWYoMCE9PShjJmIuY2hpbGRMYW5lcykpe2lmKG51bGwhPT1hJiZiLmNoaWxkIT09YS5jaGlsZCl0aHJvdyBFcnJvcih5KDE1MykpO2lmKG51bGwhPT1iLmNoaWxkKXthPWIuY2hpbGQ7Yz1UZyhhLGEucGVuZGluZ1Byb3BzKTtiLmNoaWxkPWM7Zm9yKGMucmV0dXJuPWI7bnVsbCE9PWEuc2libGluZzspYT1hLnNpYmxpbmcsYz1jLnNpYmxpbmc9VGcoYSxhLnBlbmRpbmdQcm9wcyksYy5yZXR1cm49YjtjLnNpYmxpbmc9bnVsbH1yZXR1cm4gYi5jaGlsZH1yZXR1cm4gbnVsbH12YXIgQmksQ2ksRGksRWk7XG5CaT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1iLmNoaWxkO251bGwhPT1jOyl7aWYoNT09PWMudGFnfHw2PT09Yy50YWcpYS5hcHBlbmRDaGlsZChjLnN0YXRlTm9kZSk7ZWxzZSBpZig0IT09Yy50YWcmJm51bGwhPT1jLmNoaWxkKXtjLmNoaWxkLnJldHVybj1jO2M9Yy5jaGlsZDtjb250aW51ZX1pZihjPT09YilicmVhaztmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fGMucmV0dXJuPT09YilyZXR1cm47Yz1jLnJldHVybn1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2M9Yy5zaWJsaW5nfX07Q2k9ZnVuY3Rpb24oKXt9O1xuRGk9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YS5tZW1vaXplZFByb3BzO2lmKGUhPT1kKXthPWIuc3RhdGVOb2RlO2RoKGFoLmN1cnJlbnQpO3ZhciBmPW51bGw7c3dpdGNoKGMpe2Nhc2UgXCJpbnB1dFwiOmU9WWEoYSxlKTtkPVlhKGEsZCk7Zj1bXTticmVhaztjYXNlIFwib3B0aW9uXCI6ZT1lYihhLGUpO2Q9ZWIoYSxkKTtmPVtdO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjplPW0oe30sZSx7dmFsdWU6dm9pZCAwfSk7ZD1tKHt9LGQse3ZhbHVlOnZvaWQgMH0pO2Y9W107YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6ZT1nYihhLGUpO2Q9Z2IoYSxkKTtmPVtdO2JyZWFrO2RlZmF1bHQ6XCJmdW5jdGlvblwiIT09dHlwZW9mIGUub25DbGljayYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGQub25DbGljayYmKGEub25jbGljaz1qZil9dmIoYyxkKTt2YXIgZztjPW51bGw7Zm9yKGwgaW4gZSlpZighZC5oYXNPd25Qcm9wZXJ0eShsKSYmZS5oYXNPd25Qcm9wZXJ0eShsKSYmbnVsbCE9ZVtsXSlpZihcInN0eWxlXCI9PT1cbmwpe3ZhciBoPWVbbF07Zm9yKGcgaW4gaCloLmhhc093blByb3BlcnR5KGcpJiYoY3x8KGM9e30pLGNbZ109XCJcIil9ZWxzZVwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIiE9PWwmJlwiY2hpbGRyZW5cIiE9PWwmJlwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXCIhPT1sJiZcInN1cHByZXNzSHlkcmF0aW9uV2FybmluZ1wiIT09bCYmXCJhdXRvRm9jdXNcIiE9PWwmJihjYS5oYXNPd25Qcm9wZXJ0eShsKT9mfHwoZj1bXSk6KGY9Znx8W10pLnB1c2gobCxudWxsKSk7Zm9yKGwgaW4gZCl7dmFyIGs9ZFtsXTtoPW51bGwhPWU/ZVtsXTp2b2lkIDA7aWYoZC5oYXNPd25Qcm9wZXJ0eShsKSYmayE9PWgmJihudWxsIT1rfHxudWxsIT1oKSlpZihcInN0eWxlXCI9PT1sKWlmKGgpe2ZvcihnIGluIGgpIWguaGFzT3duUHJvcGVydHkoZyl8fGsmJmsuaGFzT3duUHJvcGVydHkoZyl8fChjfHwoYz17fSksY1tnXT1cIlwiKTtmb3IoZyBpbiBrKWsuaGFzT3duUHJvcGVydHkoZykmJmhbZ10hPT1rW2ddJiYoY3x8XG4oYz17fSksY1tnXT1rW2ddKX1lbHNlIGN8fChmfHwoZj1bXSksZi5wdXNoKGwsYykpLGM9aztlbHNlXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiPT09bD8oaz1rP2suX19odG1sOnZvaWQgMCxoPWg/aC5fX2h0bWw6dm9pZCAwLG51bGwhPWsmJmghPT1rJiYoZj1mfHxbXSkucHVzaChsLGspKTpcImNoaWxkcmVuXCI9PT1sP1wic3RyaW5nXCIhPT10eXBlb2YgayYmXCJudW1iZXJcIiE9PXR5cGVvZiBrfHwoZj1mfHxbXSkucHVzaChsLFwiXCIrayk6XCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIiE9PWwmJlwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIhPT1sJiYoY2EuaGFzT3duUHJvcGVydHkobCk/KG51bGwhPWsmJlwib25TY3JvbGxcIj09PWwmJkcoXCJzY3JvbGxcIixhKSxmfHxoPT09a3x8KGY9W10pKTpcIm9iamVjdFwiPT09dHlwZW9mIGsmJm51bGwhPT1rJiZrLiQkdHlwZW9mPT09R2E/ay50b1N0cmluZygpOihmPWZ8fFtdKS5wdXNoKGwsaykpfWMmJihmPWZ8fFtdKS5wdXNoKFwic3R5bGVcIixcbmMpO3ZhciBsPWY7aWYoYi51cGRhdGVRdWV1ZT1sKWIuZmxhZ3N8PTR9fTtFaT1mdW5jdGlvbihhLGIsYyxkKXtjIT09ZCYmKGIuZmxhZ3N8PTQpfTtmdW5jdGlvbiBGaShhLGIpe2lmKCFsaClzd2l0Y2goYS50YWlsTW9kZSl7Y2FzZSBcImhpZGRlblwiOmI9YS50YWlsO2Zvcih2YXIgYz1udWxsO251bGwhPT1iOyludWxsIT09Yi5hbHRlcm5hdGUmJihjPWIpLGI9Yi5zaWJsaW5nO251bGw9PT1jP2EudGFpbD1udWxsOmMuc2libGluZz1udWxsO2JyZWFrO2Nhc2UgXCJjb2xsYXBzZWRcIjpjPWEudGFpbDtmb3IodmFyIGQ9bnVsbDtudWxsIT09YzspbnVsbCE9PWMuYWx0ZXJuYXRlJiYoZD1jKSxjPWMuc2libGluZztudWxsPT09ZD9ifHxudWxsPT09YS50YWlsP2EudGFpbD1udWxsOmEudGFpbC5zaWJsaW5nPW51bGw6ZC5zaWJsaW5nPW51bGx9fVxuZnVuY3Rpb24gR2koYSxiLGMpe3ZhciBkPWIucGVuZGluZ1Byb3BzO3N3aXRjaChiLnRhZyl7Y2FzZSAyOmNhc2UgMTY6Y2FzZSAxNTpjYXNlIDA6Y2FzZSAxMTpjYXNlIDc6Y2FzZSA4OmNhc2UgMTI6Y2FzZSA5OmNhc2UgMTQ6cmV0dXJuIG51bGw7Y2FzZSAxOnJldHVybiBGZihiLnR5cGUpJiZHZigpLG51bGw7Y2FzZSAzOmZoKCk7SChOKTtIKE0pO3VoKCk7ZD1iLnN0YXRlTm9kZTtkLnBlbmRpbmdDb250ZXh0JiYoZC5jb250ZXh0PWQucGVuZGluZ0NvbnRleHQsZC5wZW5kaW5nQ29udGV4dD1udWxsKTtpZihudWxsPT09YXx8bnVsbD09PWEuY2hpbGQpcmgoYik/Yi5mbGFnc3w9NDpkLmh5ZHJhdGV8fChiLmZsYWdzfD0yNTYpO0NpKGIpO3JldHVybiBudWxsO2Nhc2UgNTpoaChiKTt2YXIgZT1kaChjaC5jdXJyZW50KTtjPWIudHlwZTtpZihudWxsIT09YSYmbnVsbCE9Yi5zdGF0ZU5vZGUpRGkoYSxiLGMsZCxlKSxhLnJlZiE9PWIucmVmJiYoYi5mbGFnc3w9MTI4KTtlbHNle2lmKCFkKXtpZihudWxsPT09XG5iLnN0YXRlTm9kZSl0aHJvdyBFcnJvcih5KDE2NikpO3JldHVybiBudWxsfWE9ZGgoYWguY3VycmVudCk7aWYocmgoYikpe2Q9Yi5zdGF0ZU5vZGU7Yz1iLnR5cGU7dmFyIGY9Yi5tZW1vaXplZFByb3BzO2Rbd2ZdPWI7ZFt4Zl09Zjtzd2l0Y2goYyl7Y2FzZSBcImRpYWxvZ1wiOkcoXCJjYW5jZWxcIixkKTtHKFwiY2xvc2VcIixkKTticmVhaztjYXNlIFwiaWZyYW1lXCI6Y2FzZSBcIm9iamVjdFwiOmNhc2UgXCJlbWJlZFwiOkcoXCJsb2FkXCIsZCk7YnJlYWs7Y2FzZSBcInZpZGVvXCI6Y2FzZSBcImF1ZGlvXCI6Zm9yKGE9MDthPFhlLmxlbmd0aDthKyspRyhYZVthXSxkKTticmVhaztjYXNlIFwic291cmNlXCI6RyhcImVycm9yXCIsZCk7YnJlYWs7Y2FzZSBcImltZ1wiOmNhc2UgXCJpbWFnZVwiOmNhc2UgXCJsaW5rXCI6RyhcImVycm9yXCIsZCk7RyhcImxvYWRcIixkKTticmVhaztjYXNlIFwiZGV0YWlsc1wiOkcoXCJ0b2dnbGVcIixkKTticmVhaztjYXNlIFwiaW5wdXRcIjpaYShkLGYpO0coXCJpbnZhbGlkXCIsZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmQuX3dyYXBwZXJTdGF0ZT1cbnt3YXNNdWx0aXBsZTohIWYubXVsdGlwbGV9O0coXCJpbnZhbGlkXCIsZCk7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6aGIoZCxmKSxHKFwiaW52YWxpZFwiLGQpfXZiKGMsZik7YT1udWxsO2Zvcih2YXIgZyBpbiBmKWYuaGFzT3duUHJvcGVydHkoZykmJihlPWZbZ10sXCJjaGlsZHJlblwiPT09Zz9cInN0cmluZ1wiPT09dHlwZW9mIGU/ZC50ZXh0Q29udGVudCE9PWUmJihhPVtcImNoaWxkcmVuXCIsZV0pOlwibnVtYmVyXCI9PT10eXBlb2YgZSYmZC50ZXh0Q29udGVudCE9PVwiXCIrZSYmKGE9W1wiY2hpbGRyZW5cIixcIlwiK2VdKTpjYS5oYXNPd25Qcm9wZXJ0eShnKSYmbnVsbCE9ZSYmXCJvblNjcm9sbFwiPT09ZyYmRyhcInNjcm9sbFwiLGQpKTtzd2l0Y2goYyl7Y2FzZSBcImlucHV0XCI6VmEoZCk7Y2IoZCxmLCEwKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpWYShkKTtqYihkKTticmVhaztjYXNlIFwic2VsZWN0XCI6Y2FzZSBcIm9wdGlvblwiOmJyZWFrO2RlZmF1bHQ6XCJmdW5jdGlvblwiPT09dHlwZW9mIGYub25DbGljayYmKGQub25jbGljaz1cbmpmKX1kPWE7Yi51cGRhdGVRdWV1ZT1kO251bGwhPT1kJiYoYi5mbGFnc3w9NCl9ZWxzZXtnPTk9PT1lLm5vZGVUeXBlP2U6ZS5vd25lckRvY3VtZW50O2E9PT1rYi5odG1sJiYoYT1sYihjKSk7YT09PWtiLmh0bWw/XCJzY3JpcHRcIj09PWM/KGE9Zy5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLGEuaW5uZXJIVE1MPVwiPHNjcmlwdD5cXHgzYy9zY3JpcHQ+XCIsYT1hLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCkpOlwic3RyaW5nXCI9PT10eXBlb2YgZC5pcz9hPWcuY3JlYXRlRWxlbWVudChjLHtpczpkLmlzfSk6KGE9Zy5jcmVhdGVFbGVtZW50KGMpLFwic2VsZWN0XCI9PT1jJiYoZz1hLGQubXVsdGlwbGU/Zy5tdWx0aXBsZT0hMDpkLnNpemUmJihnLnNpemU9ZC5zaXplKSkpOmE9Zy5jcmVhdGVFbGVtZW50TlMoYSxjKTthW3dmXT1iO2FbeGZdPWQ7QmkoYSxiLCExLCExKTtiLnN0YXRlTm9kZT1hO2c9d2IoYyxkKTtzd2l0Y2goYyl7Y2FzZSBcImRpYWxvZ1wiOkcoXCJjYW5jZWxcIixhKTtHKFwiY2xvc2VcIixhKTtcbmU9ZDticmVhaztjYXNlIFwiaWZyYW1lXCI6Y2FzZSBcIm9iamVjdFwiOmNhc2UgXCJlbWJlZFwiOkcoXCJsb2FkXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJ2aWRlb1wiOmNhc2UgXCJhdWRpb1wiOmZvcihlPTA7ZTxYZS5sZW5ndGg7ZSsrKUcoWGVbZV0sYSk7ZT1kO2JyZWFrO2Nhc2UgXCJzb3VyY2VcIjpHKFwiZXJyb3JcIixhKTtlPWQ7YnJlYWs7Y2FzZSBcImltZ1wiOmNhc2UgXCJpbWFnZVwiOmNhc2UgXCJsaW5rXCI6RyhcImVycm9yXCIsYSk7RyhcImxvYWRcIixhKTtlPWQ7YnJlYWs7Y2FzZSBcImRldGFpbHNcIjpHKFwidG9nZ2xlXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJpbnB1dFwiOlphKGEsZCk7ZT1ZYShhLGQpO0coXCJpbnZhbGlkXCIsYSk7YnJlYWs7Y2FzZSBcIm9wdGlvblwiOmU9ZWIoYSxkKTticmVhaztjYXNlIFwic2VsZWN0XCI6YS5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIWQubXVsdGlwbGV9O2U9bSh7fSxkLHt2YWx1ZTp2b2lkIDB9KTtHKFwiaW52YWxpZFwiLGEpO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmhiKGEsZCk7ZT1cbmdiKGEsZCk7RyhcImludmFsaWRcIixhKTticmVhaztkZWZhdWx0OmU9ZH12YihjLGUpO3ZhciBoPWU7Zm9yKGYgaW4gaClpZihoLmhhc093blByb3BlcnR5KGYpKXt2YXIgaz1oW2ZdO1wic3R5bGVcIj09PWY/dGIoYSxrKTpcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI9PT1mPyhrPWs/ay5fX2h0bWw6dm9pZCAwLG51bGwhPWsmJm9iKGEsaykpOlwiY2hpbGRyZW5cIj09PWY/XCJzdHJpbmdcIj09PXR5cGVvZiBrPyhcInRleHRhcmVhXCIhPT1jfHxcIlwiIT09aykmJnBiKGEsayk6XCJudW1iZXJcIj09PXR5cGVvZiBrJiZwYihhLFwiXCIrayk6XCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIiE9PWYmJlwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIhPT1mJiZcImF1dG9Gb2N1c1wiIT09ZiYmKGNhLmhhc093blByb3BlcnR5KGYpP251bGwhPWsmJlwib25TY3JvbGxcIj09PWYmJkcoXCJzY3JvbGxcIixhKTpudWxsIT1rJiZxYShhLGYsayxnKSl9c3dpdGNoKGMpe2Nhc2UgXCJpbnB1dFwiOlZhKGEpO2NiKGEsZCwhMSk7XG5icmVhaztjYXNlIFwidGV4dGFyZWFcIjpWYShhKTtqYihhKTticmVhaztjYXNlIFwib3B0aW9uXCI6bnVsbCE9ZC52YWx1ZSYmYS5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLFwiXCIrU2EoZC52YWx1ZSkpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjphLm11bHRpcGxlPSEhZC5tdWx0aXBsZTtmPWQudmFsdWU7bnVsbCE9Zj9mYihhLCEhZC5tdWx0aXBsZSxmLCExKTpudWxsIT1kLmRlZmF1bHRWYWx1ZSYmZmIoYSwhIWQubXVsdGlwbGUsZC5kZWZhdWx0VmFsdWUsITApO2JyZWFrO2RlZmF1bHQ6XCJmdW5jdGlvblwiPT09dHlwZW9mIGUub25DbGljayYmKGEub25jbGljaz1qZil9bWYoYyxkKSYmKGIuZmxhZ3N8PTQpfW51bGwhPT1iLnJlZiYmKGIuZmxhZ3N8PTEyOCl9cmV0dXJuIG51bGw7Y2FzZSA2OmlmKGEmJm51bGwhPWIuc3RhdGVOb2RlKUVpKGEsYixhLm1lbW9pemVkUHJvcHMsZCk7ZWxzZXtpZihcInN0cmluZ1wiIT09dHlwZW9mIGQmJm51bGw9PT1iLnN0YXRlTm9kZSl0aHJvdyBFcnJvcih5KDE2NikpO1xuYz1kaChjaC5jdXJyZW50KTtkaChhaC5jdXJyZW50KTtyaChiKT8oZD1iLnN0YXRlTm9kZSxjPWIubWVtb2l6ZWRQcm9wcyxkW3dmXT1iLGQubm9kZVZhbHVlIT09YyYmKGIuZmxhZ3N8PTQpKTooZD0oOT09PWMubm9kZVR5cGU/YzpjLm93bmVyRG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKGQpLGRbd2ZdPWIsYi5zdGF0ZU5vZGU9ZCl9cmV0dXJuIG51bGw7Y2FzZSAxMzpIKFApO2Q9Yi5tZW1vaXplZFN0YXRlO2lmKDAhPT0oYi5mbGFncyY2NCkpcmV0dXJuIGIubGFuZXM9YyxiO2Q9bnVsbCE9PWQ7Yz0hMTtudWxsPT09YT92b2lkIDAhPT1iLm1lbW9pemVkUHJvcHMuZmFsbGJhY2smJnJoKGIpOmM9bnVsbCE9PWEubWVtb2l6ZWRTdGF0ZTtpZihkJiYhYyYmMCE9PShiLm1vZGUmMikpaWYobnVsbD09PWEmJiEwIT09Yi5tZW1vaXplZFByb3BzLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrfHwwIT09KFAuY3VycmVudCYxKSkwPT09ViYmKFY9Myk7ZWxzZXtpZigwPT09Vnx8Mz09PVYpVj1cbjQ7bnVsbD09PVV8fDA9PT0oRGcmMTM0MjE3NzI3KSYmMD09PShIaSYxMzQyMTc3MjcpfHxJaShVLFcpfWlmKGR8fGMpYi5mbGFnc3w9NDtyZXR1cm4gbnVsbDtjYXNlIDQ6cmV0dXJuIGZoKCksQ2koYiksbnVsbD09PWEmJmNmKGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLG51bGw7Y2FzZSAxMDpyZXR1cm4gcmcoYiksbnVsbDtjYXNlIDE3OnJldHVybiBGZihiLnR5cGUpJiZHZigpLG51bGw7Y2FzZSAxOTpIKFApO2Q9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGw9PT1kKXJldHVybiBudWxsO2Y9MCE9PShiLmZsYWdzJjY0KTtnPWQucmVuZGVyaW5nO2lmKG51bGw9PT1nKWlmKGYpRmkoZCwhMSk7ZWxzZXtpZigwIT09Vnx8bnVsbCE9PWEmJjAhPT0oYS5mbGFncyY2NCkpZm9yKGE9Yi5jaGlsZDtudWxsIT09YTspe2c9aWgoYSk7aWYobnVsbCE9PWcpe2IuZmxhZ3N8PTY0O0ZpKGQsITEpO2Y9Zy51cGRhdGVRdWV1ZTtudWxsIT09ZiYmKGIudXBkYXRlUXVldWU9ZixiLmZsYWdzfD00KTtcbm51bGw9PT1kLmxhc3RFZmZlY3QmJihiLmZpcnN0RWZmZWN0PW51bGwpO2IubGFzdEVmZmVjdD1kLmxhc3RFZmZlY3Q7ZD1jO2ZvcihjPWIuY2hpbGQ7bnVsbCE9PWM7KWY9YyxhPWQsZi5mbGFncyY9MixmLm5leHRFZmZlY3Q9bnVsbCxmLmZpcnN0RWZmZWN0PW51bGwsZi5sYXN0RWZmZWN0PW51bGwsZz1mLmFsdGVybmF0ZSxudWxsPT09Zz8oZi5jaGlsZExhbmVzPTAsZi5sYW5lcz1hLGYuY2hpbGQ9bnVsbCxmLm1lbW9pemVkUHJvcHM9bnVsbCxmLm1lbW9pemVkU3RhdGU9bnVsbCxmLnVwZGF0ZVF1ZXVlPW51bGwsZi5kZXBlbmRlbmNpZXM9bnVsbCxmLnN0YXRlTm9kZT1udWxsKTooZi5jaGlsZExhbmVzPWcuY2hpbGRMYW5lcyxmLmxhbmVzPWcubGFuZXMsZi5jaGlsZD1nLmNoaWxkLGYubWVtb2l6ZWRQcm9wcz1nLm1lbW9pemVkUHJvcHMsZi5tZW1vaXplZFN0YXRlPWcubWVtb2l6ZWRTdGF0ZSxmLnVwZGF0ZVF1ZXVlPWcudXBkYXRlUXVldWUsZi50eXBlPWcudHlwZSxhPWcuZGVwZW5kZW5jaWVzLFxuZi5kZXBlbmRlbmNpZXM9bnVsbD09PWE/bnVsbDp7bGFuZXM6YS5sYW5lcyxmaXJzdENvbnRleHQ6YS5maXJzdENvbnRleHR9KSxjPWMuc2libGluZztJKFAsUC5jdXJyZW50JjF8Mik7cmV0dXJuIGIuY2hpbGR9YT1hLnNpYmxpbmd9bnVsbCE9PWQudGFpbCYmTygpPkppJiYoYi5mbGFnc3w9NjQsZj0hMCxGaShkLCExKSxiLmxhbmVzPTMzNTU0NDMyKX1lbHNle2lmKCFmKWlmKGE9aWgoZyksbnVsbCE9PWEpe2lmKGIuZmxhZ3N8PTY0LGY9ITAsYz1hLnVwZGF0ZVF1ZXVlLG51bGwhPT1jJiYoYi51cGRhdGVRdWV1ZT1jLGIuZmxhZ3N8PTQpLEZpKGQsITApLG51bGw9PT1kLnRhaWwmJlwiaGlkZGVuXCI9PT1kLnRhaWxNb2RlJiYhZy5hbHRlcm5hdGUmJiFsaClyZXR1cm4gYj1iLmxhc3RFZmZlY3Q9ZC5sYXN0RWZmZWN0LG51bGwhPT1iJiYoYi5uZXh0RWZmZWN0PW51bGwpLG51bGx9ZWxzZSAyKk8oKS1kLnJlbmRlcmluZ1N0YXJ0VGltZT5KaSYmMTA3Mzc0MTgyNCE9PWMmJihiLmZsYWdzfD1cbjY0LGY9ITAsRmkoZCwhMSksYi5sYW5lcz0zMzU1NDQzMik7ZC5pc0JhY2t3YXJkcz8oZy5zaWJsaW5nPWIuY2hpbGQsYi5jaGlsZD1nKTooYz1kLmxhc3QsbnVsbCE9PWM/Yy5zaWJsaW5nPWc6Yi5jaGlsZD1nLGQubGFzdD1nKX1yZXR1cm4gbnVsbCE9PWQudGFpbD8oYz1kLnRhaWwsZC5yZW5kZXJpbmc9YyxkLnRhaWw9Yy5zaWJsaW5nLGQubGFzdEVmZmVjdD1iLmxhc3RFZmZlY3QsZC5yZW5kZXJpbmdTdGFydFRpbWU9TygpLGMuc2libGluZz1udWxsLGI9UC5jdXJyZW50LEkoUCxmP2ImMXwyOmImMSksYyk6bnVsbDtjYXNlIDIzOmNhc2UgMjQ6cmV0dXJuIEtpKCksbnVsbCE9PWEmJm51bGwhPT1hLm1lbW9pemVkU3RhdGUhPT0obnVsbCE9PWIubWVtb2l6ZWRTdGF0ZSkmJlwidW5zdGFibGUtZGVmZXItd2l0aG91dC1oaWRpbmdcIiE9PWQubW9kZSYmKGIuZmxhZ3N8PTQpLG51bGx9dGhyb3cgRXJyb3IoeSgxNTYsYi50YWcpKTt9XG5mdW5jdGlvbiBMaShhKXtzd2l0Y2goYS50YWcpe2Nhc2UgMTpGZihhLnR5cGUpJiZHZigpO3ZhciBiPWEuZmxhZ3M7cmV0dXJuIGImNDA5Nj8oYS5mbGFncz1iJi00MDk3fDY0LGEpOm51bGw7Y2FzZSAzOmZoKCk7SChOKTtIKE0pO3VoKCk7Yj1hLmZsYWdzO2lmKDAhPT0oYiY2NCkpdGhyb3cgRXJyb3IoeSgyODUpKTthLmZsYWdzPWImLTQwOTd8NjQ7cmV0dXJuIGE7Y2FzZSA1OnJldHVybiBoaChhKSxudWxsO2Nhc2UgMTM6cmV0dXJuIEgoUCksYj1hLmZsYWdzLGImNDA5Nj8oYS5mbGFncz1iJi00MDk3fDY0LGEpOm51bGw7Y2FzZSAxOTpyZXR1cm4gSChQKSxudWxsO2Nhc2UgNDpyZXR1cm4gZmgoKSxudWxsO2Nhc2UgMTA6cmV0dXJuIHJnKGEpLG51bGw7Y2FzZSAyMzpjYXNlIDI0OnJldHVybiBLaSgpLG51bGw7ZGVmYXVsdDpyZXR1cm4gbnVsbH19XG5mdW5jdGlvbiBNaShhLGIpe3RyeXt2YXIgYz1cIlwiLGQ9YjtkbyBjKz1RYShkKSxkPWQucmV0dXJuO3doaWxlKGQpO3ZhciBlPWN9Y2F0Y2goZil7ZT1cIlxcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6IFwiK2YubWVzc2FnZStcIlxcblwiK2Yuc3RhY2t9cmV0dXJue3ZhbHVlOmEsc291cmNlOmIsc3RhY2s6ZX19ZnVuY3Rpb24gTmkoYSxiKXt0cnl7Y29uc29sZS5lcnJvcihiLnZhbHVlKX1jYXRjaChjKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYzt9KX19dmFyIE9pPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBXZWFrTWFwP1dlYWtNYXA6TWFwO2Z1bmN0aW9uIFBpKGEsYixjKXtjPXpnKC0xLGMpO2MudGFnPTM7Yy5wYXlsb2FkPXtlbGVtZW50Om51bGx9O3ZhciBkPWIudmFsdWU7Yy5jYWxsYmFjaz1mdW5jdGlvbigpe1FpfHwoUWk9ITAsUmk9ZCk7TmkoYSxiKX07cmV0dXJuIGN9XG5mdW5jdGlvbiBTaShhLGIsYyl7Yz16ZygtMSxjKTtjLnRhZz0zO3ZhciBkPWEudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQpe3ZhciBlPWIudmFsdWU7Yy5wYXlsb2FkPWZ1bmN0aW9uKCl7TmkoYSxiKTtyZXR1cm4gZChlKX19dmFyIGY9YS5zdGF0ZU5vZGU7bnVsbCE9PWYmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBmLmNvbXBvbmVudERpZENhdGNoJiYoYy5jYWxsYmFjaz1mdW5jdGlvbigpe1wiZnVuY3Rpb25cIiE9PXR5cGVvZiBkJiYobnVsbD09PVRpP1RpPW5ldyBTZXQoW3RoaXNdKTpUaS5hZGQodGhpcyksTmkoYSxiKSk7dmFyIGM9Yi5zdGFjazt0aGlzLmNvbXBvbmVudERpZENhdGNoKGIudmFsdWUse2NvbXBvbmVudFN0YWNrOm51bGwhPT1jP2M6XCJcIn0pfSk7cmV0dXJuIGN9dmFyIFVpPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBXZWFrU2V0P1dlYWtTZXQ6U2V0O1xuZnVuY3Rpb24gVmkoYSl7dmFyIGI9YS5yZWY7aWYobnVsbCE9PWIpaWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGIpdHJ5e2IobnVsbCl9Y2F0Y2goYyl7V2koYSxjKX1lbHNlIGIuY3VycmVudD1udWxsfWZ1bmN0aW9uIFhpKGEsYil7c3dpdGNoKGIudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OmNhc2UgMjI6cmV0dXJuO2Nhc2UgMTppZihiLmZsYWdzJjI1NiYmbnVsbCE9PWEpe3ZhciBjPWEubWVtb2l6ZWRQcm9wcyxkPWEubWVtb2l6ZWRTdGF0ZTthPWIuc3RhdGVOb2RlO2I9YS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShiLmVsZW1lbnRUeXBlPT09Yi50eXBlP2M6bGcoYi50eXBlLGMpLGQpO2EuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGU9Yn1yZXR1cm47Y2FzZSAzOmIuZmxhZ3MmMjU2JiZxZihiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtyZXR1cm47Y2FzZSA1OmNhc2UgNjpjYXNlIDQ6Y2FzZSAxNzpyZXR1cm59dGhyb3cgRXJyb3IoeSgxNjMpKTt9XG5mdW5jdGlvbiBZaShhLGIsYyl7c3dpdGNoKGMudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OmNhc2UgMjI6Yj1jLnVwZGF0ZVF1ZXVlO2I9bnVsbCE9PWI/Yi5sYXN0RWZmZWN0Om51bGw7aWYobnVsbCE9PWIpe2E9Yj1iLm5leHQ7ZG97aWYoMz09PShhLnRhZyYzKSl7dmFyIGQ9YS5jcmVhdGU7YS5kZXN0cm95PWQoKX1hPWEubmV4dH13aGlsZShhIT09Yil9Yj1jLnVwZGF0ZVF1ZXVlO2I9bnVsbCE9PWI/Yi5sYXN0RWZmZWN0Om51bGw7aWYobnVsbCE9PWIpe2E9Yj1iLm5leHQ7ZG97dmFyIGU9YTtkPWUubmV4dDtlPWUudGFnOzAhPT0oZSY0KSYmMCE9PShlJjEpJiYoWmkoYyxhKSwkaShjLGEpKTthPWR9d2hpbGUoYSE9PWIpfXJldHVybjtjYXNlIDE6YT1jLnN0YXRlTm9kZTtjLmZsYWdzJjQmJihudWxsPT09Yj9hLmNvbXBvbmVudERpZE1vdW50KCk6KGQ9Yy5lbGVtZW50VHlwZT09PWMudHlwZT9iLm1lbW9pemVkUHJvcHM6bGcoYy50eXBlLGIubWVtb2l6ZWRQcm9wcyksYS5jb21wb25lbnREaWRVcGRhdGUoZCxcbmIubWVtb2l6ZWRTdGF0ZSxhLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKSkpO2I9Yy51cGRhdGVRdWV1ZTtudWxsIT09YiYmRWcoYyxiLGEpO3JldHVybjtjYXNlIDM6Yj1jLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1iKXthPW51bGw7aWYobnVsbCE9PWMuY2hpbGQpc3dpdGNoKGMuY2hpbGQudGFnKXtjYXNlIDU6YT1jLmNoaWxkLnN0YXRlTm9kZTticmVhaztjYXNlIDE6YT1jLmNoaWxkLnN0YXRlTm9kZX1FZyhjLGIsYSl9cmV0dXJuO2Nhc2UgNTphPWMuc3RhdGVOb2RlO251bGw9PT1iJiZjLmZsYWdzJjQmJm1mKGMudHlwZSxjLm1lbW9pemVkUHJvcHMpJiZhLmZvY3VzKCk7cmV0dXJuO2Nhc2UgNjpyZXR1cm47Y2FzZSA0OnJldHVybjtjYXNlIDEyOnJldHVybjtjYXNlIDEzOm51bGw9PT1jLm1lbW9pemVkU3RhdGUmJihjPWMuYWx0ZXJuYXRlLG51bGwhPT1jJiYoYz1jLm1lbW9pemVkU3RhdGUsbnVsbCE9PWMmJihjPWMuZGVoeWRyYXRlZCxudWxsIT09YyYmQ2MoYykpKSk7XG5yZXR1cm47Y2FzZSAxOTpjYXNlIDE3OmNhc2UgMjA6Y2FzZSAyMTpjYXNlIDIzOmNhc2UgMjQ6cmV0dXJufXRocm93IEVycm9yKHkoMTYzKSk7fVxuZnVuY3Rpb24gYWooYSxiKXtmb3IodmFyIGM9YTs7KXtpZig1PT09Yy50YWcpe3ZhciBkPWMuc3RhdGVOb2RlO2lmKGIpZD1kLnN0eWxlLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLnNldFByb3BlcnR5P2Quc2V0UHJvcGVydHkoXCJkaXNwbGF5XCIsXCJub25lXCIsXCJpbXBvcnRhbnRcIik6ZC5kaXNwbGF5PVwibm9uZVwiO2Vsc2V7ZD1jLnN0YXRlTm9kZTt2YXIgZT1jLm1lbW9pemVkUHJvcHMuc3R5bGU7ZT12b2lkIDAhPT1lJiZudWxsIT09ZSYmZS5oYXNPd25Qcm9wZXJ0eShcImRpc3BsYXlcIik/ZS5kaXNwbGF5Om51bGw7ZC5zdHlsZS5kaXNwbGF5PXNiKFwiZGlzcGxheVwiLGUpfX1lbHNlIGlmKDY9PT1jLnRhZyljLnN0YXRlTm9kZS5ub2RlVmFsdWU9Yj9cIlwiOmMubWVtb2l6ZWRQcm9wcztlbHNlIGlmKCgyMyE9PWMudGFnJiYyNCE9PWMudGFnfHxudWxsPT09Yy5tZW1vaXplZFN0YXRlfHxjPT09YSkmJm51bGwhPT1jLmNoaWxkKXtjLmNoaWxkLnJldHVybj1jO2M9Yy5jaGlsZDtjb250aW51ZX1pZihjPT09XG5hKWJyZWFrO2Zvcig7bnVsbD09PWMuc2libGluZzspe2lmKG51bGw9PT1jLnJldHVybnx8Yy5yZXR1cm49PT1hKXJldHVybjtjPWMucmV0dXJufWMuc2libGluZy5yZXR1cm49Yy5yZXR1cm47Yz1jLnNpYmxpbmd9fVxuZnVuY3Rpb24gYmooYSxiKXtpZihNZiYmXCJmdW5jdGlvblwiPT09dHlwZW9mIE1mLm9uQ29tbWl0RmliZXJVbm1vdW50KXRyeXtNZi5vbkNvbW1pdEZpYmVyVW5tb3VudChMZixiKX1jYXRjaChmKXt9c3dpdGNoKGIudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6Y2FzZSAyMjphPWIudXBkYXRlUXVldWU7aWYobnVsbCE9PWEmJihhPWEubGFzdEVmZmVjdCxudWxsIT09YSkpe3ZhciBjPWE9YS5uZXh0O2Rve3ZhciBkPWMsZT1kLmRlc3Ryb3k7ZD1kLnRhZztpZih2b2lkIDAhPT1lKWlmKDAhPT0oZCY0KSlaaShiLGMpO2Vsc2V7ZD1iO3RyeXtlKCl9Y2F0Y2goZil7V2koZCxmKX19Yz1jLm5leHR9d2hpbGUoYyE9PWEpfWJyZWFrO2Nhc2UgMTpWaShiKTthPWIuc3RhdGVOb2RlO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhLmNvbXBvbmVudFdpbGxVbm1vdW50KXRyeXthLnByb3BzPWIubWVtb2l6ZWRQcm9wcyxhLnN0YXRlPWIubWVtb2l6ZWRTdGF0ZSxhLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2goZil7V2koYixcbmYpfWJyZWFrO2Nhc2UgNTpWaShiKTticmVhaztjYXNlIDQ6Y2ooYSxiKX19ZnVuY3Rpb24gZGooYSl7YS5hbHRlcm5hdGU9bnVsbDthLmNoaWxkPW51bGw7YS5kZXBlbmRlbmNpZXM9bnVsbDthLmZpcnN0RWZmZWN0PW51bGw7YS5sYXN0RWZmZWN0PW51bGw7YS5tZW1vaXplZFByb3BzPW51bGw7YS5tZW1vaXplZFN0YXRlPW51bGw7YS5wZW5kaW5nUHJvcHM9bnVsbDthLnJldHVybj1udWxsO2EudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiBlaihhKXtyZXR1cm4gNT09PWEudGFnfHwzPT09YS50YWd8fDQ9PT1hLnRhZ31cbmZ1bmN0aW9uIGZqKGEpe2E6e2Zvcih2YXIgYj1hLnJldHVybjtudWxsIT09Yjspe2lmKGVqKGIpKWJyZWFrIGE7Yj1iLnJldHVybn10aHJvdyBFcnJvcih5KDE2MCkpO312YXIgYz1iO2I9Yy5zdGF0ZU5vZGU7c3dpdGNoKGMudGFnKXtjYXNlIDU6dmFyIGQ9ITE7YnJlYWs7Y2FzZSAzOmI9Yi5jb250YWluZXJJbmZvO2Q9ITA7YnJlYWs7Y2FzZSA0OmI9Yi5jb250YWluZXJJbmZvO2Q9ITA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcih5KDE2MSkpO31jLmZsYWdzJjE2JiYocGIoYixcIlwiKSxjLmZsYWdzJj0tMTcpO2E6Yjpmb3IoYz1hOzspe2Zvcig7bnVsbD09PWMuc2libGluZzspe2lmKG51bGw9PT1jLnJldHVybnx8ZWooYy5yZXR1cm4pKXtjPW51bGw7YnJlYWsgYX1jPWMucmV0dXJufWMuc2libGluZy5yZXR1cm49Yy5yZXR1cm47Zm9yKGM9Yy5zaWJsaW5nOzUhPT1jLnRhZyYmNiE9PWMudGFnJiYxOCE9PWMudGFnOyl7aWYoYy5mbGFncyYyKWNvbnRpbnVlIGI7aWYobnVsbD09PVxuYy5jaGlsZHx8ND09PWMudGFnKWNvbnRpbnVlIGI7ZWxzZSBjLmNoaWxkLnJldHVybj1jLGM9Yy5jaGlsZH1pZighKGMuZmxhZ3MmMikpe2M9Yy5zdGF0ZU5vZGU7YnJlYWsgYX19ZD9naihhLGMsYik6aGooYSxjLGIpfVxuZnVuY3Rpb24gZ2ooYSxiLGMpe3ZhciBkPWEudGFnLGU9NT09PWR8fDY9PT1kO2lmKGUpYT1lP2Euc3RhdGVOb2RlOmEuc3RhdGVOb2RlLmluc3RhbmNlLGI/OD09PWMubm9kZVR5cGU/Yy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLGIpOmMuaW5zZXJ0QmVmb3JlKGEsYik6KDg9PT1jLm5vZGVUeXBlPyhiPWMucGFyZW50Tm9kZSxiLmluc2VydEJlZm9yZShhLGMpKTooYj1jLGIuYXBwZW5kQ2hpbGQoYSkpLGM9Yy5fcmVhY3RSb290Q29udGFpbmVyLG51bGwhPT1jJiZ2b2lkIDAhPT1jfHxudWxsIT09Yi5vbmNsaWNrfHwoYi5vbmNsaWNrPWpmKSk7ZWxzZSBpZig0IT09ZCYmKGE9YS5jaGlsZCxudWxsIT09YSkpZm9yKGdqKGEsYixjKSxhPWEuc2libGluZztudWxsIT09YTspZ2ooYSxiLGMpLGE9YS5zaWJsaW5nfVxuZnVuY3Rpb24gaGooYSxiLGMpe3ZhciBkPWEudGFnLGU9NT09PWR8fDY9PT1kO2lmKGUpYT1lP2Euc3RhdGVOb2RlOmEuc3RhdGVOb2RlLmluc3RhbmNlLGI/Yy5pbnNlcnRCZWZvcmUoYSxiKTpjLmFwcGVuZENoaWxkKGEpO2Vsc2UgaWYoNCE9PWQmJihhPWEuY2hpbGQsbnVsbCE9PWEpKWZvcihoaihhLGIsYyksYT1hLnNpYmxpbmc7bnVsbCE9PWE7KWhqKGEsYixjKSxhPWEuc2libGluZ31cbmZ1bmN0aW9uIGNqKGEsYil7Zm9yKHZhciBjPWIsZD0hMSxlLGY7Oyl7aWYoIWQpe2Q9Yy5yZXR1cm47YTpmb3IoOzspe2lmKG51bGw9PT1kKXRocm93IEVycm9yKHkoMTYwKSk7ZT1kLnN0YXRlTm9kZTtzd2l0Y2goZC50YWcpe2Nhc2UgNTpmPSExO2JyZWFrIGE7Y2FzZSAzOmU9ZS5jb250YWluZXJJbmZvO2Y9ITA7YnJlYWsgYTtjYXNlIDQ6ZT1lLmNvbnRhaW5lckluZm87Zj0hMDticmVhayBhfWQ9ZC5yZXR1cm59ZD0hMH1pZig1PT09Yy50YWd8fDY9PT1jLnRhZyl7YTpmb3IodmFyIGc9YSxoPWMsaz1oOzspaWYoYmooZyxrKSxudWxsIT09ay5jaGlsZCYmNCE9PWsudGFnKWsuY2hpbGQucmV0dXJuPWssaz1rLmNoaWxkO2Vsc2V7aWYoaz09PWgpYnJlYWsgYTtmb3IoO251bGw9PT1rLnNpYmxpbmc7KXtpZihudWxsPT09ay5yZXR1cm58fGsucmV0dXJuPT09aClicmVhayBhO2s9ay5yZXR1cm59ay5zaWJsaW5nLnJldHVybj1rLnJldHVybjtrPWsuc2libGluZ31mPyhnPWUsaD1jLnN0YXRlTm9kZSxcbjg9PT1nLm5vZGVUeXBlP2cucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChoKTpnLnJlbW92ZUNoaWxkKGgpKTplLnJlbW92ZUNoaWxkKGMuc3RhdGVOb2RlKX1lbHNlIGlmKDQ9PT1jLnRhZyl7aWYobnVsbCE9PWMuY2hpbGQpe2U9Yy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztmPSEwO2MuY2hpbGQucmV0dXJuPWM7Yz1jLmNoaWxkO2NvbnRpbnVlfX1lbHNlIGlmKGJqKGEsYyksbnVsbCE9PWMuY2hpbGQpe2MuY2hpbGQucmV0dXJuPWM7Yz1jLmNoaWxkO2NvbnRpbnVlfWlmKGM9PT1iKWJyZWFrO2Zvcig7bnVsbD09PWMuc2libGluZzspe2lmKG51bGw9PT1jLnJldHVybnx8Yy5yZXR1cm49PT1iKXJldHVybjtjPWMucmV0dXJuOzQ9PT1jLnRhZyYmKGQ9ITEpfWMuc2libGluZy5yZXR1cm49Yy5yZXR1cm47Yz1jLnNpYmxpbmd9fVxuZnVuY3Rpb24gaWooYSxiKXtzd2l0Y2goYi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTpjYXNlIDIyOnZhciBjPWIudXBkYXRlUXVldWU7Yz1udWxsIT09Yz9jLmxhc3RFZmZlY3Q6bnVsbDtpZihudWxsIT09Yyl7dmFyIGQ9Yz1jLm5leHQ7ZG8gMz09PShkLnRhZyYzKSYmKGE9ZC5kZXN0cm95LGQuZGVzdHJveT12b2lkIDAsdm9pZCAwIT09YSYmYSgpKSxkPWQubmV4dDt3aGlsZShkIT09Yyl9cmV0dXJuO2Nhc2UgMTpyZXR1cm47Y2FzZSA1OmM9Yi5zdGF0ZU5vZGU7aWYobnVsbCE9Yyl7ZD1iLm1lbW9pemVkUHJvcHM7dmFyIGU9bnVsbCE9PWE/YS5tZW1vaXplZFByb3BzOmQ7YT1iLnR5cGU7dmFyIGY9Yi51cGRhdGVRdWV1ZTtiLnVwZGF0ZVF1ZXVlPW51bGw7aWYobnVsbCE9PWYpe2NbeGZdPWQ7XCJpbnB1dFwiPT09YSYmXCJyYWRpb1wiPT09ZC50eXBlJiZudWxsIT1kLm5hbWUmJiRhKGMsZCk7d2IoYSxlKTtiPXdiKGEsZCk7Zm9yKGU9MDtlPGYubGVuZ3RoO2UrPVxuMil7dmFyIGc9ZltlXSxoPWZbZSsxXTtcInN0eWxlXCI9PT1nP3RiKGMsaCk6XCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiPT09Zz9vYihjLGgpOlwiY2hpbGRyZW5cIj09PWc/cGIoYyxoKTpxYShjLGcsaCxiKX1zd2l0Y2goYSl7Y2FzZSBcImlucHV0XCI6YWIoYyxkKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjppYihjLGQpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjphPWMuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZSxjLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU9ISFkLm11bHRpcGxlLGY9ZC52YWx1ZSxudWxsIT1mP2ZiKGMsISFkLm11bHRpcGxlLGYsITEpOmEhPT0hIWQubXVsdGlwbGUmJihudWxsIT1kLmRlZmF1bHRWYWx1ZT9mYihjLCEhZC5tdWx0aXBsZSxkLmRlZmF1bHRWYWx1ZSwhMCk6ZmIoYywhIWQubXVsdGlwbGUsZC5tdWx0aXBsZT9bXTpcIlwiLCExKSl9fX1yZXR1cm47Y2FzZSA2OmlmKG51bGw9PT1iLnN0YXRlTm9kZSl0aHJvdyBFcnJvcih5KDE2MikpO2Iuc3RhdGVOb2RlLm5vZGVWYWx1ZT1cbmIubWVtb2l6ZWRQcm9wcztyZXR1cm47Y2FzZSAzOmM9Yi5zdGF0ZU5vZGU7Yy5oeWRyYXRlJiYoYy5oeWRyYXRlPSExLENjKGMuY29udGFpbmVySW5mbykpO3JldHVybjtjYXNlIDEyOnJldHVybjtjYXNlIDEzOm51bGwhPT1iLm1lbW9pemVkU3RhdGUmJihqaj1PKCksYWooYi5jaGlsZCwhMCkpO2tqKGIpO3JldHVybjtjYXNlIDE5OmtqKGIpO3JldHVybjtjYXNlIDE3OnJldHVybjtjYXNlIDIzOmNhc2UgMjQ6YWooYixudWxsIT09Yi5tZW1vaXplZFN0YXRlKTtyZXR1cm59dGhyb3cgRXJyb3IoeSgxNjMpKTt9ZnVuY3Rpb24ga2ooYSl7dmFyIGI9YS51cGRhdGVRdWV1ZTtpZihudWxsIT09Yil7YS51cGRhdGVRdWV1ZT1udWxsO3ZhciBjPWEuc3RhdGVOb2RlO251bGw9PT1jJiYoYz1hLnN0YXRlTm9kZT1uZXcgVWkpO2IuZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgZD1sai5iaW5kKG51bGwsYSxiKTtjLmhhcyhiKXx8KGMuYWRkKGIpLGIudGhlbihkLGQpKX0pfX1cbmZ1bmN0aW9uIG1qKGEsYil7cmV0dXJuIG51bGwhPT1hJiYoYT1hLm1lbW9pemVkU3RhdGUsbnVsbD09PWF8fG51bGwhPT1hLmRlaHlkcmF0ZWQpPyhiPWIubWVtb2l6ZWRTdGF0ZSxudWxsIT09YiYmbnVsbD09PWIuZGVoeWRyYXRlZCk6ITF9dmFyIG5qPU1hdGguY2VpbCxvaj1yYS5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLHBqPXJhLlJlYWN0Q3VycmVudE93bmVyLFg9MCxVPW51bGwsWT1udWxsLFc9MCxxaj0wLHJqPUJmKDApLFY9MCxzaj1udWxsLHRqPTAsRGc9MCxIaT0wLHVqPTAsdmo9bnVsbCxqaj0wLEppPUluZmluaXR5O2Z1bmN0aW9uIHdqKCl7Smk9TygpKzUwMH12YXIgWj1udWxsLFFpPSExLFJpPW51bGwsVGk9bnVsbCx4aj0hMSx5aj1udWxsLHpqPTkwLEFqPVtdLEJqPVtdLENqPW51bGwsRGo9MCxFaj1udWxsLEZqPS0xLEdqPTAsSGo9MCxJaj1udWxsLEpqPSExO2Z1bmN0aW9uIEhnKCl7cmV0dXJuIDAhPT0oWCY0OCk/TygpOi0xIT09Rmo/Rmo6Rmo9TygpfVxuZnVuY3Rpb24gSWcoYSl7YT1hLm1vZGU7aWYoMD09PShhJjIpKXJldHVybiAxO2lmKDA9PT0oYSY0KSlyZXR1cm4gOTk9PT1lZygpPzE6MjswPT09R2omJihHaj10aik7aWYoMCE9PWtnLnRyYW5zaXRpb24pezAhPT1IaiYmKEhqPW51bGwhPT12aj92ai5wZW5kaW5nTGFuZXM6MCk7YT1Hajt2YXIgYj00MTg2MTEyJn5IajtiJj0tYjswPT09YiYmKGE9NDE4NjExMiZ+YSxiPWEmLWEsMD09PWImJihiPTgxOTIpKTtyZXR1cm4gYn1hPWVnKCk7MCE9PShYJjQpJiY5OD09PWE/YT1YYygxMixHaik6KGE9U2MoYSksYT1YYyhhLEdqKSk7cmV0dXJuIGF9XG5mdW5jdGlvbiBKZyhhLGIsYyl7aWYoNTA8RGopdGhyb3cgRGo9MCxFaj1udWxsLEVycm9yKHkoMTg1KSk7YT1LaihhLGIpO2lmKG51bGw9PT1hKXJldHVybiBudWxsOyRjKGEsYixjKTthPT09VSYmKEhpfD1iLDQ9PT1WJiZJaShhLFcpKTt2YXIgZD1lZygpOzE9PT1iPzAhPT0oWCY4KSYmMD09PShYJjQ4KT9MaihhKTooTWooYSxjKSwwPT09WCYmKHdqKCksaWcoKSkpOigwPT09KFgmNCl8fDk4IT09ZCYmOTkhPT1kfHwobnVsbD09PUNqP0NqPW5ldyBTZXQoW2FdKTpDai5hZGQoYSkpLE1qKGEsYykpO3ZqPWF9ZnVuY3Rpb24gS2ooYSxiKXthLmxhbmVzfD1iO3ZhciBjPWEuYWx0ZXJuYXRlO251bGwhPT1jJiYoYy5sYW5lc3w9Yik7Yz1hO2ZvcihhPWEucmV0dXJuO251bGwhPT1hOylhLmNoaWxkTGFuZXN8PWIsYz1hLmFsdGVybmF0ZSxudWxsIT09YyYmKGMuY2hpbGRMYW5lc3w9YiksYz1hLGE9YS5yZXR1cm47cmV0dXJuIDM9PT1jLnRhZz9jLnN0YXRlTm9kZTpudWxsfVxuZnVuY3Rpb24gTWooYSxiKXtmb3IodmFyIGM9YS5jYWxsYmFja05vZGUsZD1hLnN1c3BlbmRlZExhbmVzLGU9YS5waW5nZWRMYW5lcyxmPWEuZXhwaXJhdGlvblRpbWVzLGc9YS5wZW5kaW5nTGFuZXM7MDxnOyl7dmFyIGg9MzEtVmMoZyksaz0xPDxoLGw9ZltoXTtpZigtMT09PWwpe2lmKDA9PT0oayZkKXx8MCE9PShrJmUpKXtsPWI7UmMoayk7dmFyIG49RjtmW2hdPTEwPD1uP2wrMjUwOjY8PW4/bCs1RTM6LTF9fWVsc2UgbDw9YiYmKGEuZXhwaXJlZExhbmVzfD1rKTtnJj1+a31kPVVjKGEsYT09PVU/VzowKTtiPUY7aWYoMD09PWQpbnVsbCE9PWMmJihjIT09WmYmJlBmKGMpLGEuY2FsbGJhY2tOb2RlPW51bGwsYS5jYWxsYmFja1ByaW9yaXR5PTApO2Vsc2V7aWYobnVsbCE9PWMpe2lmKGEuY2FsbGJhY2tQcmlvcml0eT09PWIpcmV0dXJuO2MhPT1aZiYmUGYoYyl9MTU9PT1iPyhjPUxqLmJpbmQobnVsbCxhKSxudWxsPT09YWc/KGFnPVtjXSxiZz1PZihVZixqZykpOmFnLnB1c2goYyksXG5jPVpmKToxND09PWI/Yz1oZyg5OSxMai5iaW5kKG51bGwsYSkpOihjPVRjKGIpLGM9aGcoYyxOai5iaW5kKG51bGwsYSkpKTthLmNhbGxiYWNrUHJpb3JpdHk9YjthLmNhbGxiYWNrTm9kZT1jfX1cbmZ1bmN0aW9uIE5qKGEpe0ZqPS0xO0hqPUdqPTA7aWYoMCE9PShYJjQ4KSl0aHJvdyBFcnJvcih5KDMyNykpO3ZhciBiPWEuY2FsbGJhY2tOb2RlO2lmKE9qKCkmJmEuY2FsbGJhY2tOb2RlIT09YilyZXR1cm4gbnVsbDt2YXIgYz1VYyhhLGE9PT1VP1c6MCk7aWYoMD09PWMpcmV0dXJuIG51bGw7dmFyIGQ9Yzt2YXIgZT1YO1h8PTE2O3ZhciBmPVBqKCk7aWYoVSE9PWF8fFchPT1kKXdqKCksUWooYSxkKTtkbyB0cnl7UmooKTticmVha31jYXRjaChoKXtTaihhLGgpfXdoaWxlKDEpO3FnKCk7b2ouY3VycmVudD1mO1g9ZTtudWxsIT09WT9kPTA6KFU9bnVsbCxXPTAsZD1WKTtpZigwIT09KHRqJkhpKSlRaihhLDApO2Vsc2UgaWYoMCE9PWQpezI9PT1kJiYoWHw9NjQsYS5oeWRyYXRlJiYoYS5oeWRyYXRlPSExLHFmKGEuY29udGFpbmVySW5mbykpLGM9V2MoYSksMCE9PWMmJihkPVRqKGEsYykpKTtpZigxPT09ZCl0aHJvdyBiPXNqLFFqKGEsMCksSWkoYSxjKSxNaihhLE8oKSksYjthLmZpbmlzaGVkV29yaz1cbmEuY3VycmVudC5hbHRlcm5hdGU7YS5maW5pc2hlZExhbmVzPWM7c3dpdGNoKGQpe2Nhc2UgMDpjYXNlIDE6dGhyb3cgRXJyb3IoeSgzNDUpKTtjYXNlIDI6VWooYSk7YnJlYWs7Y2FzZSAzOklpKGEsYyk7aWYoKGMmNjI5MTQ1NjApPT09YyYmKGQ9amorNTAwLU8oKSwxMDxkKSl7aWYoMCE9PVVjKGEsMCkpYnJlYWs7ZT1hLnN1c3BlbmRlZExhbmVzO2lmKChlJmMpIT09Yyl7SGcoKTthLnBpbmdlZExhbmVzfD1hLnN1c3BlbmRlZExhbmVzJmU7YnJlYWt9YS50aW1lb3V0SGFuZGxlPW9mKFVqLmJpbmQobnVsbCxhKSxkKTticmVha31VaihhKTticmVhaztjYXNlIDQ6SWkoYSxjKTtpZigoYyY0MTg2MTEyKT09PWMpYnJlYWs7ZD1hLmV2ZW50VGltZXM7Zm9yKGU9LTE7MDxjOyl7dmFyIGc9MzEtVmMoYyk7Zj0xPDxnO2c9ZFtnXTtnPmUmJihlPWcpO2MmPX5mfWM9ZTtjPU8oKS1jO2M9KDEyMD5jPzEyMDo0ODA+Yz80ODA6MTA4MD5jPzEwODA6MTkyMD5jPzE5MjA6M0UzPmM/M0UzOjQzMjA+XG5jPzQzMjA6MTk2MCpuaihjLzE5NjApKS1jO2lmKDEwPGMpe2EudGltZW91dEhhbmRsZT1vZihVai5iaW5kKG51bGwsYSksYyk7YnJlYWt9VWooYSk7YnJlYWs7Y2FzZSA1OlVqKGEpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoeSgzMjkpKTt9fU1qKGEsTygpKTtyZXR1cm4gYS5jYWxsYmFja05vZGU9PT1iP05qLmJpbmQobnVsbCxhKTpudWxsfWZ1bmN0aW9uIElpKGEsYil7YiY9fnVqO2ImPX5IaTthLnN1c3BlbmRlZExhbmVzfD1iO2EucGluZ2VkTGFuZXMmPX5iO2ZvcihhPWEuZXhwaXJhdGlvblRpbWVzOzA8Yjspe3ZhciBjPTMxLVZjKGIpLGQ9MTw8YzthW2NdPS0xO2ImPX5kfX1cbmZ1bmN0aW9uIExqKGEpe2lmKDAhPT0oWCY0OCkpdGhyb3cgRXJyb3IoeSgzMjcpKTtPaigpO2lmKGE9PT1VJiYwIT09KGEuZXhwaXJlZExhbmVzJlcpKXt2YXIgYj1XO3ZhciBjPVRqKGEsYik7MCE9PSh0aiZIaSkmJihiPVVjKGEsYiksYz1UaihhLGIpKX1lbHNlIGI9VWMoYSwwKSxjPVRqKGEsYik7MCE9PWEudGFnJiYyPT09YyYmKFh8PTY0LGEuaHlkcmF0ZSYmKGEuaHlkcmF0ZT0hMSxxZihhLmNvbnRhaW5lckluZm8pKSxiPVdjKGEpLDAhPT1iJiYoYz1UaihhLGIpKSk7aWYoMT09PWMpdGhyb3cgYz1zaixRaihhLDApLElpKGEsYiksTWooYSxPKCkpLGM7YS5maW5pc2hlZFdvcms9YS5jdXJyZW50LmFsdGVybmF0ZTthLmZpbmlzaGVkTGFuZXM9YjtVaihhKTtNaihhLE8oKSk7cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBWaigpe2lmKG51bGwhPT1Dail7dmFyIGE9Q2o7Q2o9bnVsbDthLmZvckVhY2goZnVuY3Rpb24oYSl7YS5leHBpcmVkTGFuZXN8PTI0JmEucGVuZGluZ0xhbmVzO01qKGEsTygpKX0pfWlnKCl9ZnVuY3Rpb24gV2ooYSxiKXt2YXIgYz1YO1h8PTE7dHJ5e3JldHVybiBhKGIpfWZpbmFsbHl7WD1jLDA9PT1YJiYod2ooKSxpZygpKX19ZnVuY3Rpb24gWGooYSxiKXt2YXIgYz1YO1gmPS0yO1h8PTg7dHJ5e3JldHVybiBhKGIpfWZpbmFsbHl7WD1jLDA9PT1YJiYod2ooKSxpZygpKX19ZnVuY3Rpb24gbmkoYSxiKXtJKHJqLHFqKTtxanw9Yjt0anw9Yn1mdW5jdGlvbiBLaSgpe3FqPXJqLmN1cnJlbnQ7SChyail9XG5mdW5jdGlvbiBRaihhLGIpe2EuZmluaXNoZWRXb3JrPW51bGw7YS5maW5pc2hlZExhbmVzPTA7dmFyIGM9YS50aW1lb3V0SGFuZGxlOy0xIT09YyYmKGEudGltZW91dEhhbmRsZT0tMSxwZihjKSk7aWYobnVsbCE9PVkpZm9yKGM9WS5yZXR1cm47bnVsbCE9PWM7KXt2YXIgZD1jO3N3aXRjaChkLnRhZyl7Y2FzZSAxOmQ9ZC50eXBlLmNoaWxkQ29udGV4dFR5cGVzO251bGwhPT1kJiZ2b2lkIDAhPT1kJiZHZigpO2JyZWFrO2Nhc2UgMzpmaCgpO0goTik7SChNKTt1aCgpO2JyZWFrO2Nhc2UgNTpoaChkKTticmVhaztjYXNlIDQ6ZmgoKTticmVhaztjYXNlIDEzOkgoUCk7YnJlYWs7Y2FzZSAxOTpIKFApO2JyZWFrO2Nhc2UgMTA6cmcoZCk7YnJlYWs7Y2FzZSAyMzpjYXNlIDI0OktpKCl9Yz1jLnJldHVybn1VPWE7WT1UZyhhLmN1cnJlbnQsbnVsbCk7Vz1xaj10aj1iO1Y9MDtzaj1udWxsO3VqPUhpPURnPTB9XG5mdW5jdGlvbiBTaihhLGIpe2Rve3ZhciBjPVk7dHJ5e3FnKCk7dmguY3VycmVudD1HaDtpZih5aCl7Zm9yKHZhciBkPVIubWVtb2l6ZWRTdGF0ZTtudWxsIT09ZDspe3ZhciBlPWQucXVldWU7bnVsbCE9PWUmJihlLnBlbmRpbmc9bnVsbCk7ZD1kLm5leHR9eWg9ITF9eGg9MDtUPVM9Uj1udWxsO3poPSExO3BqLmN1cnJlbnQ9bnVsbDtpZihudWxsPT09Y3x8bnVsbD09PWMucmV0dXJuKXtWPTE7c2o9YjtZPW51bGw7YnJlYWt9YTp7dmFyIGY9YSxnPWMucmV0dXJuLGg9YyxrPWI7Yj1XO2guZmxhZ3N8PTIwNDg7aC5maXJzdEVmZmVjdD1oLmxhc3RFZmZlY3Q9bnVsbDtpZihudWxsIT09ayYmXCJvYmplY3RcIj09PXR5cGVvZiBrJiZcImZ1bmN0aW9uXCI9PT10eXBlb2Ygay50aGVuKXt2YXIgbD1rO2lmKDA9PT0oaC5tb2RlJjIpKXt2YXIgbj1oLmFsdGVybmF0ZTtuPyhoLnVwZGF0ZVF1ZXVlPW4udXBkYXRlUXVldWUsaC5tZW1vaXplZFN0YXRlPW4ubWVtb2l6ZWRTdGF0ZSxoLmxhbmVzPW4ubGFuZXMpOlxuKGgudXBkYXRlUXVldWU9bnVsbCxoLm1lbW9pemVkU3RhdGU9bnVsbCl9dmFyIEE9MCE9PShQLmN1cnJlbnQmMSkscD1nO2Rve3ZhciBDO2lmKEM9MTM9PT1wLnRhZyl7dmFyIHg9cC5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT14KUM9bnVsbCE9PXguZGVoeWRyYXRlZD8hMDohMTtlbHNle3ZhciB3PXAubWVtb2l6ZWRQcm9wcztDPXZvaWQgMD09PXcuZmFsbGJhY2s/ITE6ITAhPT13LnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrPyEwOkE/ITE6ITB9fWlmKEMpe3ZhciB6PXAudXBkYXRlUXVldWU7aWYobnVsbD09PXope3ZhciB1PW5ldyBTZXQ7dS5hZGQobCk7cC51cGRhdGVRdWV1ZT11fWVsc2Ugei5hZGQobCk7aWYoMD09PShwLm1vZGUmMikpe3AuZmxhZ3N8PTY0O2guZmxhZ3N8PTE2Mzg0O2guZmxhZ3MmPS0yOTgxO2lmKDE9PT1oLnRhZylpZihudWxsPT09aC5hbHRlcm5hdGUpaC50YWc9MTc7ZWxzZXt2YXIgdD16ZygtMSwxKTt0LnRhZz0yO0FnKGgsdCl9aC5sYW5lc3w9MTticmVhayBhfWs9XG52b2lkIDA7aD1iO3ZhciBxPWYucGluZ0NhY2hlO251bGw9PT1xPyhxPWYucGluZ0NhY2hlPW5ldyBPaSxrPW5ldyBTZXQscS5zZXQobCxrKSk6KGs9cS5nZXQobCksdm9pZCAwPT09ayYmKGs9bmV3IFNldCxxLnNldChsLGspKSk7aWYoIWsuaGFzKGgpKXtrLmFkZChoKTt2YXIgdj1Zai5iaW5kKG51bGwsZixsLGgpO2wudGhlbih2LHYpfXAuZmxhZ3N8PTQwOTY7cC5sYW5lcz1iO2JyZWFrIGF9cD1wLnJldHVybn13aGlsZShudWxsIT09cCk7az1FcnJvcigoUmEoaC50eXBlKXx8XCJBIFJlYWN0IGNvbXBvbmVudFwiKStcIiBzdXNwZW5kZWQgd2hpbGUgcmVuZGVyaW5nLCBidXQgbm8gZmFsbGJhY2sgVUkgd2FzIHNwZWNpZmllZC5cXG5cXG5BZGQgYSA8U3VzcGVuc2UgZmFsbGJhY2s9Li4uPiBjb21wb25lbnQgaGlnaGVyIGluIHRoZSB0cmVlIHRvIHByb3ZpZGUgYSBsb2FkaW5nIGluZGljYXRvciBvciBwbGFjZWhvbGRlciB0byBkaXNwbGF5LlwiKX01IT09ViYmKFY9Mik7az1NaShrLGgpO3A9XG5nO2Rve3N3aXRjaChwLnRhZyl7Y2FzZSAzOmY9aztwLmZsYWdzfD00MDk2O2ImPS1iO3AubGFuZXN8PWI7dmFyIEo9UGkocCxmLGIpO0JnKHAsSik7YnJlYWsgYTtjYXNlIDE6Zj1rO3ZhciBLPXAudHlwZSxRPXAuc3RhdGVOb2RlO2lmKDA9PT0ocC5mbGFncyY2NCkmJihcImZ1bmN0aW9uXCI9PT10eXBlb2YgSy5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3J8fG51bGwhPT1RJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgUS5jb21wb25lbnREaWRDYXRjaCYmKG51bGw9PT1UaXx8IVRpLmhhcyhRKSkpKXtwLmZsYWdzfD00MDk2O2ImPS1iO3AubGFuZXN8PWI7dmFyIEw9U2kocCxmLGIpO0JnKHAsTCk7YnJlYWsgYX19cD1wLnJldHVybn13aGlsZShudWxsIT09cCl9WmooYyl9Y2F0Y2godmEpe2I9dmE7WT09PWMmJm51bGwhPT1jJiYoWT1jPWMucmV0dXJuKTtjb250aW51ZX1icmVha313aGlsZSgxKX1cbmZ1bmN0aW9uIFBqKCl7dmFyIGE9b2ouY3VycmVudDtvai5jdXJyZW50PUdoO3JldHVybiBudWxsPT09YT9HaDphfWZ1bmN0aW9uIFRqKGEsYil7dmFyIGM9WDtYfD0xNjt2YXIgZD1QaigpO1U9PT1hJiZXPT09Ynx8UWooYSxiKTtkbyB0cnl7YWsoKTticmVha31jYXRjaChlKXtTaihhLGUpfXdoaWxlKDEpO3FnKCk7WD1jO29qLmN1cnJlbnQ9ZDtpZihudWxsIT09WSl0aHJvdyBFcnJvcih5KDI2MSkpO1U9bnVsbDtXPTA7cmV0dXJuIFZ9ZnVuY3Rpb24gYWsoKXtmb3IoO251bGwhPT1ZOyliayhZKX1mdW5jdGlvbiBSaigpe2Zvcig7bnVsbCE9PVkmJiFRZigpOyliayhZKX1mdW5jdGlvbiBiayhhKXt2YXIgYj1jayhhLmFsdGVybmF0ZSxhLHFqKTthLm1lbW9pemVkUHJvcHM9YS5wZW5kaW5nUHJvcHM7bnVsbD09PWI/WmooYSk6WT1iO3BqLmN1cnJlbnQ9bnVsbH1cbmZ1bmN0aW9uIFpqKGEpe3ZhciBiPWE7ZG97dmFyIGM9Yi5hbHRlcm5hdGU7YT1iLnJldHVybjtpZigwPT09KGIuZmxhZ3MmMjA0OCkpe2M9R2koYyxiLHFqKTtpZihudWxsIT09Yyl7WT1jO3JldHVybn1jPWI7aWYoMjQhPT1jLnRhZyYmMjMhPT1jLnRhZ3x8bnVsbD09PWMubWVtb2l6ZWRTdGF0ZXx8MCE9PShxaiYxMDczNzQxODI0KXx8MD09PShjLm1vZGUmNCkpe2Zvcih2YXIgZD0wLGU9Yy5jaGlsZDtudWxsIT09ZTspZHw9ZS5sYW5lc3xlLmNoaWxkTGFuZXMsZT1lLnNpYmxpbmc7Yy5jaGlsZExhbmVzPWR9bnVsbCE9PWEmJjA9PT0oYS5mbGFncyYyMDQ4KSYmKG51bGw9PT1hLmZpcnN0RWZmZWN0JiYoYS5maXJzdEVmZmVjdD1iLmZpcnN0RWZmZWN0KSxudWxsIT09Yi5sYXN0RWZmZWN0JiYobnVsbCE9PWEubGFzdEVmZmVjdCYmKGEubGFzdEVmZmVjdC5uZXh0RWZmZWN0PWIuZmlyc3RFZmZlY3QpLGEubGFzdEVmZmVjdD1iLmxhc3RFZmZlY3QpLDE8Yi5mbGFncyYmKG51bGwhPT1cbmEubGFzdEVmZmVjdD9hLmxhc3RFZmZlY3QubmV4dEVmZmVjdD1iOmEuZmlyc3RFZmZlY3Q9YixhLmxhc3RFZmZlY3Q9YikpfWVsc2V7Yz1MaShiKTtpZihudWxsIT09Yyl7Yy5mbGFncyY9MjA0NztZPWM7cmV0dXJufW51bGwhPT1hJiYoYS5maXJzdEVmZmVjdD1hLmxhc3RFZmZlY3Q9bnVsbCxhLmZsYWdzfD0yMDQ4KX1iPWIuc2libGluZztpZihudWxsIT09Yil7WT1iO3JldHVybn1ZPWI9YX13aGlsZShudWxsIT09Yik7MD09PVYmJihWPTUpfWZ1bmN0aW9uIFVqKGEpe3ZhciBiPWVnKCk7Z2coOTksZGsuYmluZChudWxsLGEsYikpO3JldHVybiBudWxsfVxuZnVuY3Rpb24gZGsoYSxiKXtkbyBPaigpO3doaWxlKG51bGwhPT15aik7aWYoMCE9PShYJjQ4KSl0aHJvdyBFcnJvcih5KDMyNykpO3ZhciBjPWEuZmluaXNoZWRXb3JrO2lmKG51bGw9PT1jKXJldHVybiBudWxsO2EuZmluaXNoZWRXb3JrPW51bGw7YS5maW5pc2hlZExhbmVzPTA7aWYoYz09PWEuY3VycmVudCl0aHJvdyBFcnJvcih5KDE3NykpO2EuY2FsbGJhY2tOb2RlPW51bGw7dmFyIGQ9Yy5sYW5lc3xjLmNoaWxkTGFuZXMsZT1kLGY9YS5wZW5kaW5nTGFuZXMmfmU7YS5wZW5kaW5nTGFuZXM9ZTthLnN1c3BlbmRlZExhbmVzPTA7YS5waW5nZWRMYW5lcz0wO2EuZXhwaXJlZExhbmVzJj1lO2EubXV0YWJsZVJlYWRMYW5lcyY9ZTthLmVudGFuZ2xlZExhbmVzJj1lO2U9YS5lbnRhbmdsZW1lbnRzO2Zvcih2YXIgZz1hLmV2ZW50VGltZXMsaD1hLmV4cGlyYXRpb25UaW1lczswPGY7KXt2YXIgaz0zMS1WYyhmKSxsPTE8PGs7ZVtrXT0wO2dba109LTE7aFtrXT0tMTtmJj1+bH1udWxsIT09XG5DaiYmMD09PShkJjI0KSYmQ2ouaGFzKGEpJiZDai5kZWxldGUoYSk7YT09PVUmJihZPVU9bnVsbCxXPTApOzE8Yy5mbGFncz9udWxsIT09Yy5sYXN0RWZmZWN0PyhjLmxhc3RFZmZlY3QubmV4dEVmZmVjdD1jLGQ9Yy5maXJzdEVmZmVjdCk6ZD1jOmQ9Yy5maXJzdEVmZmVjdDtpZihudWxsIT09ZCl7ZT1YO1h8PTMyO3BqLmN1cnJlbnQ9bnVsbDtrZj1mZDtnPU5lKCk7aWYoT2UoZykpe2lmKFwic2VsZWN0aW9uU3RhcnRcImluIGcpaD17c3RhcnQ6Zy5zZWxlY3Rpb25TdGFydCxlbmQ6Zy5zZWxlY3Rpb25FbmR9O2Vsc2UgYTppZihoPShoPWcub3duZXJEb2N1bWVudCkmJmguZGVmYXVsdFZpZXd8fHdpbmRvdywobD1oLmdldFNlbGVjdGlvbiYmaC5nZXRTZWxlY3Rpb24oKSkmJjAhPT1sLnJhbmdlQ291bnQpe2g9bC5hbmNob3JOb2RlO2Y9bC5hbmNob3JPZmZzZXQ7az1sLmZvY3VzTm9kZTtsPWwuZm9jdXNPZmZzZXQ7dHJ5e2gubm9kZVR5cGUsay5ub2RlVHlwZX1jYXRjaCh2YSl7aD1udWxsO1xuYnJlYWsgYX12YXIgbj0wLEE9LTEscD0tMSxDPTAseD0wLHc9Zyx6PW51bGw7Yjpmb3IoOzspe2Zvcih2YXIgdTs7KXt3IT09aHx8MCE9PWYmJjMhPT13Lm5vZGVUeXBlfHwoQT1uK2YpO3chPT1rfHwwIT09bCYmMyE9PXcubm9kZVR5cGV8fChwPW4rbCk7Mz09PXcubm9kZVR5cGUmJihuKz13Lm5vZGVWYWx1ZS5sZW5ndGgpO2lmKG51bGw9PT0odT13LmZpcnN0Q2hpbGQpKWJyZWFrO3o9dzt3PXV9Zm9yKDs7KXtpZih3PT09ZylicmVhayBiO3o9PT1oJiYrK0M9PT1mJiYoQT1uKTt6PT09ayYmKyt4PT09bCYmKHA9bik7aWYobnVsbCE9PSh1PXcubmV4dFNpYmxpbmcpKWJyZWFrO3c9ejt6PXcucGFyZW50Tm9kZX13PXV9aD0tMT09PUF8fC0xPT09cD9udWxsOntzdGFydDpBLGVuZDpwfX1lbHNlIGg9bnVsbDtoPWh8fHtzdGFydDowLGVuZDowfX1lbHNlIGg9bnVsbDtsZj17Zm9jdXNlZEVsZW06ZyxzZWxlY3Rpb25SYW5nZTpofTtmZD0hMTtJaj1udWxsO0pqPSExO1o9ZDtkbyB0cnl7ZWsoKX1jYXRjaCh2YSl7aWYobnVsbD09PVxuWil0aHJvdyBFcnJvcih5KDMzMCkpO1dpKFosdmEpO1o9Wi5uZXh0RWZmZWN0fXdoaWxlKG51bGwhPT1aKTtJaj1udWxsO1o9ZDtkbyB0cnl7Zm9yKGc9YTtudWxsIT09Wjspe3ZhciB0PVouZmxhZ3M7dCYxNiYmcGIoWi5zdGF0ZU5vZGUsXCJcIik7aWYodCYxMjgpe3ZhciBxPVouYWx0ZXJuYXRlO2lmKG51bGwhPT1xKXt2YXIgdj1xLnJlZjtudWxsIT09diYmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiB2P3YobnVsbCk6di5jdXJyZW50PW51bGwpfX1zd2l0Y2godCYxMDM4KXtjYXNlIDI6ZmooWik7Wi5mbGFncyY9LTM7YnJlYWs7Y2FzZSA2OmZqKFopO1ouZmxhZ3MmPS0zO2lqKFouYWx0ZXJuYXRlLFopO2JyZWFrO2Nhc2UgMTAyNDpaLmZsYWdzJj0tMTAyNTticmVhaztjYXNlIDEwMjg6Wi5mbGFncyY9LTEwMjU7aWooWi5hbHRlcm5hdGUsWik7YnJlYWs7Y2FzZSA0OmlqKFouYWx0ZXJuYXRlLFopO2JyZWFrO2Nhc2UgODpoPVo7Y2ooZyxoKTt2YXIgSj1oLmFsdGVybmF0ZTtkaihoKTtudWxsIT09XG5KJiZkaihKKX1aPVoubmV4dEVmZmVjdH19Y2F0Y2godmEpe2lmKG51bGw9PT1aKXRocm93IEVycm9yKHkoMzMwKSk7V2koWix2YSk7Wj1aLm5leHRFZmZlY3R9d2hpbGUobnVsbCE9PVopO3Y9bGY7cT1OZSgpO3Q9di5mb2N1c2VkRWxlbTtnPXYuc2VsZWN0aW9uUmFuZ2U7aWYocSE9PXQmJnQmJnQub3duZXJEb2N1bWVudCYmTWUodC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCx0KSl7bnVsbCE9PWcmJk9lKHQpJiYocT1nLnN0YXJ0LHY9Zy5lbmQsdm9pZCAwPT09diYmKHY9cSksXCJzZWxlY3Rpb25TdGFydFwiaW4gdD8odC5zZWxlY3Rpb25TdGFydD1xLHQuc2VsZWN0aW9uRW5kPU1hdGgubWluKHYsdC52YWx1ZS5sZW5ndGgpKToodj0ocT10Lm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KSYmcS5kZWZhdWx0Vmlld3x8d2luZG93LHYuZ2V0U2VsZWN0aW9uJiYodj12LmdldFNlbGVjdGlvbigpLGg9dC50ZXh0Q29udGVudC5sZW5ndGgsSj1NYXRoLm1pbihnLnN0YXJ0LGgpLGc9dm9pZCAwPT09XG5nLmVuZD9KOk1hdGgubWluKGcuZW5kLGgpLCF2LmV4dGVuZCYmSj5nJiYoaD1nLGc9SixKPWgpLGg9TGUodCxKKSxmPUxlKHQsZyksaCYmZiYmKDEhPT12LnJhbmdlQ291bnR8fHYuYW5jaG9yTm9kZSE9PWgubm9kZXx8di5hbmNob3JPZmZzZXQhPT1oLm9mZnNldHx8di5mb2N1c05vZGUhPT1mLm5vZGV8fHYuZm9jdXNPZmZzZXQhPT1mLm9mZnNldCkmJihxPXEuY3JlYXRlUmFuZ2UoKSxxLnNldFN0YXJ0KGgubm9kZSxoLm9mZnNldCksdi5yZW1vdmVBbGxSYW5nZXMoKSxKPmc/KHYuYWRkUmFuZ2UocSksdi5leHRlbmQoZi5ub2RlLGYub2Zmc2V0KSk6KHEuc2V0RW5kKGYubm9kZSxmLm9mZnNldCksdi5hZGRSYW5nZShxKSkpKSkpO3E9W107Zm9yKHY9dDt2PXYucGFyZW50Tm9kZTspMT09PXYubm9kZVR5cGUmJnEucHVzaCh7ZWxlbWVudDp2LGxlZnQ6di5zY3JvbGxMZWZ0LHRvcDp2LnNjcm9sbFRvcH0pO1wiZnVuY3Rpb25cIj09PXR5cGVvZiB0LmZvY3VzJiZ0LmZvY3VzKCk7Zm9yKHQ9XG4wO3Q8cS5sZW5ndGg7dCsrKXY9cVt0XSx2LmVsZW1lbnQuc2Nyb2xsTGVmdD12LmxlZnQsdi5lbGVtZW50LnNjcm9sbFRvcD12LnRvcH1mZD0hIWtmO2xmPWtmPW51bGw7YS5jdXJyZW50PWM7Wj1kO2RvIHRyeXtmb3IodD1hO251bGwhPT1aOyl7dmFyIEs9Wi5mbGFncztLJjM2JiZZaSh0LFouYWx0ZXJuYXRlLFopO2lmKEsmMTI4KXtxPXZvaWQgMDt2YXIgUT1aLnJlZjtpZihudWxsIT09USl7dmFyIEw9Wi5zdGF0ZU5vZGU7c3dpdGNoKFoudGFnKXtjYXNlIDU6cT1MO2JyZWFrO2RlZmF1bHQ6cT1MfVwiZnVuY3Rpb25cIj09PXR5cGVvZiBRP1EocSk6US5jdXJyZW50PXF9fVo9Wi5uZXh0RWZmZWN0fX1jYXRjaCh2YSl7aWYobnVsbD09PVopdGhyb3cgRXJyb3IoeSgzMzApKTtXaShaLHZhKTtaPVoubmV4dEVmZmVjdH13aGlsZShudWxsIT09Wik7Wj1udWxsOyRmKCk7WD1lfWVsc2UgYS5jdXJyZW50PWM7aWYoeGopeGo9ITEseWo9YSx6aj1iO2Vsc2UgZm9yKFo9ZDtudWxsIT09WjspYj1cbloubmV4dEVmZmVjdCxaLm5leHRFZmZlY3Q9bnVsbCxaLmZsYWdzJjgmJihLPVosSy5zaWJsaW5nPW51bGwsSy5zdGF0ZU5vZGU9bnVsbCksWj1iO2Q9YS5wZW5kaW5nTGFuZXM7MD09PWQmJihUaT1udWxsKTsxPT09ZD9hPT09RWo/RGorKzooRGo9MCxFaj1hKTpEaj0wO2M9Yy5zdGF0ZU5vZGU7aWYoTWYmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBNZi5vbkNvbW1pdEZpYmVyUm9vdCl0cnl7TWYub25Db21taXRGaWJlclJvb3QoTGYsYyx2b2lkIDAsNjQ9PT0oYy5jdXJyZW50LmZsYWdzJjY0KSl9Y2F0Y2godmEpe31NaihhLE8oKSk7aWYoUWkpdGhyb3cgUWk9ITEsYT1SaSxSaT1udWxsLGE7aWYoMCE9PShYJjgpKXJldHVybiBudWxsO2lnKCk7cmV0dXJuIG51bGx9XG5mdW5jdGlvbiBlaygpe2Zvcig7bnVsbCE9PVo7KXt2YXIgYT1aLmFsdGVybmF0ZTtKanx8bnVsbD09PUlqfHwoMCE9PShaLmZsYWdzJjgpP2RjKFosSWopJiYoSmo9ITApOjEzPT09Wi50YWcmJm1qKGEsWikmJmRjKFosSWopJiYoSmo9ITApKTt2YXIgYj1aLmZsYWdzOzAhPT0oYiYyNTYpJiZYaShhLFopOzA9PT0oYiY1MTIpfHx4anx8KHhqPSEwLGhnKDk3LGZ1bmN0aW9uKCl7T2ooKTtyZXR1cm4gbnVsbH0pKTtaPVoubmV4dEVmZmVjdH19ZnVuY3Rpb24gT2ooKXtpZig5MCE9PXpqKXt2YXIgYT05Nzx6aj85Nzp6ajt6aj05MDtyZXR1cm4gZ2coYSxmayl9cmV0dXJuITF9ZnVuY3Rpb24gJGkoYSxiKXtBai5wdXNoKGIsYSk7eGp8fCh4aj0hMCxoZyg5NyxmdW5jdGlvbigpe09qKCk7cmV0dXJuIG51bGx9KSl9ZnVuY3Rpb24gWmkoYSxiKXtCai5wdXNoKGIsYSk7eGp8fCh4aj0hMCxoZyg5NyxmdW5jdGlvbigpe09qKCk7cmV0dXJuIG51bGx9KSl9XG5mdW5jdGlvbiBmaygpe2lmKG51bGw9PT15ailyZXR1cm4hMTt2YXIgYT15ajt5aj1udWxsO2lmKDAhPT0oWCY0OCkpdGhyb3cgRXJyb3IoeSgzMzEpKTt2YXIgYj1YO1h8PTMyO3ZhciBjPUJqO0JqPVtdO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCs9Mil7dmFyIGU9Y1tkXSxmPWNbZCsxXSxnPWUuZGVzdHJveTtlLmRlc3Ryb3k9dm9pZCAwO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnKXRyeXtnKCl9Y2F0Y2goayl7aWYobnVsbD09PWYpdGhyb3cgRXJyb3IoeSgzMzApKTtXaShmLGspfX1jPUFqO0FqPVtdO2ZvcihkPTA7ZDxjLmxlbmd0aDtkKz0yKXtlPWNbZF07Zj1jW2QrMV07dHJ5e3ZhciBoPWUuY3JlYXRlO2UuZGVzdHJveT1oKCl9Y2F0Y2goayl7aWYobnVsbD09PWYpdGhyb3cgRXJyb3IoeSgzMzApKTtXaShmLGspfX1mb3IoaD1hLmN1cnJlbnQuZmlyc3RFZmZlY3Q7bnVsbCE9PWg7KWE9aC5uZXh0RWZmZWN0LGgubmV4dEVmZmVjdD1udWxsLGguZmxhZ3MmOCYmKGguc2libGluZz1cbm51bGwsaC5zdGF0ZU5vZGU9bnVsbCksaD1hO1g9YjtpZygpO3JldHVybiEwfWZ1bmN0aW9uIGdrKGEsYixjKXtiPU1pKGMsYik7Yj1QaShhLGIsMSk7QWcoYSxiKTtiPUhnKCk7YT1LaihhLDEpO251bGwhPT1hJiYoJGMoYSwxLGIpLE1qKGEsYikpfVxuZnVuY3Rpb24gV2koYSxiKXtpZigzPT09YS50YWcpZ2soYSxhLGIpO2Vsc2UgZm9yKHZhciBjPWEucmV0dXJuO251bGwhPT1jOyl7aWYoMz09PWMudGFnKXtnayhjLGEsYik7YnJlYWt9ZWxzZSBpZigxPT09Yy50YWcpe3ZhciBkPWMuc3RhdGVOb2RlO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBjLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yfHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5jb21wb25lbnREaWRDYXRjaCYmKG51bGw9PT1UaXx8IVRpLmhhcyhkKSkpe2E9TWkoYixhKTt2YXIgZT1TaShjLGEsMSk7QWcoYyxlKTtlPUhnKCk7Yz1LaihjLDEpO2lmKG51bGwhPT1jKSRjKGMsMSxlKSxNaihjLGUpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09VGl8fCFUaS5oYXMoZCkpKXRyeXtkLmNvbXBvbmVudERpZENhdGNoKGIsYSl9Y2F0Y2goZil7fWJyZWFrfX1jPWMucmV0dXJufX1cbmZ1bmN0aW9uIFlqKGEsYixjKXt2YXIgZD1hLnBpbmdDYWNoZTtudWxsIT09ZCYmZC5kZWxldGUoYik7Yj1IZygpO2EucGluZ2VkTGFuZXN8PWEuc3VzcGVuZGVkTGFuZXMmYztVPT09YSYmKFcmYyk9PT1jJiYoND09PVZ8fDM9PT1WJiYoVyY2MjkxNDU2MCk9PT1XJiY1MDA+TygpLWpqP1FqKGEsMCk6dWp8PWMpO01qKGEsYil9ZnVuY3Rpb24gbGooYSxiKXt2YXIgYz1hLnN0YXRlTm9kZTtudWxsIT09YyYmYy5kZWxldGUoYik7Yj0wOzA9PT1iJiYoYj1hLm1vZGUsMD09PShiJjIpP2I9MTowPT09KGImNCk/Yj05OT09PWVnKCk/MToyOigwPT09R2omJihHaj10aiksYj1ZYyg2MjkxNDU2MCZ+R2opLDA9PT1iJiYoYj00MTk0MzA0KSkpO2M9SGcoKTthPUtqKGEsYik7bnVsbCE9PWEmJigkYyhhLGIsYyksTWooYSxjKSl9dmFyIGNrO1xuY2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWIubGFuZXM7aWYobnVsbCE9PWEpaWYoYS5tZW1vaXplZFByb3BzIT09Yi5wZW5kaW5nUHJvcHN8fE4uY3VycmVudCl1Zz0hMDtlbHNlIGlmKDAhPT0oYyZkKSl1Zz0wIT09KGEuZmxhZ3MmMTYzODQpPyEwOiExO2Vsc2V7dWc9ITE7c3dpdGNoKGIudGFnKXtjYXNlIDM6cmkoYik7c2goKTticmVhaztjYXNlIDU6Z2goYik7YnJlYWs7Y2FzZSAxOkZmKGIudHlwZSkmJkpmKGIpO2JyZWFrO2Nhc2UgNDplaChiLGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6ZD1iLm1lbW9pemVkUHJvcHMudmFsdWU7dmFyIGU9Yi50eXBlLl9jb250ZXh0O0kobWcsZS5fY3VycmVudFZhbHVlKTtlLl9jdXJyZW50VmFsdWU9ZDticmVhaztjYXNlIDEzOmlmKG51bGwhPT1iLm1lbW9pemVkU3RhdGUpe2lmKDAhPT0oYyZiLmNoaWxkLmNoaWxkTGFuZXMpKXJldHVybiB0aShhLGIsYyk7SShQLFAuY3VycmVudCYxKTtiPWhpKGEsYixjKTtyZXR1cm4gbnVsbCE9PVxuYj9iLnNpYmxpbmc6bnVsbH1JKFAsUC5jdXJyZW50JjEpO2JyZWFrO2Nhc2UgMTk6ZD0wIT09KGMmYi5jaGlsZExhbmVzKTtpZigwIT09KGEuZmxhZ3MmNjQpKXtpZihkKXJldHVybiBBaShhLGIsYyk7Yi5mbGFnc3w9NjR9ZT1iLm1lbW9pemVkU3RhdGU7bnVsbCE9PWUmJihlLnJlbmRlcmluZz1udWxsLGUudGFpbD1udWxsLGUubGFzdEVmZmVjdD1udWxsKTtJKFAsUC5jdXJyZW50KTtpZihkKWJyZWFrO2Vsc2UgcmV0dXJuIG51bGw7Y2FzZSAyMzpjYXNlIDI0OnJldHVybiBiLmxhbmVzPTAsbWkoYSxiLGMpfXJldHVybiBoaShhLGIsYyl9ZWxzZSB1Zz0hMTtiLmxhbmVzPTA7c3dpdGNoKGIudGFnKXtjYXNlIDI6ZD1iLnR5cGU7bnVsbCE9PWEmJihhLmFsdGVybmF0ZT1udWxsLGIuYWx0ZXJuYXRlPW51bGwsYi5mbGFnc3w9Mik7YT1iLnBlbmRpbmdQcm9wcztlPUVmKGIsTS5jdXJyZW50KTt0ZyhiLGMpO2U9Q2gobnVsbCxiLGQsYSxlLGMpO2IuZmxhZ3N8PTE7aWYoXCJvYmplY3RcIj09PVxudHlwZW9mIGUmJm51bGwhPT1lJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5yZW5kZXImJnZvaWQgMD09PWUuJCR0eXBlb2Ype2IudGFnPTE7Yi5tZW1vaXplZFN0YXRlPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO2lmKEZmKGQpKXt2YXIgZj0hMDtKZihiKX1lbHNlIGY9ITE7Yi5tZW1vaXplZFN0YXRlPW51bGwhPT1lLnN0YXRlJiZ2b2lkIDAhPT1lLnN0YXRlP2Uuc3RhdGU6bnVsbDt4ZyhiKTt2YXIgZz1kLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcImZ1bmN0aW9uXCI9PT10eXBlb2YgZyYmR2coYixkLGcsYSk7ZS51cGRhdGVyPUtnO2Iuc3RhdGVOb2RlPWU7ZS5fcmVhY3RJbnRlcm5hbHM9YjtPZyhiLGQsYSxjKTtiPXFpKG51bGwsYixkLCEwLGYsYyl9ZWxzZSBiLnRhZz0wLGZpKG51bGwsYixlLGMpLGI9Yi5jaGlsZDtyZXR1cm4gYjtjYXNlIDE2OmU9Yi5lbGVtZW50VHlwZTthOntudWxsIT09YSYmKGEuYWx0ZXJuYXRlPW51bGwsYi5hbHRlcm5hdGU9bnVsbCxiLmZsYWdzfD0yKTtcbmE9Yi5wZW5kaW5nUHJvcHM7Zj1lLl9pbml0O2U9ZihlLl9wYXlsb2FkKTtiLnR5cGU9ZTtmPWIudGFnPWhrKGUpO2E9bGcoZSxhKTtzd2l0Y2goZil7Y2FzZSAwOmI9bGkobnVsbCxiLGUsYSxjKTticmVhayBhO2Nhc2UgMTpiPXBpKG51bGwsYixlLGEsYyk7YnJlYWsgYTtjYXNlIDExOmI9Z2kobnVsbCxiLGUsYSxjKTticmVhayBhO2Nhc2UgMTQ6Yj1paShudWxsLGIsZSxsZyhlLnR5cGUsYSksZCxjKTticmVhayBhfXRocm93IEVycm9yKHkoMzA2LGUsXCJcIikpO31yZXR1cm4gYjtjYXNlIDA6cmV0dXJuIGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZT1iLmVsZW1lbnRUeXBlPT09ZD9lOmxnKGQsZSksbGkoYSxiLGQsZSxjKTtjYXNlIDE6cmV0dXJuIGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZT1iLmVsZW1lbnRUeXBlPT09ZD9lOmxnKGQsZSkscGkoYSxiLGQsZSxjKTtjYXNlIDM6cmkoYik7ZD1iLnVwZGF0ZVF1ZXVlO2lmKG51bGw9PT1hfHxudWxsPT09ZCl0aHJvdyBFcnJvcih5KDI4MikpO1xuZD1iLnBlbmRpbmdQcm9wcztlPWIubWVtb2l6ZWRTdGF0ZTtlPW51bGwhPT1lP2UuZWxlbWVudDpudWxsO3lnKGEsYik7Q2coYixkLG51bGwsYyk7ZD1iLm1lbW9pemVkU3RhdGUuZWxlbWVudDtpZihkPT09ZSlzaCgpLGI9aGkoYSxiLGMpO2Vsc2V7ZT1iLnN0YXRlTm9kZTtpZihmPWUuaHlkcmF0ZSlraD1yZihiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLmZpcnN0Q2hpbGQpLGpoPWIsZj1saD0hMDtpZihmKXthPWUubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YTtpZihudWxsIT1hKWZvcihlPTA7ZTxhLmxlbmd0aDtlKz0yKWY9YVtlXSxmLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PWFbZSsxXSx0aC5wdXNoKGYpO2M9WmcoYixudWxsLGQsYyk7Zm9yKGIuY2hpbGQ9YztjOyljLmZsYWdzPWMuZmxhZ3MmLTN8MTAyNCxjPWMuc2libGluZ31lbHNlIGZpKGEsYixkLGMpLHNoKCk7Yj1iLmNoaWxkfXJldHVybiBiO2Nhc2UgNTpyZXR1cm4gZ2goYiksbnVsbD09PWEmJlxucGgoYiksZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxmPW51bGwhPT1hP2EubWVtb2l6ZWRQcm9wczpudWxsLGc9ZS5jaGlsZHJlbixuZihkLGUpP2c9bnVsbDpudWxsIT09ZiYmbmYoZCxmKSYmKGIuZmxhZ3N8PTE2KSxvaShhLGIpLGZpKGEsYixnLGMpLGIuY2hpbGQ7Y2FzZSA2OnJldHVybiBudWxsPT09YSYmcGgoYiksbnVsbDtjYXNlIDEzOnJldHVybiB0aShhLGIsYyk7Y2FzZSA0OnJldHVybiBlaChiLGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLGQ9Yi5wZW5kaW5nUHJvcHMsbnVsbD09PWE/Yi5jaGlsZD1ZZyhiLG51bGwsZCxjKTpmaShhLGIsZCxjKSxiLmNoaWxkO2Nhc2UgMTE6cmV0dXJuIGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZT1iLmVsZW1lbnRUeXBlPT09ZD9lOmxnKGQsZSksZ2koYSxiLGQsZSxjKTtjYXNlIDc6cmV0dXJuIGZpKGEsYixiLnBlbmRpbmdQcm9wcyxjKSxiLmNoaWxkO2Nhc2UgODpyZXR1cm4gZmkoYSxiLGIucGVuZGluZ1Byb3BzLmNoaWxkcmVuLFxuYyksYi5jaGlsZDtjYXNlIDEyOnJldHVybiBmaShhLGIsYi5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sYyksYi5jaGlsZDtjYXNlIDEwOmE6e2Q9Yi50eXBlLl9jb250ZXh0O2U9Yi5wZW5kaW5nUHJvcHM7Zz1iLm1lbW9pemVkUHJvcHM7Zj1lLnZhbHVlO3ZhciBoPWIudHlwZS5fY29udGV4dDtJKG1nLGguX2N1cnJlbnRWYWx1ZSk7aC5fY3VycmVudFZhbHVlPWY7aWYobnVsbCE9PWcpaWYoaD1nLnZhbHVlLGY9SGUoaCxmKT8wOihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5fY2FsY3VsYXRlQ2hhbmdlZEJpdHM/ZC5fY2FsY3VsYXRlQ2hhbmdlZEJpdHMoaCxmKToxMDczNzQxODIzKXwwLDA9PT1mKXtpZihnLmNoaWxkcmVuPT09ZS5jaGlsZHJlbiYmIU4uY3VycmVudCl7Yj1oaShhLGIsYyk7YnJlYWsgYX19ZWxzZSBmb3IoaD1iLmNoaWxkLG51bGwhPT1oJiYoaC5yZXR1cm49Yik7bnVsbCE9PWg7KXt2YXIgaz1oLmRlcGVuZGVuY2llcztpZihudWxsIT09ayl7Zz1oLmNoaWxkO2Zvcih2YXIgbD1cbmsuZmlyc3RDb250ZXh0O251bGwhPT1sOyl7aWYobC5jb250ZXh0PT09ZCYmMCE9PShsLm9ic2VydmVkQml0cyZmKSl7MT09PWgudGFnJiYobD16ZygtMSxjJi1jKSxsLnRhZz0yLEFnKGgsbCkpO2gubGFuZXN8PWM7bD1oLmFsdGVybmF0ZTtudWxsIT09bCYmKGwubGFuZXN8PWMpO3NnKGgucmV0dXJuLGMpO2subGFuZXN8PWM7YnJlYWt9bD1sLm5leHR9fWVsc2UgZz0xMD09PWgudGFnP2gudHlwZT09PWIudHlwZT9udWxsOmguY2hpbGQ6aC5jaGlsZDtpZihudWxsIT09ZylnLnJldHVybj1oO2Vsc2UgZm9yKGc9aDtudWxsIT09Zzspe2lmKGc9PT1iKXtnPW51bGw7YnJlYWt9aD1nLnNpYmxpbmc7aWYobnVsbCE9PWgpe2gucmV0dXJuPWcucmV0dXJuO2c9aDticmVha31nPWcucmV0dXJufWg9Z31maShhLGIsZS5jaGlsZHJlbixjKTtiPWIuY2hpbGR9cmV0dXJuIGI7Y2FzZSA5OnJldHVybiBlPWIudHlwZSxmPWIucGVuZGluZ1Byb3BzLGQ9Zi5jaGlsZHJlbix0ZyhiLGMpLGU9dmcoZSxcbmYudW5zdGFibGVfb2JzZXJ2ZWRCaXRzKSxkPWQoZSksYi5mbGFnc3w9MSxmaShhLGIsZCxjKSxiLmNoaWxkO2Nhc2UgMTQ6cmV0dXJuIGU9Yi50eXBlLGY9bGcoZSxiLnBlbmRpbmdQcm9wcyksZj1sZyhlLnR5cGUsZiksaWkoYSxiLGUsZixkLGMpO2Nhc2UgMTU6cmV0dXJuIGtpKGEsYixiLnR5cGUsYi5wZW5kaW5nUHJvcHMsZCxjKTtjYXNlIDE3OnJldHVybiBkPWIudHlwZSxlPWIucGVuZGluZ1Byb3BzLGU9Yi5lbGVtZW50VHlwZT09PWQ/ZTpsZyhkLGUpLG51bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZmxhZ3N8PTIpLGIudGFnPTEsRmYoZCk/KGE9ITAsSmYoYikpOmE9ITEsdGcoYixjKSxNZyhiLGQsZSksT2coYixkLGUsYykscWkobnVsbCxiLGQsITAsYSxjKTtjYXNlIDE5OnJldHVybiBBaShhLGIsYyk7Y2FzZSAyMzpyZXR1cm4gbWkoYSxiLGMpO2Nhc2UgMjQ6cmV0dXJuIG1pKGEsYixjKX10aHJvdyBFcnJvcih5KDE1NixiLnRhZykpO1xufTtmdW5jdGlvbiBpayhhLGIsYyxkKXt0aGlzLnRhZz1hO3RoaXMua2V5PWM7dGhpcy5zaWJsaW5nPXRoaXMuY2hpbGQ9dGhpcy5yZXR1cm49dGhpcy5zdGF0ZU5vZGU9dGhpcy50eXBlPXRoaXMuZWxlbWVudFR5cGU9bnVsbDt0aGlzLmluZGV4PTA7dGhpcy5yZWY9bnVsbDt0aGlzLnBlbmRpbmdQcm9wcz1iO3RoaXMuZGVwZW5kZW5jaWVzPXRoaXMubWVtb2l6ZWRTdGF0ZT10aGlzLnVwZGF0ZVF1ZXVlPXRoaXMubWVtb2l6ZWRQcm9wcz1udWxsO3RoaXMubW9kZT1kO3RoaXMuZmxhZ3M9MDt0aGlzLmxhc3RFZmZlY3Q9dGhpcy5maXJzdEVmZmVjdD10aGlzLm5leHRFZmZlY3Q9bnVsbDt0aGlzLmNoaWxkTGFuZXM9dGhpcy5sYW5lcz0wO3RoaXMuYWx0ZXJuYXRlPW51bGx9ZnVuY3Rpb24gbmgoYSxiLGMsZCl7cmV0dXJuIG5ldyBpayhhLGIsYyxkKX1mdW5jdGlvbiBqaShhKXthPWEucHJvdG90eXBlO3JldHVybiEoIWF8fCFhLmlzUmVhY3RDb21wb25lbnQpfVxuZnVuY3Rpb24gaGsoYSl7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIGppKGEpPzE6MDtpZih2b2lkIDAhPT1hJiZudWxsIT09YSl7YT1hLiQkdHlwZW9mO2lmKGE9PT1BYSlyZXR1cm4gMTE7aWYoYT09PURhKXJldHVybiAxNH1yZXR1cm4gMn1cbmZ1bmN0aW9uIFRnKGEsYil7dmFyIGM9YS5hbHRlcm5hdGU7bnVsbD09PWM/KGM9bmgoYS50YWcsYixhLmtleSxhLm1vZGUpLGMuZWxlbWVudFR5cGU9YS5lbGVtZW50VHlwZSxjLnR5cGU9YS50eXBlLGMuc3RhdGVOb2RlPWEuc3RhdGVOb2RlLGMuYWx0ZXJuYXRlPWEsYS5hbHRlcm5hdGU9Yyk6KGMucGVuZGluZ1Byb3BzPWIsYy50eXBlPWEudHlwZSxjLmZsYWdzPTAsYy5uZXh0RWZmZWN0PW51bGwsYy5maXJzdEVmZmVjdD1udWxsLGMubGFzdEVmZmVjdD1udWxsKTtjLmNoaWxkTGFuZXM9YS5jaGlsZExhbmVzO2MubGFuZXM9YS5sYW5lcztjLmNoaWxkPWEuY2hpbGQ7Yy5tZW1vaXplZFByb3BzPWEubWVtb2l6ZWRQcm9wcztjLm1lbW9pemVkU3RhdGU9YS5tZW1vaXplZFN0YXRlO2MudXBkYXRlUXVldWU9YS51cGRhdGVRdWV1ZTtiPWEuZGVwZW5kZW5jaWVzO2MuZGVwZW5kZW5jaWVzPW51bGw9PT1iP251bGw6e2xhbmVzOmIubGFuZXMsZmlyc3RDb250ZXh0OmIuZmlyc3RDb250ZXh0fTtcbmMuc2libGluZz1hLnNpYmxpbmc7Yy5pbmRleD1hLmluZGV4O2MucmVmPWEucmVmO3JldHVybiBjfVxuZnVuY3Rpb24gVmcoYSxiLGMsZCxlLGYpe3ZhciBnPTI7ZD1hO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKWppKGEpJiYoZz0xKTtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlnPTU7ZWxzZSBhOnN3aXRjaChhKXtjYXNlIHVhOnJldHVybiBYZyhjLmNoaWxkcmVuLGUsZixiKTtjYXNlIEhhOmc9ODtlfD0xNjticmVhaztjYXNlIHdhOmc9ODtlfD0xO2JyZWFrO2Nhc2UgeGE6cmV0dXJuIGE9bmgoMTIsYyxiLGV8OCksYS5lbGVtZW50VHlwZT14YSxhLnR5cGU9eGEsYS5sYW5lcz1mLGE7Y2FzZSBCYTpyZXR1cm4gYT1uaCgxMyxjLGIsZSksYS50eXBlPUJhLGEuZWxlbWVudFR5cGU9QmEsYS5sYW5lcz1mLGE7Y2FzZSBDYTpyZXR1cm4gYT1uaCgxOSxjLGIsZSksYS5lbGVtZW50VHlwZT1DYSxhLmxhbmVzPWYsYTtjYXNlIElhOnJldHVybiB2aShjLGUsZixiKTtjYXNlIEphOnJldHVybiBhPW5oKDI0LGMsYixlKSxhLmVsZW1lbnRUeXBlPUphLGEubGFuZXM9ZixhO2RlZmF1bHQ6aWYoXCJvYmplY3RcIj09PVxudHlwZW9mIGEmJm51bGwhPT1hKXN3aXRjaChhLiQkdHlwZW9mKXtjYXNlIHlhOmc9MTA7YnJlYWsgYTtjYXNlIHphOmc9OTticmVhayBhO2Nhc2UgQWE6Zz0xMTticmVhayBhO2Nhc2UgRGE6Zz0xNDticmVhayBhO2Nhc2UgRWE6Zz0xNjtkPW51bGw7YnJlYWsgYTtjYXNlIEZhOmc9MjI7YnJlYWsgYX10aHJvdyBFcnJvcih5KDEzMCxudWxsPT1hP2E6dHlwZW9mIGEsXCJcIikpO31iPW5oKGcsYyxiLGUpO2IuZWxlbWVudFR5cGU9YTtiLnR5cGU9ZDtiLmxhbmVzPWY7cmV0dXJuIGJ9ZnVuY3Rpb24gWGcoYSxiLGMsZCl7YT1uaCg3LGEsZCxiKTthLmxhbmVzPWM7cmV0dXJuIGF9ZnVuY3Rpb24gdmkoYSxiLGMsZCl7YT1uaCgyMyxhLGQsYik7YS5lbGVtZW50VHlwZT1JYTthLmxhbmVzPWM7cmV0dXJuIGF9ZnVuY3Rpb24gVWcoYSxiLGMpe2E9bmgoNixhLG51bGwsYik7YS5sYW5lcz1jO3JldHVybiBhfVxuZnVuY3Rpb24gV2coYSxiLGMpe2I9bmgoNCxudWxsIT09YS5jaGlsZHJlbj9hLmNoaWxkcmVuOltdLGEua2V5LGIpO2IubGFuZXM9YztiLnN0YXRlTm9kZT17Y29udGFpbmVySW5mbzphLmNvbnRhaW5lckluZm8scGVuZGluZ0NoaWxkcmVuOm51bGwsaW1wbGVtZW50YXRpb246YS5pbXBsZW1lbnRhdGlvbn07cmV0dXJuIGJ9XG5mdW5jdGlvbiBqayhhLGIsYyl7dGhpcy50YWc9Yjt0aGlzLmNvbnRhaW5lckluZm89YTt0aGlzLmZpbmlzaGVkV29yaz10aGlzLnBpbmdDYWNoZT10aGlzLmN1cnJlbnQ9dGhpcy5wZW5kaW5nQ2hpbGRyZW49bnVsbDt0aGlzLnRpbWVvdXRIYW5kbGU9LTE7dGhpcy5wZW5kaW5nQ29udGV4dD10aGlzLmNvbnRleHQ9bnVsbDt0aGlzLmh5ZHJhdGU9Yzt0aGlzLmNhbGxiYWNrTm9kZT1udWxsO3RoaXMuY2FsbGJhY2tQcmlvcml0eT0wO3RoaXMuZXZlbnRUaW1lcz1aYygwKTt0aGlzLmV4cGlyYXRpb25UaW1lcz1aYygtMSk7dGhpcy5lbnRhbmdsZWRMYW5lcz10aGlzLmZpbmlzaGVkTGFuZXM9dGhpcy5tdXRhYmxlUmVhZExhbmVzPXRoaXMuZXhwaXJlZExhbmVzPXRoaXMucGluZ2VkTGFuZXM9dGhpcy5zdXNwZW5kZWRMYW5lcz10aGlzLnBlbmRpbmdMYW5lcz0wO3RoaXMuZW50YW5nbGVtZW50cz1aYygwKTt0aGlzLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9bnVsbH1cbmZ1bmN0aW9uIGtrKGEsYixjKXt2YXIgZD0zPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bnVsbDtyZXR1cm57JCR0eXBlb2Y6dGEsa2V5Om51bGw9PWQ/bnVsbDpcIlwiK2QsY2hpbGRyZW46YSxjb250YWluZXJJbmZvOmIsaW1wbGVtZW50YXRpb246Y319XG5mdW5jdGlvbiBsayhhLGIsYyxkKXt2YXIgZT1iLmN1cnJlbnQsZj1IZygpLGc9SWcoZSk7YTppZihjKXtjPWMuX3JlYWN0SW50ZXJuYWxzO2I6e2lmKFpiKGMpIT09Y3x8MSE9PWMudGFnKXRocm93IEVycm9yKHkoMTcwKSk7dmFyIGg9Yztkb3tzd2l0Y2goaC50YWcpe2Nhc2UgMzpoPWguc3RhdGVOb2RlLmNvbnRleHQ7YnJlYWsgYjtjYXNlIDE6aWYoRmYoaC50eXBlKSl7aD1oLnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDticmVhayBifX1oPWgucmV0dXJufXdoaWxlKG51bGwhPT1oKTt0aHJvdyBFcnJvcih5KDE3MSkpO31pZigxPT09Yy50YWcpe3ZhciBrPWMudHlwZTtpZihGZihrKSl7Yz1JZihjLGssaCk7YnJlYWsgYX19Yz1ofWVsc2UgYz1DZjtudWxsPT09Yi5jb250ZXh0P2IuY29udGV4dD1jOmIucGVuZGluZ0NvbnRleHQ9YztiPXpnKGYsZyk7Yi5wYXlsb2FkPXtlbGVtZW50OmF9O2Q9dm9pZCAwPT09ZD9udWxsOmQ7bnVsbCE9PVxuZCYmKGIuY2FsbGJhY2s9ZCk7QWcoZSxiKTtKZyhlLGcsZik7cmV0dXJuIGd9ZnVuY3Rpb24gbWsoYSl7YT1hLmN1cnJlbnQ7aWYoIWEuY2hpbGQpcmV0dXJuIG51bGw7c3dpdGNoKGEuY2hpbGQudGFnKXtjYXNlIDU6cmV0dXJuIGEuY2hpbGQuc3RhdGVOb2RlO2RlZmF1bHQ6cmV0dXJuIGEuY2hpbGQuc3RhdGVOb2RlfX1mdW5jdGlvbiBuayhhLGIpe2E9YS5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1hJiZudWxsIT09YS5kZWh5ZHJhdGVkKXt2YXIgYz1hLnJldHJ5TGFuZTthLnJldHJ5TGFuZT0wIT09YyYmYzxiP2M6Yn19ZnVuY3Rpb24gb2soYSxiKXtuayhhLGIpOyhhPWEuYWx0ZXJuYXRlKSYmbmsoYSxiKX1mdW5jdGlvbiBwaygpe3JldHVybiBudWxsfVxuZnVuY3Rpb24gcWsoYSxiLGMpe3ZhciBkPW51bGwhPWMmJm51bGwhPWMuaHlkcmF0aW9uT3B0aW9ucyYmYy5oeWRyYXRpb25PcHRpb25zLm11dGFibGVTb3VyY2VzfHxudWxsO2M9bmV3IGprKGEsYixudWxsIT1jJiYhMD09PWMuaHlkcmF0ZSk7Yj1uaCgzLG51bGwsbnVsbCwyPT09Yj83OjE9PT1iPzM6MCk7Yy5jdXJyZW50PWI7Yi5zdGF0ZU5vZGU9Yzt4ZyhiKTthW2ZmXT1jLmN1cnJlbnQ7Y2YoOD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmEpO2lmKGQpZm9yKGE9MDthPGQubGVuZ3RoO2ErKyl7Yj1kW2FdO3ZhciBlPWIuX2dldFZlcnNpb247ZT1lKGIuX3NvdXJjZSk7bnVsbD09Yy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhP2MubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1bYixlXTpjLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEucHVzaChiLGUpfXRoaXMuX2ludGVybmFsUm9vdD1jfVxucWsucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihhKXtsayhhLHRoaXMuX2ludGVybmFsUm9vdCxudWxsLG51bGwpfTtxay5wcm90b3R5cGUudW5tb3VudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuX2ludGVybmFsUm9vdCxiPWEuY29udGFpbmVySW5mbztsayhudWxsLGEsbnVsbCxmdW5jdGlvbigpe2JbZmZdPW51bGx9KX07ZnVuY3Rpb24gcmsoYSl7cmV0dXJuISghYXx8MSE9PWEubm9kZVR5cGUmJjkhPT1hLm5vZGVUeXBlJiYxMSE9PWEubm9kZVR5cGUmJig4IT09YS5ub2RlVHlwZXx8XCIgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgXCIhPT1hLm5vZGVWYWx1ZSkpfVxuZnVuY3Rpb24gc2soYSxiKXtifHwoYj1hPzk9PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEuZmlyc3RDaGlsZDpudWxsLGI9ISghYnx8MSE9PWIubm9kZVR5cGV8fCFiLmhhc0F0dHJpYnV0ZShcImRhdGEtcmVhY3Ryb290XCIpKSk7aWYoIWIpZm9yKHZhciBjO2M9YS5sYXN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYyk7cmV0dXJuIG5ldyBxayhhLDAsYj97aHlkcmF0ZTohMH06dm9pZCAwKX1cbmZ1bmN0aW9uIHRrKGEsYixjLGQsZSl7dmFyIGY9Yy5fcmVhY3RSb290Q29udGFpbmVyO2lmKGYpe3ZhciBnPWYuX2ludGVybmFsUm9vdDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZSl7dmFyIGg9ZTtlPWZ1bmN0aW9uKCl7dmFyIGE9bWsoZyk7aC5jYWxsKGEpfX1sayhiLGcsYSxlKX1lbHNle2Y9Yy5fcmVhY3RSb290Q29udGFpbmVyPXNrKGMsZCk7Zz1mLl9pbnRlcm5hbFJvb3Q7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGUpe3ZhciBrPWU7ZT1mdW5jdGlvbigpe3ZhciBhPW1rKGcpO2suY2FsbChhKX19WGooZnVuY3Rpb24oKXtsayhiLGcsYSxlKX0pfXJldHVybiBtayhnKX1lYz1mdW5jdGlvbihhKXtpZigxMz09PWEudGFnKXt2YXIgYj1IZygpO0pnKGEsNCxiKTtvayhhLDQpfX07ZmM9ZnVuY3Rpb24oYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9SGcoKTtKZyhhLDY3MTA4ODY0LGIpO29rKGEsNjcxMDg4NjQpfX07XG5nYz1mdW5jdGlvbihhKXtpZigxMz09PWEudGFnKXt2YXIgYj1IZygpLGM9SWcoYSk7SmcoYSxjLGIpO29rKGEsYyl9fTtoYz1mdW5jdGlvbihhLGIpe3JldHVybiBiKCl9O1xueWI9ZnVuY3Rpb24oYSxiLGMpe3N3aXRjaChiKXtjYXNlIFwiaW5wdXRcIjphYihhLGMpO2I9Yy5uYW1lO2lmKFwicmFkaW9cIj09PWMudHlwZSYmbnVsbCE9Yil7Zm9yKGM9YTtjLnBhcmVudE5vZGU7KWM9Yy5wYXJlbnROb2RlO2M9Yy5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbbmFtZT1cIitKU09OLnN0cmluZ2lmeShcIlwiK2IpKyddW3R5cGU9XCJyYWRpb1wiXScpO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBkPWNbYl07aWYoZCE9PWEmJmQuZm9ybT09PWEuZm9ybSl7dmFyIGU9RGIoZCk7aWYoIWUpdGhyb3cgRXJyb3IoeSg5MCkpO1dhKGQpO2FiKGQsZSl9fX1icmVhaztjYXNlIFwidGV4dGFyZWFcIjppYihhLGMpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpiPWMudmFsdWUsbnVsbCE9YiYmZmIoYSwhIWMubXVsdGlwbGUsYiwhMSl9fTtHYj1XajtcbkhiPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9WDtYfD00O3RyeXtyZXR1cm4gZ2coOTgsYS5iaW5kKG51bGwsYixjLGQsZSkpfWZpbmFsbHl7WD1mLDA9PT1YJiYod2ooKSxpZygpKX19O0liPWZ1bmN0aW9uKCl7MD09PShYJjQ5KSYmKFZqKCksT2ooKSl9O0piPWZ1bmN0aW9uKGEsYil7dmFyIGM9WDtYfD0yO3RyeXtyZXR1cm4gYShiKX1maW5hbGx5e1g9YywwPT09WCYmKHdqKCksaWcoKSl9fTtmdW5jdGlvbiB1ayhhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsO2lmKCFyayhiKSl0aHJvdyBFcnJvcih5KDIwMCkpO3JldHVybiBrayhhLGIsbnVsbCxjKX12YXIgdms9e0V2ZW50czpbQ2IsdWUsRGIsRWIsRmIsT2ose2N1cnJlbnQ6ITF9XX0sd2s9e2ZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOndjLGJ1bmRsZVR5cGU6MCx2ZXJzaW9uOlwiMTcuMC4yXCIscmVuZGVyZXJQYWNrYWdlTmFtZTpcInJlYWN0LWRvbVwifTtcbnZhciB4az17YnVuZGxlVHlwZTp3ay5idW5kbGVUeXBlLHZlcnNpb246d2sudmVyc2lvbixyZW5kZXJlclBhY2thZ2VOYW1lOndrLnJlbmRlcmVyUGFja2FnZU5hbWUscmVuZGVyZXJDb25maWc6d2sucmVuZGVyZXJDb25maWcsb3ZlcnJpZGVIb29rU3RhdGU6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzOm51bGwsb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzUmVuYW1lUGF0aDpudWxsLHNldFN1c3BlbnNlSGFuZGxlcjpudWxsLHNjaGVkdWxlVXBkYXRlOm51bGwsY3VycmVudERpc3BhdGNoZXJSZWY6cmEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjpmdW5jdGlvbihhKXthPWNjKGEpO3JldHVybiBudWxsPT09YT9udWxsOmEuc3RhdGVOb2RlfSxmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTp3ay5maW5kRmliZXJCeUhvc3RJbnN0YW5jZXx8XG5wayxmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2g6bnVsbCxzY2hlZHVsZVJlZnJlc2g6bnVsbCxzY2hlZHVsZVJvb3Q6bnVsbCxzZXRSZWZyZXNoSGFuZGxlcjpudWxsLGdldEN1cnJlbnRGaWJlcjpudWxsfTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyl7dmFyIHlrPV9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztpZigheWsuaXNEaXNhYmxlZCYmeWsuc3VwcG9ydHNGaWJlcil0cnl7TGY9eWsuaW5qZWN0KHhrKSxNZj15a31jYXRjaChhKXt9fWV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9dms7ZXhwb3J0cy5jcmVhdGVQb3J0YWw9dWs7XG5leHBvcnRzLmZpbmRET01Ob2RlPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7aWYoMT09PWEubm9kZVR5cGUpcmV0dXJuIGE7dmFyIGI9YS5fcmVhY3RJbnRlcm5hbHM7aWYodm9pZCAwPT09Yil7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEucmVuZGVyKXRocm93IEVycm9yKHkoMTg4KSk7dGhyb3cgRXJyb3IoeSgyNjgsT2JqZWN0LmtleXMoYSkpKTt9YT1jYyhiKTthPW51bGw9PT1hP251bGw6YS5zdGF0ZU5vZGU7cmV0dXJuIGF9O2V4cG9ydHMuZmx1c2hTeW5jPWZ1bmN0aW9uKGEsYil7dmFyIGM9WDtpZigwIT09KGMmNDgpKXJldHVybiBhKGIpO1h8PTE7dHJ5e2lmKGEpcmV0dXJuIGdnKDk5LGEuYmluZChudWxsLGIpKX1maW5hbGx5e1g9YyxpZygpfX07ZXhwb3J0cy5oeWRyYXRlPWZ1bmN0aW9uKGEsYixjKXtpZighcmsoYikpdGhyb3cgRXJyb3IoeSgyMDApKTtyZXR1cm4gdGsobnVsbCxhLGIsITAsYyl9O1xuZXhwb3J0cy5yZW5kZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKCFyayhiKSl0aHJvdyBFcnJvcih5KDIwMCkpO3JldHVybiB0ayhudWxsLGEsYiwhMSxjKX07ZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlPWZ1bmN0aW9uKGEpe2lmKCFyayhhKSl0aHJvdyBFcnJvcih5KDQwKSk7cmV0dXJuIGEuX3JlYWN0Um9vdENvbnRhaW5lcj8oWGooZnVuY3Rpb24oKXt0ayhudWxsLG51bGwsYSwhMSxmdW5jdGlvbigpe2EuX3JlYWN0Um9vdENvbnRhaW5lcj1udWxsO2FbZmZdPW51bGx9KX0pLCEwKTohMX07ZXhwb3J0cy51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcz1XajtleHBvcnRzLnVuc3RhYmxlX2NyZWF0ZVBvcnRhbD1mdW5jdGlvbihhLGIpe3JldHVybiB1ayhhLGIsMjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwpfTtcbmV4cG9ydHMudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIXJrKGMpKXRocm93IEVycm9yKHkoMjAwKSk7aWYobnVsbD09YXx8dm9pZCAwPT09YS5fcmVhY3RJbnRlcm5hbHMpdGhyb3cgRXJyb3IoeSgzOCkpO3JldHVybiB0ayhhLGIsYywhMSxkKX07ZXhwb3J0cy52ZXJzaW9uPVwiMTcuMC4yXCI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCJpbXBvcnQge0FjdGlvbiwgUmVkdWNlciwgU3RhdGV9IGZyb20gJy4vY3JlYXRlU3RvcmUnO1xuXG5pbnRlcmZhY2UgUmVkdWNlcnNNYXBPYmplY3Q8UyBleHRlbmRzIFN0YXRlID0gYW55LCBBIGV4dGVuZHMgQWN0aW9uID0gYW55PiB7XG4gIFtrZXk6IHN0cmluZ106IFJlZHVjZXI8UywgQT47XG59XG5cbnR5cGUgU3RhdGVGcm9tUmVkdWNlcnNNYXBPYmplY3Q8TT4gPSBNIGV4dGVuZHMgUmVkdWNlcnNNYXBPYmplY3RcbiAgPyB7W1AgaW4ga2V5b2YgTV06IE1bUF0gZXh0ZW5kcyBSZWR1Y2VyPGluZmVyIFMsIGFueT4gPyBTIDogbmV2ZXJ9XG4gIDogbmV2ZXI7XG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VyczxTIGV4dGVuZHMgU3RhdGUsIEEgZXh0ZW5kcyBBY3Rpb24+KHJlZHVjZXJzOiBSZWR1Y2Vyc01hcE9iamVjdCk6IFJlZHVjZXI8UywgQT4ge1xuICBjb25zdCByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgY29uc3QgZmluYWxSZWR1Y2Vyc09iajogUmVkdWNlcnNNYXBPYmplY3QgPSB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiByZWR1Y2VyS2V5cykge1xuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmluYWxSZWR1Y2Vyc09ialtrZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKChzdGF0ZTogU3RhdGVGcm9tUmVkdWNlcnNNYXBPYmplY3Q8dHlwZW9mIHJlZHVjZXJzPiA9IHt9LCBhY3Rpb246IEEpID0+IHtcbiAgICBsZXQgaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG5leHRTdGF0ZTogU3RhdGVGcm9tUmVkdWNlcnNNYXBPYmplY3Q8dHlwZW9mIHJlZHVjZXJzPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgcmVkdWNlcktleXMpIHtcbiAgICAgIGNvbnN0IHByZXZTdGF0ZUZvcktleSA9IHN0YXRlW2tleV07XG4gICAgICBjb25zdCBuZXh0U3RhdGVGb3JLZXkgPSBmaW5hbFJlZHVjZXJzT2JqW2tleV0ocHJldlN0YXRlRm9yS2V5LCBhY3Rpb24pO1xuICAgICAgbmV4dFN0YXRlW2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZTdGF0ZUZvcktleTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFzQ2hhbmdlZCA/IG5leHRTdGF0ZSA6IHN0YXRlO1xuICB9KSBhcyBhbnkgYXMgUmVkdWNlcjxTLCBBPjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29tYmluZVJlZHVjZXJzO1xuIiwiZXhwb3J0IHR5cGUgU3RhdGUgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcbmV4cG9ydCB0eXBlIEFjdGlvbiA9IHtcbiAgdHlwZTogc3RyaW5nO1xuICBwYXlsb2FkOiBhbnk7XG59O1xuXG5leHBvcnQgdHlwZSBSZWR1Y2VyPFMgZXh0ZW5kcyBTdGF0ZSwgQSBleHRlbmRzIEFjdGlvbj4gPSAoczogUywgYTogQSkgPT4gUztcbnR5cGUgTGlzdGVuZXI8UyBleHRlbmRzIFN0YXRlPiA9IChuczogUywgcHM/OiBTKSA9PiB2b2lkO1xudHlwZSBVbnN1YnNjcmliZSA9ICgpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmU8UyBleHRlbmRzIFN0YXRlLCBBIGV4dGVuZHMgQWN0aW9uPiB7XG4gIGRpc3BhdGNoOiAoYTogQSkgPT4gdm9pZDtcbiAgZ2V0U3RhdGU6ICgpID0+IFM7XG4gIHN1YnNjcmliZTogKGxpc3RlbmVyOiBMaXN0ZW5lcjxTPikgPT4gVW5zdWJzY3JpYmU7XG59XG5cbi8qKlxuICog566A5Y2V5a6e546w55qEIFJlZHV4XG4gKiBAcGFyYW0gcHJlbG9hZGVkU3RhdGUg5Yid5aeLIHN0YXRlXG4gKiBAcGFyYW0gcmVkdWNlciByZWR1Y2VyIHB1cmUgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHN0b3JlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlPFMgZXh0ZW5kcyBTdGF0ZSwgQSBleHRlbmRzIEFjdGlvbj4oXG4gIHByZWxvYWRlZFN0YXRlOiBTLFxuICByZWR1Y2VyOiBSZWR1Y2VyPFMsIEE+LFxuKTogU3RvcmU8UmVhZG9ubHk8Uz4sIEE+IHtcbiAgY29uc3QgbGlzdGVuZXJzOiBMaXN0ZW5lcjxTPltdID0gW107XG4gIGxldCBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcblxuICBjb25zdCBkaXNwYXRjaCA9IChhY3Rpb246IEEpID0+IHtcbiAgICBjb25zdCBuZXh0U3RhdGUgPSByZWR1Y2VyKGN1cnJlbnRTdGF0ZSwgYWN0aW9uKTtcbiAgICBjb25zdCBwcmV2U3RhdGUgPSBjdXJyZW50U3RhdGU7XG4gICAgY3VycmVudFN0YXRlID0gbmV4dFN0YXRlO1xuXG4gICAgZm9yIChjb25zdCBjYiBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgIGNiKGN1cnJlbnRTdGF0ZSwgcHJldlN0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc3Vic2NyaWJlID0gKGxpc3RlbmVyOiBMaXN0ZW5lcjxTPikgPT4ge1xuICAgIGxldCBpc1N1YnNjcmliZWQgPSB0cnVlO1xuICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGdldFN0YXRlID0gKCkgPT4ge1xuICAgIHJldHVybiBjdXJyZW50U3RhdGU7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBkaXNwYXRjaCxcbiAgICBnZXRTdGF0ZSxcbiAgICBzdWJzY3JpYmUsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVN0b3JlO1xuIiwiZXhwb3J0IGludGVyZmFjZSBBcHBTZXR0aW5nIHtcbiAgc2hvdWxkU3BsaXRNZW1vV29yZDogYm9vbGVhbjtcbiAgc2hvdWxkSGlkZUltYWdlVXJsOiBib29sZWFuO1xuICBzaG91bGRVc2VNYXJrZG93blBhcnNlcjogYm9vbGVhbjtcbiAgdXNlVGlueVVuZG9IaXN0b3J5Q2FjaGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGUgZXh0ZW5kcyBBcHBTZXR0aW5nIHtcbiAgbWFya01lbW9JZDogc3RyaW5nO1xuICBlZGl0TWVtb0lkOiBzdHJpbmc7XG4gIGlzTW9iaWxlVmlldzogYm9vbGVhbjtcbiAgc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgU2V0TWFya01lbW9JZEFjdGlvbiB7XG4gIHR5cGU6ICdTRVRfTUFSS19NRU1PX0lEJztcbiAgcGF5bG9hZDoge1xuICAgIG1hcmtNZW1vSWQ6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNldEVkaXRNZW1vSWRBY3Rpb24ge1xuICB0eXBlOiAnU0VUX0VESVRfTUVNT19JRCc7XG4gIHBheWxvYWQ6IHtcbiAgICBlZGl0TWVtb0lkOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBTZXRNb2JpbGVWaWV3QWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9NT0JJTEVfVklFVyc7XG4gIHBheWxvYWQ6IHtcbiAgICBpc01vYmlsZVZpZXc6IGJvb2xlYW47XG4gIH07XG59XG5cbmludGVyZmFjZSBTZXRTaG93U2lkZWJhckFjdGlvbiB7XG4gIHR5cGU6ICdTRVRfU0hPV19TSURFQkFSX0lOX01PQklMRV9WSUVXJztcbiAgcGF5bG9hZDoge1xuICAgIHNob3dTaWRlcmJhckluTW9iaWxlVmlldzogYm9vbGVhbjtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNldEFwcFNldHRpbmdBY3Rpb24ge1xuICB0eXBlOiAnU0VUX0FQUF9TRVRUSU5HJztcbiAgcGF5bG9hZDogUGFydGlhbDxBcHBTZXR0aW5nPjtcbn1cblxuZXhwb3J0IHR5cGUgQWN0aW9ucyA9XG4gIHwgU2V0TW9iaWxlVmlld0FjdGlvblxuICB8IFNldFNob3dTaWRlYmFyQWN0aW9uXG4gIHwgU2V0RWRpdE1lbW9JZEFjdGlvblxuICB8IFNldE1hcmtNZW1vSWRBY3Rpb25cbiAgfCBTZXRBcHBTZXR0aW5nQWN0aW9uO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlcihzdGF0ZTogU3RhdGUsIGFjdGlvbjogQWN0aW9ucykge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSAnU0VUX01BUktfTUVNT19JRCc6IHtcbiAgICAgIGlmIChhY3Rpb24ucGF5bG9hZC5tYXJrTWVtb0lkID09PSBzdGF0ZS5tYXJrTWVtb0lkKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIG1hcmtNZW1vSWQ6IGFjdGlvbi5wYXlsb2FkLm1hcmtNZW1vSWQsXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdTRVRfRURJVF9NRU1PX0lEJzoge1xuICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkLmVkaXRNZW1vSWQgPT09IHN0YXRlLmVkaXRNZW1vSWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZWRpdE1lbW9JZDogYWN0aW9uLnBheWxvYWQuZWRpdE1lbW9JZCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ1NFVF9NT0JJTEVfVklFVyc6IHtcbiAgICAgIGlmIChhY3Rpb24ucGF5bG9hZC5pc01vYmlsZVZpZXcgPT09IHN0YXRlLmlzTW9iaWxlVmlldykge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc01vYmlsZVZpZXc6IGFjdGlvbi5wYXlsb2FkLmlzTW9iaWxlVmlldyxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ1NFVF9TSE9XX1NJREVCQVJfSU5fTU9CSUxFX1ZJRVcnOiB7XG4gICAgICBpZiAoYWN0aW9uLnBheWxvYWQuc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3ID09PSBzdGF0ZS5zaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3OiBhY3Rpb24ucGF5bG9hZC5zaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcsXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdTRVRfQVBQX1NFVFRJTkcnOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQsXG4gICAgICB9O1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0U3RhdGU6IFN0YXRlID0ge1xuICBtYXJrTWVtb0lkOiAnJyxcbiAgZWRpdE1lbW9JZDogJycsXG4gIHNob3VsZFNwbGl0TWVtb1dvcmQ6IHRydWUsXG4gIHNob3VsZEhpZGVJbWFnZVVybDogdHJ1ZSxcbiAgc2hvdWxkVXNlTWFya2Rvd25QYXJzZXI6IHRydWUsXG4gIHVzZVRpbnlVbmRvSGlzdG9yeUNhY2hlOiBmYWxzZSxcbiAgaXNNb2JpbGVWaWV3OiBmYWxzZSxcbiAgc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3OiBmYWxzZSxcbn07XG4iLCJleHBvcnQgdHlwZSBTdGF0ZSA9IEFwcExvY2F0aW9uO1xuXG5pbnRlcmZhY2UgU2V0TG9jYXRpb24ge1xuICB0eXBlOiAnU0VUX0xPQ0FUSU9OJztcbiAgcGF5bG9hZDogU3RhdGU7XG59XG5cbmludGVyZmFjZSBTZXRQYXRobmFtZUFjdGlvbiB7XG4gIHR5cGU6ICdTRVRfUEFUSE5BTUUnO1xuICBwYXlsb2FkOiB7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNldFF1ZXJ5IHtcbiAgdHlwZTogJ1NFVF9RVUVSWSc7XG4gIHBheWxvYWQ6IFF1ZXJ5O1xufVxuXG5pbnRlcmZhY2UgU2V0UXVlcnlGaWx0ZXJBY3Rpb24ge1xuICB0eXBlOiAnU0VUX1FVRVJZX0ZJTFRFUic7XG4gIHBheWxvYWQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFNldFRhZ1F1ZXJ5QWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9UQUdfUVVFUlknO1xuICBwYXlsb2FkOiB7XG4gICAgdGFnOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBTZXRGcm9tQW5kVG9RdWVyeUFjdGlvbiB7XG4gIHR5cGU6ICdTRVRfRFVSQVRJT05fUVVFUlknO1xuICBwYXlsb2FkOiB7XG4gICAgZHVyYXRpb246IER1cmF0aW9uIHwgbnVsbDtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNldFR5cGVBY3Rpb24ge1xuICB0eXBlOiAnU0VUX1RZUEUnO1xuICBwYXlsb2FkOiB7XG4gICAgdHlwZTogTWVtb1NwZWNUeXBlIHwgJyc7XG4gIH07XG59XG5cbmludGVyZmFjZSBTZXRUZXh0QWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9URVhUJztcbiAgcGF5bG9hZDoge1xuICAgIHRleHQ6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFNldEhhc2hBY3Rpb24ge1xuICB0eXBlOiAnU0VUX0hBU0gnO1xuICBwYXlsb2FkOiB7XG4gICAgaGFzaDogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgdHlwZSBBY3Rpb25zID1cbiAgfCBTZXRMb2NhdGlvblxuICB8IFNldFBhdGhuYW1lQWN0aW9uXG4gIHwgU2V0UXVlcnlcbiAgfCBTZXRUYWdRdWVyeUFjdGlvblxuICB8IFNldEZyb21BbmRUb1F1ZXJ5QWN0aW9uXG4gIHwgU2V0VHlwZUFjdGlvblxuICB8IFNldFRleHRBY3Rpb25cbiAgfCBTZXRRdWVyeUZpbHRlckFjdGlvblxuICB8IFNldEhhc2hBY3Rpb247XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlOiBTdGF0ZSwgYWN0aW9uOiBBY3Rpb25zKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlICdTRVRfTE9DQVRJT04nOiB7XG4gICAgICByZXR1cm4gYWN0aW9uLnBheWxvYWQ7XG4gICAgfVxuICAgIGNhc2UgJ1NFVF9QQVRITkFNRSc6IHtcbiAgICAgIGlmIChhY3Rpb24ucGF5bG9hZC5wYXRobmFtZSA9PT0gc3RhdGUucGF0aG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgcGF0aG5hbWU6IGFjdGlvbi5wYXlsb2FkLnBhdGhuYW1lLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX0hBU0gnOiB7XG4gICAgICBpZiAoYWN0aW9uLnBheWxvYWQuaGFzaCA9PT0gc3RhdGUuaGFzaCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBoYXNoOiBhY3Rpb24ucGF5bG9hZC5oYXNoLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX1FVRVJZJzoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdTRVRfVEFHX1FVRVJZJzoge1xuICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkLnRhZyA9PT0gc3RhdGUucXVlcnkudGFnKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgdGFnOiBhY3Rpb24ucGF5bG9hZC50YWcsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdTRVRfRFVSQVRJT05fUVVFUlknOiB7XG4gICAgICBpZiAoYWN0aW9uLnBheWxvYWQuZHVyYXRpb24gPT09IHN0YXRlLnF1ZXJ5LmR1cmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgZHVyYXRpb246IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LmR1cmF0aW9uLFxuICAgICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQuZHVyYXRpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ1NFVF9UWVBFJzoge1xuICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkLnR5cGUgPT09IHN0YXRlLnF1ZXJ5LnR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICB0eXBlOiBhY3Rpb24ucGF5bG9hZC50eXBlLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX1RFWFQnOiB7XG4gICAgICBpZiAoYWN0aW9uLnBheWxvYWQudGV4dCA9PT0gc3RhdGUucXVlcnkudGV4dCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBxdWVyeToge1xuICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgIHRleHQ6IGFjdGlvbi5wYXlsb2FkLnRleHQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdTRVRfUVVFUllfRklMVEVSJzoge1xuICAgICAgaWYgKGFjdGlvbi5wYXlsb2FkID09PSBzdGF0ZS5xdWVyeS5maWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICBmaWx0ZXI6IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdFN0YXRlOiBTdGF0ZSA9IHtcbiAgcGF0aG5hbWU6ICcvJyxcbiAgaGFzaDogJycsXG4gIHF1ZXJ5OiB7XG4gICAgdGFnOiAnJyxcbiAgICBkdXJhdGlvbjogbnVsbCxcbiAgICB0eXBlOiAnJyxcbiAgICB0ZXh0OiAnJyxcbiAgICBmaWx0ZXI6ICcnLFxuICB9LFxufTtcbiIsImltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG5uYW1lc3BhY2UgdXRpbHMge1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXROb3dUaW1lU3RhbXAoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBwYXJzZUludChtb21lbnQoKS5mb3JtYXQoJ3gnKSk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZ2V0T1NWZXJzaW9uKCk6ICdXaW5kb3dzJyB8ICdNYWNPUycgfCAnTGludXgnIHwgJ1Vua25vd24nIHtcclxuICAgIGNvbnN0IGFwcFZlcnNpb24gPSBuYXZpZ2F0b3IudXNlckFnZW50O1xyXG4gICAgbGV0IGRldGVjdGVkT1M6ICdXaW5kb3dzJyB8ICdNYWNPUycgfCAnTGludXgnIHwgJ1Vua25vd24nID0gJ1Vua25vd24nO1xyXG5cclxuICAgIGlmIChhcHBWZXJzaW9uLmluZGV4T2YoJ1dpbicpICE9IC0xKSB7XHJcbiAgICAgIGRldGVjdGVkT1MgPSAnV2luZG93cyc7XHJcbiAgICB9IGVsc2UgaWYgKGFwcFZlcnNpb24uaW5kZXhPZignTWFjJykgIT0gLTEpIHtcclxuICAgICAgZGV0ZWN0ZWRPUyA9ICdNYWNPUyc7XHJcbiAgICB9IGVsc2UgaWYgKGFwcFZlcnNpb24uaW5kZXhPZignTGludXgnKSAhPSAtMSkge1xyXG4gICAgICBkZXRlY3RlZE9TID0gJ0xpbnV4JztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGV0ZWN0ZWRPUztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lU3RhbXBCeURhdGUodDogRGF0ZSB8IG51bWJlciB8IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBpZiAodHlwZW9mIHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHQgPSB0LnJlcGxhY2VBbGwoJy0nLCAnLycpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBEYXRlKHQpLmdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXREYXRlU3RhbXBCeURhdGUodDogRGF0ZSB8IG51bWJlciB8IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBkID0gbmV3IERhdGUoZ2V0VGltZVN0YW1wQnlEYXRlKHQpKTtcclxuICAgIHJldHVybiBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgZC5nZXREYXRlKCkpLmdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXREYXRlU3RyaW5nKHQ6IERhdGUgfCBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGdldFRpbWVTdGFtcEJ5RGF0ZSh0KSk7XHJcblxyXG4gICAgY29uc3QgeWVhciA9IGQuZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IG1vbnRoID0gZC5nZXRNb250aCgpICsgMTtcclxuICAgIGNvbnN0IGRhdGUgPSBkLmdldERhdGUoKTtcclxuXHJcbiAgICByZXR1cm4gYCR7eWVhcn0vJHttb250aH0vJHtkYXRlfWA7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZ2V0VGltZVN0cmluZyh0OiBEYXRlIHwgbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShnZXRUaW1lU3RhbXBCeURhdGUodCkpO1xyXG5cclxuICAgIGNvbnN0IGhvdXJzID0gZC5nZXRIb3VycygpO1xyXG4gICAgY29uc3QgbWlucyA9IGQuZ2V0TWludXRlcygpO1xyXG5cclxuICAgIGNvbnN0IGhvdXJzU3RyID0gaG91cnMgPCAxMCA/ICcwJyArIGhvdXJzIDogaG91cnM7XHJcbiAgICBjb25zdCBtaW5zU3RyID0gbWlucyA8IDEwID8gJzAnICsgbWlucyA6IG1pbnM7XHJcblxyXG4gICAgcmV0dXJuIGAke2hvdXJzU3RyfToke21pbnNTdHJ9YDtcclxuICB9XHJcblxyXG4gIC8vIEZvciBleGFtcGxlOiAyMDIxLTQtOCAxNzo1MjoxN1xyXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXREYXRlVGltZVN0cmluZyh0OiBEYXRlIHwgbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShnZXRUaW1lU3RhbXBCeURhdGUodCkpO1xyXG5cclxuICAgIGNvbnN0IHllYXIgPSBkLmdldEZ1bGxZZWFyKCk7XHJcbiAgICBjb25zdCBtb250aCA9IGQuZ2V0TW9udGgoKSArIDE7XHJcbiAgICBjb25zdCBkYXRlID0gZC5nZXREYXRlKCk7XHJcbiAgICBjb25zdCBob3VycyA9IGQuZ2V0SG91cnMoKTtcclxuICAgIGNvbnN0IG1pbnMgPSBkLmdldE1pbnV0ZXMoKTtcclxuICAgIC8vIGNvbnN0IHNlY3MgPSBkLmdldFNlY29uZHMoKTtcclxuXHJcbiAgICBjb25zdCBtb250aFN0ciA9IG1vbnRoIDwgMTAgPyAnMCcgKyBtb250aCA6IG1vbnRoO1xyXG4gICAgY29uc3QgZGF0ZVN0ciA9IGRhdGUgPCAxMCA/ICcwJyArIGRhdGUgOiBkYXRlO1xyXG4gICAgY29uc3QgaG91cnNTdHIgPSBob3VycyA8IDEwID8gJzAnICsgaG91cnMgOiBob3VycztcclxuICAgIGNvbnN0IG1pbnNTdHIgPSBtaW5zIDwgMTAgPyAnMCcgKyBtaW5zIDogbWlucztcclxuICAgIC8vIGNvbnN0IHNlY3NTdHIgPSBzZWNzIDwgMTAgPyBcIjBcIiArIHNlY3MgOiBzZWNzO1xyXG4gICAgY29uc3Qgc2Vjc1N0ciA9ICcwMCc7XHJcblxyXG4gICAgcmV0dXJuIGAke3llYXJ9LyR7bW9udGhTdHJ9LyR7ZGF0ZVN0cn0gJHtob3Vyc1N0cn06JHttaW5zU3RyfToke3NlY3NTdHJ9YDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWR1cGU8VD4oZGF0YTogVFtdKTogVFtdIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoZGF0YSkpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGRlZHVwZU9iamVjdFdpdGhJZDxUIGV4dGVuZHMge2lkOiBzdHJpbmd9PihkYXRhOiBUW10pOiBUW10ge1xyXG4gICAgY29uc3QgaWRTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgZCBvZiBkYXRhKSB7XHJcbiAgICAgIGlmICghaWRTZXQuaGFzKGQuaWQpKSB7XHJcbiAgICAgICAgaWRTZXQuYWRkKGQuaWQpO1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKGQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWJvdW5jZShmbjogRnVuY3Rpb25UeXBlLCBkZWxheTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdGltZXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIGlmICh0aW1lcikge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XHJcbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZuLCBkZWxheSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZuLCBkZWxheSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gdGhyb3R0bGUoZm46IEZ1bmN0aW9uVHlwZSwgZGVsYXk6IG51bWJlcikge1xyXG4gICAgbGV0IHZhbGlkID0gdHJ1ZTtcclxuXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBpZiAoIXZhbGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHZhbGlkID0gZmFsc2U7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGZuKCk7XHJcbiAgICAgICAgdmFsaWQgPSB0cnVlO1xyXG4gICAgICB9LCBkZWxheSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU9iamVjdFRvUGFyYW1zU3RyaW5nKG9iamVjdDogS1ZPYmplY3QpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGFyYW1zID0gW107XHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KCk7XHJcblxyXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xyXG4gICAgICBjb25zdCB2YWwgPSBvYmplY3Rba2V5XTtcclxuICAgICAgaWYgKHZhbCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgcGFyYW1zLnB1c2goLi4udHJhbnNmb3JtT2JqZWN0VG9QYXJhbXNTdHJpbmcodmFsKS5zcGxpdCgnJicpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcGFyYW1zLnB1c2goYCR7a2V5fT0ke3ZhbH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGFyYW1zLmpvaW4oJyYnKTtcclxuICB9XHJcblxyXG4gIGV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1QYXJhbXNTdHJpbmdUb09iamVjdChwYXJhbXNTdHJpbmc6IHN0cmluZyk6IEtWT2JqZWN0IHtcclxuICAgIGNvbnN0IG9iamVjdDogS1ZPYmplY3QgPSB7fTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHBhcmFtc1N0cmluZy5zcGxpdCgnJicpO1xyXG5cclxuICAgIGZvciAoY29uc3QgcCBvZiBwYXJhbXMpIHtcclxuICAgICAgY29uc3QgW2tleSwgdmFsXSA9IHAuc3BsaXQoJz0nKTtcclxuICAgICAgaWYgKGtleSAmJiB2YWwpIHtcclxuICAgICAgICBvYmplY3Rba2V5XSA9IHZhbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgZnVuY3Rpb24gZmlsdGVyT2JqZWN0TnVsbEtleXMob2JqZWN0OiBLVk9iamVjdCk6IEtWT2JqZWN0IHtcclxuICAgIGlmICghb2JqZWN0KSB7XHJcbiAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaW5hbE9iamVjdDogS1ZPYmplY3QgPSB7fTtcclxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpLnNvcnQoKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XHJcbiAgICAgIGNvbnN0IHZhbCA9IG9iamVjdFtrZXldO1xyXG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICBjb25zdCB0ZW1wID0gZmlsdGVyT2JqZWN0TnVsbEtleXMoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWwpKSk7XHJcbiAgICAgICAgaWYgKHRlbXAgJiYgT2JqZWN0LmtleXModGVtcCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgZmluYWxPYmplY3Rba2V5XSA9IHRlbXA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh2YWwpIHtcclxuICAgICAgICAgIGZpbmFsT2JqZWN0W2tleV0gPSB2YWw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZpbmFsT2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlUZXh0VG9DbGlwYm9hcmQodGV4dDogc3RyaW5nKSB7XHJcbiAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignQ29weSB0byBjbGlwYm9hcmQgZmFpbGVkLicsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdDb3B5IHRvIGNsaXBib2FyZCBmYWlsZWQsIG1ldGhvZHMgbm90IHN1cHBvcnRzLicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGZ1bmN0aW9uIGdldEltYWdlU2l6ZShzcmM6IHN0cmluZyk6IFByb21pc2U8e3dpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyfT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGltZ0VsID0gbmV3IEltYWdlKCk7XHJcblxyXG4gICAgICBpbWdFbC5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gaW1nRWw7XHJcblxyXG4gICAgICAgIGlmICh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkge1xyXG4gICAgICAgICAgcmVzb2x2ZSh7d2lkdGgsIGhlaWdodH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXNvbHZlKHt3aWR0aDogMCwgaGVpZ2h0OiAwfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaW1nRWwub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgICByZXNvbHZlKHt3aWR0aDogMCwgaGVpZ2h0OiAwfSk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpbWdFbC5jbGFzc05hbWUgPSAnaGlkZGVuJztcclxuICAgICAgaW1nRWwuc3JjID0gc3JjO1xyXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGltZ0VsKTtcclxuICAgICAgaW1nRWwucmVtb3ZlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHV0aWxzO1xyXG4iLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGUge1xuICBtZW1vczogTW9kZWwuTWVtb1tdO1xuICB0YWdzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNldE1lbW9zQWN0aW9uIHtcbiAgdHlwZTogJ1NFVF9NRU1PUyc7XG4gIHBheWxvYWQ6IHtcbiAgICBtZW1vczogTW9kZWwuTWVtb1tdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgU2V0VGFnc0FjdGlvbiB7XG4gIHR5cGU6ICdTRVRfVEFHUyc7XG4gIHBheWxvYWQ6IHtcbiAgICB0YWdzOiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIEluc2VydE1lbW9BY3Rpb24ge1xuICB0eXBlOiAnSU5TRVJUX01FTU8nO1xuICBwYXlsb2FkOiB7XG4gICAgbWVtbzogTW9kZWwuTWVtbztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIERlbGV0ZU1lbW9CeUlkQWN0aW9uIHtcbiAgdHlwZTogJ0RFTEVURV9NRU1PX0JZX0lEJztcbiAgcGF5bG9hZDoge1xuICAgIGlkOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBFZGl0TWVtb0J5SWRBY3Rpb24ge1xuICB0eXBlOiAnRURJVF9NRU1PJztcbiAgcGF5bG9hZDogTW9kZWwuTWVtbztcbn1cblxuZXhwb3J0IHR5cGUgQWN0aW9ucyA9IFNldE1lbW9zQWN0aW9uIHwgU2V0VGFnc0FjdGlvbiB8IEluc2VydE1lbW9BY3Rpb24gfCBEZWxldGVNZW1vQnlJZEFjdGlvbiB8IEVkaXRNZW1vQnlJZEFjdGlvbjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGU6IFN0YXRlLCBhY3Rpb246IEFjdGlvbnMpOiBTdGF0ZSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlICdTRVRfTUVNT1MnOiB7XG4gICAgICBjb25zdCBtZW1vcyA9IHV0aWxzLmRlZHVwZU9iamVjdFdpdGhJZChcbiAgICAgICAgYWN0aW9uLnBheWxvYWQubWVtb3Muc29ydChcbiAgICAgICAgICAoYSwgYikgPT4gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGIuY3JlYXRlZEF0KSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLmNyZWF0ZWRBdCksXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgICAvLyBjb25zdCBtZW1vcyA9IGFjdGlvbi5wYXlsb2FkLm1lbW9zLnNvcnQoKGEsIGIpID0+IHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShiLmNyZWF0ZWRBdCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYS5jcmVhdGVkQXQpKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIG1lbW9zOiBbLi4ubWVtb3NdLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX1RBR1MnOiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgdGFnczogYWN0aW9uLnBheWxvYWQudGFncyxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ0lOU0VSVF9NRU1PJzoge1xuICAgICAgY29uc3QgbWVtb3MgPSB1dGlscy5kZWR1cGVPYmplY3RXaXRoSWQoXG4gICAgICAgIFthY3Rpb24ucGF5bG9hZC5tZW1vLCAuLi5zdGF0ZS5tZW1vc10uc29ydChcbiAgICAgICAgICAoYSwgYikgPT4gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGIuY3JlYXRlZEF0KSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLmNyZWF0ZWRBdCksXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgbWVtb3MsXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlICdERUxFVEVfTUVNT19CWV9JRCc6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBtZW1vczogWy4uLnN0YXRlLm1lbW9zXS5maWx0ZXIoKG1lbW8pID0+IG1lbW8uaWQgIT09IGFjdGlvbi5wYXlsb2FkLmlkKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ0VESVRfTUVNTyc6IHtcbiAgICAgIGNvbnN0IG1lbW9zID0gc3RhdGUubWVtb3MubWFwKChtKSA9PiB7XG4gICAgICAgIGlmIChtLmlkID09PSBhY3Rpb24ucGF5bG9hZC5pZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBtZW1vcyxcbiAgICAgIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRTdGF0ZTogU3RhdGUgPSB7XG4gIG1lbW9zOiBbXSxcbiAgdGFnczogW10sXG59O1xuIiwiZXhwb3J0IGludGVyZmFjZSBTdGF0ZSB7XG4gIHVzZXI6IE1vZGVsLlVzZXIgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgU2lnbkluQWN0aW9uIHtcbiAgdHlwZTogJ1NJR05fSU4nO1xuICBwYXlsb2FkOiBTdGF0ZTtcbn1cblxuaW50ZXJmYWNlIFNpZ25PdXRBY3Rpb24ge1xuICB0eXBlOiAnU0lHTl9PVVQnO1xuICBwYXlsb2FkOiBudWxsO1xufVxuXG5leHBvcnQgdHlwZSBBY3Rpb25zID0gU2lnbkluQWN0aW9uIHwgU2lnbk91dEFjdGlvbjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGU6IFN0YXRlLCBhY3Rpb246IEFjdGlvbnMpOiBTdGF0ZSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlICdTSUdOX0lOJzoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcjogYWN0aW9uLnBheWxvYWQudXNlcixcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ1NJR05fT1VUJzoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcjogbnVsbCxcbiAgICAgIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRTdGF0ZTogU3RhdGUgPSB7dXNlcjogbnVsbH07XG4iLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGUge1xuICBxdWVyaWVzOiBNb2RlbC5RdWVyeVtdO1xufVxuXG5pbnRlcmZhY2UgU2V0UXVlcmllcyB7XG4gIHR5cGU6ICdTRVRfUVVFUklFUyc7XG4gIHBheWxvYWQ6IHtcbiAgICBxdWVyaWVzOiBNb2RlbC5RdWVyeVtdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgSW5zZXJ0UXVlcnlBY3Rpb24ge1xuICB0eXBlOiAnSU5TRVJUX1FVRVJZJztcbiAgcGF5bG9hZDoge1xuICAgIHF1ZXJ5OiBNb2RlbC5RdWVyeTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIERlbGV0ZVF1ZXJ5QnlJZEFjdGlvbiB7XG4gIHR5cGU6ICdERUxFVEVfUVVFUllfQllfSUQnO1xuICBwYXlsb2FkOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFVwZGF0ZVF1ZXJ5QWN0aW9uIHtcbiAgdHlwZTogJ1VQREFURV9RVUVSWSc7XG4gIHBheWxvYWQ6IE1vZGVsLlF1ZXJ5O1xufVxuXG5leHBvcnQgdHlwZSBBY3Rpb25zID0gU2V0UXVlcmllcyB8IEluc2VydFF1ZXJ5QWN0aW9uIHwgRGVsZXRlUXVlcnlCeUlkQWN0aW9uIHwgVXBkYXRlUXVlcnlBY3Rpb247XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2VyKHN0YXRlOiBTdGF0ZSwgYWN0aW9uOiBBY3Rpb25zKTogU3RhdGUge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSAnU0VUX1FVRVJJRVMnOiB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gdXRpbHMuZGVkdXBlT2JqZWN0V2l0aElkKFxuICAgICAgICBhY3Rpb24ucGF5bG9hZC5xdWVyaWVzXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShiLmNyZWF0ZWRBdCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYS5jcmVhdGVkQXQpKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYi5waW5uZWRBdCA/PyAwKSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLnBpbm5lZEF0ID8/IDApKSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBxdWVyaWVzLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnSU5TRVJUX1FVRVJZJzoge1xuICAgICAgY29uc3QgcXVlcmllcyA9IHV0aWxzLmRlZHVwZU9iamVjdFdpdGhJZChcbiAgICAgICAgW2FjdGlvbi5wYXlsb2FkLnF1ZXJ5LCAuLi5zdGF0ZS5xdWVyaWVzXS5zb3J0KFxuICAgICAgICAgIChhLCBiKSA9PiB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYi5jcmVhdGVkQXQpIC0gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGEuY3JlYXRlZEF0KSxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBxdWVyaWVzLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnREVMRVRFX1FVRVJZX0JZX0lEJzoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHF1ZXJpZXM6IFsuLi5zdGF0ZS5xdWVyaWVzXS5maWx0ZXIoKHF1ZXJ5KSA9PiBxdWVyeS5pZCAhPT0gYWN0aW9uLnBheWxvYWQuaWQpLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnVVBEQVRFX1FVRVJZJzoge1xuICAgICAgY29uc3QgcXVlcmllcyA9IHN0YXRlLnF1ZXJpZXMubWFwKChtKSA9PiB7XG4gICAgICAgIGlmIChtLmlkID09PSBhY3Rpb24ucGF5bG9hZC5pZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBxdWVyaWVzLFxuICAgICAgfTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdFN0YXRlOiBTdGF0ZSA9IHtcbiAgcXVlcmllczogW10sXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgb2JzaWRpYW4gPSByZXF1aXJlKCdvYnNpZGlhbicpO1xuXG5jb25zdCBERUZBVUxUX0RBSUxZX05PVEVfRk9STUFUID0gXCJZWVlZLU1NLUREXCI7XG5jb25zdCBERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCA9IFwiZ2dnZy1bV113d1wiO1xuY29uc3QgREVGQVVMVF9NT05USExZX05PVEVfRk9STUFUID0gXCJZWVlZLU1NXCI7XG5jb25zdCBERUZBVUxUX1FVQVJURVJMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWS1bUV1RXCI7XG5jb25zdCBERUZBVUxUX1lFQVJMWV9OT1RFX0ZPUk1BVCA9IFwiWVlZWVwiO1xuXG5mdW5jdGlvbiBzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MocGVyaW9kaWNpdHkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSB3aW5kb3cuYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik7XG4gICAgcmV0dXJuIHBlcmlvZGljTm90ZXMgJiYgcGVyaW9kaWNOb3Rlcy5zZXR0aW5ncz8uW3BlcmlvZGljaXR5XT8uZW5hYmxlZDtcbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBkYWlseS1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0RGFpbHlOb3RlU2V0dGluZ3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgeyBpbnRlcm5hbFBsdWdpbnMsIHBsdWdpbnMgfSA9IHdpbmRvdy5hcHA7XG4gICAgICAgIGlmIChzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MoXCJkYWlseVwiKSkge1xuICAgICAgICAgICAgY29uc3QgeyBmb3JtYXQsIGZvbGRlciwgdGVtcGxhdGUgfSA9IHBsdWdpbnMuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik/LnNldHRpbmdzPy5kYWlseSB8fCB7fTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQgfHwgREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgICAgICBmb2xkZXI6IGZvbGRlcj8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBmb2xkZXIsIGZvcm1hdCwgdGVtcGxhdGUgfSA9IGludGVybmFsUGx1Z2lucy5nZXRQbHVnaW5CeUlkKFwiZGFpbHktbm90ZXNcIik/Lmluc3RhbmNlPy5vcHRpb25zIHx8IHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQgfHwgREVGQVVMVF9EQUlMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIGRhaWx5IG5vdGUgc2V0dGluZ3MgZm91bmQhXCIsIGVycik7XG4gICAgfVxufVxuLyoqXG4gKiBSZWFkIHRoZSB1c2VyIHNldHRpbmdzIGZvciB0aGUgYHdlZWtseS1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0V2Vla2x5Tm90ZVNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgICAgIGNvbnN0IGNhbGVuZGFyU2V0dGluZ3MgPSBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcImNhbGVuZGFyXCIpPy5vcHRpb25zO1xuICAgICAgICBjb25zdCBwZXJpb2RpY05vdGVzU2V0dGluZ3MgPSBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8ud2Vla2x5O1xuICAgICAgICBpZiAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwid2Vla2x5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDogcGVyaW9kaWNOb3Rlc1NldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX1dFRUtMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgICAgICBmb2xkZXI6IHBlcmlvZGljTm90ZXNTZXR0aW5ncy5mb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBwZXJpb2RpY05vdGVzU2V0dGluZ3MudGVtcGxhdGU/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGNhbGVuZGFyU2V0dGluZ3MgfHwge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLndlZWtseU5vdGVGb3JtYXQgfHwgREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQsXG4gICAgICAgICAgICBmb2xkZXI6IHNldHRpbmdzLndlZWtseU5vdGVGb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgdGVtcGxhdGU6IHNldHRpbmdzLndlZWtseU5vdGVUZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIHdlZWtseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBwZXJpb2RpYy1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0TW9udGhseU5vdGVTZXR0aW5ncygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwibW9udGhseVwiKSAmJlxuICAgICAgICAgICAgcGx1Z2luTWFuYWdlci5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKT8uc2V0dGluZ3M/Lm1vbnRobHkpIHx8XG4gICAgICAgICAgICB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdDogc2V0dGluZ3MuZm9ybWF0IHx8IERFRkFVTFRfTU9OVEhMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogc2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy50ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIG1vbnRobHkgbm90ZSBzZXR0aW5ncyBmb3VuZCFcIiwgZXJyKTtcbiAgICB9XG59XG4vKipcbiAqIFJlYWQgdGhlIHVzZXIgc2V0dGluZ3MgZm9yIHRoZSBgcGVyaW9kaWMtbm90ZXNgIHBsdWdpblxuICogdG8ga2VlcCBiZWhhdmlvciBvZiBjcmVhdGluZyBhIG5ldyBub3RlIGluLXN5bmMuXG4gKi9cbmZ1bmN0aW9uIGdldFF1YXJ0ZXJseU5vdGVTZXR0aW5ncygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSB3aW5kb3cuYXBwLnBsdWdpbnM7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSAoc2hvdWxkVXNlUGVyaW9kaWNOb3Rlc1NldHRpbmdzKFwicXVhcnRlcmx5XCIpICYmXG4gICAgICAgICAgICBwbHVnaW5NYW5hZ2VyLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpPy5zZXR0aW5ncz8ucXVhcnRlcmx5KSB8fFxuICAgICAgICAgICAge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmb3JtYXQ6IHNldHRpbmdzLmZvcm1hdCB8fCBERUZBVUxUX1FVQVJURVJMWV9OT1RFX0ZPUk1BVCxcbiAgICAgICAgICAgIGZvbGRlcjogc2V0dGluZ3MuZm9sZGVyPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgICAgIHRlbXBsYXRlOiBzZXR0aW5ncy50ZW1wbGF0ZT8udHJpbSgpIHx8IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFwiTm8gY3VzdG9tIHF1YXJ0ZXJseSBub3RlIHNldHRpbmdzIGZvdW5kIVwiLCBlcnIpO1xuICAgIH1cbn1cbi8qKlxuICogUmVhZCB0aGUgdXNlciBzZXR0aW5ncyBmb3IgdGhlIGBwZXJpb2RpYy1ub3Rlc2AgcGx1Z2luXG4gKiB0byBrZWVwIGJlaGF2aW9yIG9mIGNyZWF0aW5nIGEgbmV3IG5vdGUgaW4tc3luYy5cbiAqL1xuZnVuY3Rpb24gZ2V0WWVhcmx5Tm90ZVNldHRpbmdzKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcGx1Z2luTWFuYWdlciA9IHdpbmRvdy5hcHAucGx1Z2lucztcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IChzaG91bGRVc2VQZXJpb2RpY05vdGVzU2V0dGluZ3MoXCJ5ZWFybHlcIikgJiZcbiAgICAgICAgICAgIHBsdWdpbk1hbmFnZXIuZ2V0UGx1Z2luKFwicGVyaW9kaWMtbm90ZXNcIik/LnNldHRpbmdzPy55ZWFybHkpIHx8XG4gICAgICAgICAgICB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdDogc2V0dGluZ3MuZm9ybWF0IHx8IERFRkFVTFRfWUVBUkxZX05PVEVfRk9STUFULFxuICAgICAgICAgICAgZm9sZGVyOiBzZXR0aW5ncy5mb2xkZXI/LnRyaW0oKSB8fCBcIlwiLFxuICAgICAgICAgICAgdGVtcGxhdGU6IHNldHRpbmdzLnRlbXBsYXRlPy50cmltKCkgfHwgXCJcIixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmluZm8oXCJObyBjdXN0b20geWVhcmx5IG5vdGUgc2V0dGluZ3MgZm91bmQhXCIsIGVycik7XG4gICAgfVxufVxuXG4vLyBDcmVkaXQ6IEBjcmVhdGlvbml4L3BhdGguanNcbmZ1bmN0aW9uIGpvaW4oLi4ucGFydFNlZ21lbnRzKSB7XG4gICAgLy8gU3BsaXQgdGhlIGlucHV0cyBpbnRvIGEgbGlzdCBvZiBwYXRoIGNvbW1hbmRzLlxuICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gcGFydFNlZ21lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBwYXJ0cyA9IHBhcnRzLmNvbmNhdChwYXJ0U2VnbWVudHNbaV0uc3BsaXQoXCIvXCIpKTtcbiAgICB9XG4gICAgLy8gSW50ZXJwcmV0IHRoZSBwYXRoIGNvbW1hbmRzIHRvIGdldCB0aGUgbmV3IHJlc29sdmVkIHBhdGguXG4gICAgY29uc3QgbmV3UGFydHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgIC8vIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzXG4gICAgICAgIC8vIEFsc28gcmVtb3ZlIFwiLlwiIHNlZ21lbnRzXG4gICAgICAgIGlmICghcGFydCB8fCBwYXJ0ID09PSBcIi5cIilcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAvLyBQdXNoIG5ldyBwYXRoIHNlZ21lbnRzLlxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuZXdQYXJ0cy5wdXNoKHBhcnQpO1xuICAgIH1cbiAgICAvLyBQcmVzZXJ2ZSB0aGUgaW5pdGlhbCBzbGFzaCBpZiB0aGVyZSB3YXMgb25lLlxuICAgIGlmIChwYXJ0c1swXSA9PT0gXCJcIilcbiAgICAgICAgbmV3UGFydHMudW5zaGlmdChcIlwiKTtcbiAgICAvLyBUdXJuIGJhY2sgaW50byBhIHNpbmdsZSBzdHJpbmcgcGF0aC5cbiAgICByZXR1cm4gbmV3UGFydHMuam9pbihcIi9cIik7XG59XG5mdW5jdGlvbiBiYXNlbmFtZShmdWxsUGF0aCkge1xuICAgIGxldCBiYXNlID0gZnVsbFBhdGguc3Vic3RyaW5nKGZ1bGxQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuICAgIGlmIChiYXNlLmxhc3RJbmRleE9mKFwiLlwiKSAhPSAtMSlcbiAgICAgICAgYmFzZSA9IGJhc2Uuc3Vic3RyaW5nKDAsIGJhc2UubGFzdEluZGV4T2YoXCIuXCIpKTtcbiAgICByZXR1cm4gYmFzZTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZUZvbGRlckV4aXN0cyhwYXRoKSB7XG4gICAgY29uc3QgZGlycyA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikuc3BsaXQoXCIvXCIpO1xuICAgIGRpcnMucG9wKCk7IC8vIHJlbW92ZSBiYXNlbmFtZVxuICAgIGlmIChkaXJzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkaXIgPSBqb2luKC4uLmRpcnMpO1xuICAgICAgICBpZiAoIXdpbmRvdy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGRpcikpIHtcbiAgICAgICAgICAgIGF3YWl0IHdpbmRvdy5hcHAudmF1bHQuY3JlYXRlRm9sZGVyKGRpcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiBnZXROb3RlUGF0aChkaXJlY3RvcnksIGZpbGVuYW1lKSB7XG4gICAgaWYgKCFmaWxlbmFtZS5lbmRzV2l0aChcIi5tZFwiKSkge1xuICAgICAgICBmaWxlbmFtZSArPSBcIi5tZFwiO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0gb2JzaWRpYW4ubm9ybWFsaXplUGF0aChqb2luKGRpcmVjdG9yeSwgZmlsZW5hbWUpKTtcbiAgICBhd2FpdCBlbnN1cmVGb2xkZXJFeGlzdHMocGF0aCk7XG4gICAgcmV0dXJuIHBhdGg7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpIHtcbiAgICBjb25zdCB7IG1ldGFkYXRhQ2FjaGUsIHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgodGVtcGxhdGUpO1xuICAgIGlmICh0ZW1wbGF0ZVBhdGggPT09IFwiL1wiKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW1wiXCIsIG51bGxdKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCh0ZW1wbGF0ZVBhdGgsIFwiXCIpO1xuICAgICAgICBjb25zdCBjb250ZW50cyA9IGF3YWl0IHZhdWx0LmNhY2hlZFJlYWQodGVtcGxhdGVGaWxlKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgSUZvbGRJbmZvID0gd2luZG93LmFwcC5mb2xkTWFuYWdlci5sb2FkKHRlbXBsYXRlRmlsZSk7XG4gICAgICAgIHJldHVybiBbY29udGVudHMsIElGb2xkSW5mb107XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHJlYWQgdGhlIGRhaWx5IG5vdGUgdGVtcGxhdGUgJyR7dGVtcGxhdGVQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiRmFpbGVkIHRvIHJlYWQgdGhlIGRhaWx5IG5vdGUgdGVtcGxhdGVcIik7XG4gICAgICAgIHJldHVybiBbXCJcIiwgbnVsbF07XG4gICAgfVxufVxuXG4vKipcbiAqIGRhdGVVSUQgaXMgYSB3YXkgb2Ygd2Vla2x5IGlkZW50aWZ5aW5nIGRhaWx5L3dlZWtseS9tb250aGx5IG5vdGVzLlxuICogVGhleSBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgZ3JhbnVsYXJpdHkgdG8gYXZvaWQgYW1iaWd1aXR5LlxuICovXG5mdW5jdGlvbiBnZXREYXRlVUlEKGRhdGUsIGdyYW51bGFyaXR5ID0gXCJkYXlcIikge1xuICAgIGNvbnN0IHRzID0gZGF0ZS5jbG9uZSgpLnN0YXJ0T2YoZ3JhbnVsYXJpdHkpLmZvcm1hdCgpO1xuICAgIHJldHVybiBgJHtncmFudWxhcml0eX0tJHt0c31gO1xufVxuZnVuY3Rpb24gcmVtb3ZlRXNjYXBlZENoYXJhY3RlcnMoZm9ybWF0KSB7XG4gICAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC9cXFtbXlxcXV0qXFxdL2csIFwiXCIpOyAvLyByZW1vdmUgZXZlcnl0aGluZyB3aXRoaW4gYnJhY2tldHNcbn1cbi8qKlxuICogWFhYOiBXaGVuIHBhcnNpbmcgZGF0ZXMgdGhhdCBjb250YWluIGJvdGggd2VlayBudW1iZXJzIGFuZCBtb250aHMsXG4gKiBNb21lbnQgY2hvc2VzIHRvIGlnbm9yZSB0aGUgd2VlayBudW1iZXJzLiBGb3IgdGhlIHdlZWsgZGF0ZVVJRCwgd2VcbiAqIHdhbnQgdGhlIG9wcG9zaXRlIGJlaGF2aW9yLiBTdHJpcCB0aGUgTU1NIGZyb20gdGhlIGZvcm1hdCB0byBwYXRjaC5cbiAqL1xuZnVuY3Rpb24gaXNGb3JtYXRBbWJpZ3VvdXMoZm9ybWF0LCBncmFudWxhcml0eSkge1xuICAgIGlmIChncmFudWxhcml0eSA9PT0gXCJ3ZWVrXCIpIHtcbiAgICAgICAgY29uc3QgY2xlYW5Gb3JtYXQgPSByZW1vdmVFc2NhcGVkQ2hhcmFjdGVycyhmb3JtYXQpO1xuICAgICAgICByZXR1cm4gKC93ezEsMn0vaS50ZXN0KGNsZWFuRm9ybWF0KSAmJlxuICAgICAgICAgICAgKC9NezEsNH0vLnRlc3QoY2xlYW5Gb3JtYXQpIHx8IC9EezEsNH0vLnRlc3QoY2xlYW5Gb3JtYXQpKSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldERhdGVGcm9tRmlsZShmaWxlLCBncmFudWxhcml0eSkge1xuICAgIHJldHVybiBnZXREYXRlRnJvbUZpbGVuYW1lKGZpbGUuYmFzZW5hbWUsIGdyYW51bGFyaXR5KTtcbn1cbmZ1bmN0aW9uIGdldERhdGVGcm9tUGF0aChwYXRoLCBncmFudWxhcml0eSkge1xuICAgIHJldHVybiBnZXREYXRlRnJvbUZpbGVuYW1lKGJhc2VuYW1lKHBhdGgpLCBncmFudWxhcml0eSk7XG59XG5mdW5jdGlvbiBnZXREYXRlRnJvbUZpbGVuYW1lKGZpbGVuYW1lLCBncmFudWxhcml0eSkge1xuICAgIGNvbnN0IGdldFNldHRpbmdzID0ge1xuICAgICAgICBkYXk6IGdldERhaWx5Tm90ZVNldHRpbmdzLFxuICAgICAgICB3ZWVrOiBnZXRXZWVrbHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIG1vbnRoOiBnZXRNb250aGx5Tm90ZVNldHRpbmdzLFxuICAgICAgICBxdWFydGVyOiBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHllYXI6IGdldFllYXJseU5vdGVTZXR0aW5ncyxcbiAgICB9O1xuICAgIGNvbnN0IGZvcm1hdCA9IGdldFNldHRpbmdzW2dyYW51bGFyaXR5XSgpLmZvcm1hdC5zcGxpdChcIi9cIikucG9wKCk7XG4gICAgY29uc3Qgbm90ZURhdGUgPSB3aW5kb3cubW9tZW50KGZpbGVuYW1lLCBmb3JtYXQsIHRydWUpO1xuICAgIGlmICghbm90ZURhdGUuaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoaXNGb3JtYXRBbWJpZ3VvdXMoZm9ybWF0LCBncmFudWxhcml0eSkpIHtcbiAgICAgICAgaWYgKGdyYW51bGFyaXR5ID09PSBcIndlZWtcIikge1xuICAgICAgICAgICAgY29uc3QgY2xlYW5Gb3JtYXQgPSByZW1vdmVFc2NhcGVkQ2hhcmFjdGVycyhmb3JtYXQpO1xuICAgICAgICAgICAgaWYgKC93ezEsMn0vaS50ZXN0KGNsZWFuRm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cubW9tZW50KGZpbGVuYW1lLCBcbiAgICAgICAgICAgICAgICAvLyBJZiBmb3JtYXQgY29udGFpbnMgd2VlaywgcmVtb3ZlIGRheSAmIG1vbnRoIGZvcm1hdHRpbmdcbiAgICAgICAgICAgICAgICBmb3JtYXQucmVwbGFjZSgvTXsxLDR9L2csIFwiXCIpLnJlcGxhY2UoL0R7MSw0fS9nLCBcIlwiKSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub3RlRGF0ZTtcbn1cblxuY2xhc3MgRGFpbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIHRoZSBkYWlseS1ub3RlcyBwbHVnaW5cbiAqIHNvIGl0IHdpbGwgcmVwbGFjZSB7e2RhdGV9fSwge3t0aXRsZX19LCBhbmQge3t0aW1lfX0gd2l0aCB0aGVcbiAqIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gKlxuICogTm90ZTogaXQgaGFzIGFuIGFkZGVkIGJvbnVzIHRoYXQgaXQncyBub3QgJ3RvZGF5JyBzcGVjaWZpYy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGFpbHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCBhcHAgPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IGFwcDtcbiAgICBjb25zdCBtb21lbnQgPSB3aW5kb3cubW9tZW50O1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXREYWlseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IFt0ZW1wbGF0ZUNvbnRlbnRzLCBJRm9sZEluZm9dID0gYXdhaXQgZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBhd2FpdCBnZXROb3RlUGF0aChmb2xkZXIsIGZpbGVuYW1lKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShub3JtYWxpemVkUGF0aCwgdGVtcGxhdGVDb250ZW50c1xuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKmRhdGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpbWVcXHMqfX0vZ2ksIG1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpdGxlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBtb21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZGF0ZS5jbG9uZSgpLnNldCh7XG4gICAgICAgICAgICAgICAgaG91cjogbm93LmdldChcImhvdXJcIiksXG4gICAgICAgICAgICAgICAgbWludXRlOiBub3cuZ2V0KFwibWludXRlXCIpLFxuICAgICAgICAgICAgICAgIHNlY29uZDogbm93LmdldChcInNlY29uZFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNhbGMpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS5hZGQocGFyc2VJbnQodGltZURlbHRhLCAxMCksIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vbWVudEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQobW9tZW50Rm9ybWF0LnN1YnN0cmluZygxKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnllc3RlcmRheVxccyp9fS9naSwgZGF0ZS5jbG9uZSgpLnN1YnRyYWN0KDEsIFwiZGF5XCIpLmZvcm1hdChmb3JtYXQpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRvbW9ycm93XFxzKn19L2dpLCBkYXRlLmNsb25lKCkuYWRkKDEsIFwiZFwiKS5mb3JtYXQoZm9ybWF0KSkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBhcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXREYWlseU5vdGUoZGF0ZSwgZGFpbHlOb3Rlcykge1xuICAgIHJldHVybiBkYWlseU5vdGVzW2dldERhdGVVSUQoZGF0ZSwgXCJkYXlcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxEYWlseU5vdGVzKCkge1xuICAgIC8qKlxuICAgICAqIEZpbmQgYWxsIGRhaWx5IG5vdGVzIGluIHRoZSBkYWlseSBub3RlIGZvbGRlclxuICAgICAqL1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldERhaWx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgZGFpbHlOb3Rlc0ZvbGRlciA9IHZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChvYnNpZGlhbi5ub3JtYWxpemVQYXRoKGZvbGRlcikpO1xuICAgIGlmICghZGFpbHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRGFpbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvcihcIkZhaWxlZCB0byBmaW5kIGRhaWx5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgY29uc3QgZGFpbHlOb3RlcyA9IHt9O1xuICAgIG9ic2lkaWFuLlZhdWx0LnJlY3Vyc2VDaGlsZHJlbihkYWlseU5vdGVzRm9sZGVyLCAobm90ZSkgPT4ge1xuICAgICAgICBpZiAobm90ZSBpbnN0YW5jZW9mIG9ic2lkaWFuLlRGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKG5vdGUsIFwiZGF5XCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICBkYWlseU5vdGVzW2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkYWlseU5vdGVzO1xufVxuXG5jbGFzcyBXZWVrbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbmZ1bmN0aW9uIGdldERheXNPZldlZWsoKSB7XG4gICAgY29uc3QgeyBtb21lbnQgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGxldCB3ZWVrU3RhcnQgPSBtb21lbnQubG9jYWxlRGF0YSgpLl93ZWVrLmRvdztcbiAgICBjb25zdCBkYXlzT2ZXZWVrID0gW1xuICAgICAgICBcInN1bmRheVwiLFxuICAgICAgICBcIm1vbmRheVwiLFxuICAgICAgICBcInR1ZXNkYXlcIixcbiAgICAgICAgXCJ3ZWRuZXNkYXlcIixcbiAgICAgICAgXCJ0aHVyc2RheVwiLFxuICAgICAgICBcImZyaWRheVwiLFxuICAgICAgICBcInNhdHVyZGF5XCIsXG4gICAgXTtcbiAgICB3aGlsZSAod2Vla1N0YXJ0KSB7XG4gICAgICAgIGRheXNPZldlZWsucHVzaChkYXlzT2ZXZWVrLnNoaWZ0KCkpO1xuICAgICAgICB3ZWVrU3RhcnQtLTtcbiAgICB9XG4gICAgcmV0dXJuIGRheXNPZldlZWs7XG59XG5mdW5jdGlvbiBnZXREYXlPZldlZWtOdW1lcmljYWxWYWx1ZShkYXlPZldlZWtOYW1lKSB7XG4gICAgcmV0dXJuIGdldERheXNPZldlZWsoKS5pbmRleE9mKGRheU9mV2Vla05hbWUudG9Mb3dlckNhc2UoKSk7XG59XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVXZWVrbHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRXZWVrbHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aXRsZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGltZVxccyp9fS9naSwgd2luZG93Lm1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSlcXHMqOiguKj8pfX0vZ2ksIChfLCBkYXlPZldlZWssIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF5ID0gZ2V0RGF5T2ZXZWVrTnVtZXJpY2FsVmFsdWUoZGF5T2ZXZWVrKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRlLndlZWtkYXkoZGF5KS5mb3JtYXQobW9tZW50Rm9ybWF0LnRyaW0oKSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd2luZG93LmFwcC5mb2xkTWFuYWdlci5zYXZlKGNyZWF0ZWRGaWxlLCBJRm9sZEluZm8pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtub3JtYWxpemVkUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIlVuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFdlZWtseU5vdGUoZGF0ZSwgd2Vla2x5Tm90ZXMpIHtcbiAgICByZXR1cm4gd2Vla2x5Tm90ZXNbZ2V0RGF0ZVVJRChkYXRlLCBcIndlZWtcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxXZWVrbHlOb3RlcygpIHtcbiAgICBjb25zdCB3ZWVrbHlOb3RlcyA9IHt9O1xuICAgIGlmICghYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4gd2Vla2x5Tm90ZXM7XG4gICAgfVxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldFdlZWtseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IHdlZWtseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCF3ZWVrbHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgV2Vla2x5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IoXCJGYWlsZWQgdG8gZmluZCB3ZWVrbHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4od2Vla2x5Tm90ZXNGb2xkZXIsIChub3RlKSA9PiB7XG4gICAgICAgIGlmIChub3RlIGluc3RhbmNlb2Ygb2JzaWRpYW4uVEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBnZXREYXRlRnJvbUZpbGUobm90ZSwgXCJ3ZWVrXCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcIndlZWtcIik7XG4gICAgICAgICAgICAgICAgd2Vla2x5Tm90ZXNbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdlZWtseU5vdGVzO1xufVxuXG5jbGFzcyBNb250aGx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGFpbHktbm90ZXMgcGx1Z2luXG4gKiBzbyBpdCB3aWxsIHJlcGxhY2Uge3tkYXRlfX0sIHt7dGl0bGV9fSwgYW5kIHt7dGltZX19IHdpdGggdGhlXG4gKiBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICpcbiAqIE5vdGU6IGl0IGhhcyBhbiBhZGRlZCBib251cyB0aGF0IGl0J3Mgbm90ICd0b2RheScgc3BlY2lmaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU1vbnRobHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRNb250aGx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgW3RlbXBsYXRlQ29udGVudHMsIElGb2xkSW5mb10gPSBhd2FpdCBnZXRUZW1wbGF0ZUluZm8odGVtcGxhdGUpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gZGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IGF3YWl0IGdldE5vdGVQYXRoKGZvbGRlciwgZmlsZW5hbWUpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlKG5vcm1hbGl6ZWRQYXRoLCB0ZW1wbGF0ZUNvbnRlbnRzXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqKGRhdGV8dGltZSlcXHMqKChbKy1dXFxkKykoW3lxbXdkaHNdKSk/XFxzKig6Lis/KT99fS9naSwgKF8sIF90aW1lT3JEYXRlLCBjYWxjLCB0aW1lRGVsdGEsIHVuaXQsIG1vbWVudEZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gd2luZG93Lm1vbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBkYXRlLmNsb25lKCkuc2V0KHtcbiAgICAgICAgICAgICAgICBob3VyOiBub3cuZ2V0KFwiaG91clwiKSxcbiAgICAgICAgICAgICAgICBtaW51dGU6IG5vdy5nZXQoXCJtaW51dGVcIiksXG4gICAgICAgICAgICAgICAgc2Vjb25kOiBub3cuZ2V0KFwic2Vjb25kXCIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY2FsYykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlLmFkZChwYXJzZUludCh0aW1lRGVsdGEsIDEwKSwgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW9tZW50Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChtb21lbnRGb3JtYXQuc3Vic3RyaW5nKDEpLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqZGF0ZVxccyp9fS9naSwgZmlsZW5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGltZVxccyp9fS9naSwgd2luZG93Lm1vbWVudCgpLmZvcm1hdChcIkhIOm1tXCIpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpdGxlXFxzKn19L2dpLCBmaWxlbmFtZSkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB3aW5kb3cuYXBwLmZvbGRNYW5hZ2VyLnNhdmUoY3JlYXRlZEZpbGUsIElGb2xkSW5mbyk7XG4gICAgICAgIHJldHVybiBjcmVhdGVkRmlsZTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZpbGU6ICcke25vcm1hbGl6ZWRQYXRofSdgLCBlcnIpO1xuICAgICAgICBuZXcgb2JzaWRpYW4uTm90aWNlKFwiVW5hYmxlIHRvIGNyZWF0ZSBuZXcgZmlsZS5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0TW9udGhseU5vdGUoZGF0ZSwgbW9udGhseU5vdGVzKSB7XG4gICAgcmV0dXJuIG1vbnRobHlOb3Rlc1tnZXREYXRlVUlEKGRhdGUsIFwibW9udGhcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxNb250aGx5Tm90ZXMoKSB7XG4gICAgY29uc3QgbW9udGhseU5vdGVzID0ge307XG4gICAgaWYgKCFhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4gbW9udGhseU5vdGVzO1xuICAgIH1cbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgZm9sZGVyIH0gPSBnZXRNb250aGx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgbW9udGhseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCFtb250aGx5Tm90ZXNGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1vbnRobHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvcihcIkZhaWxlZCB0byBmaW5kIG1vbnRobHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4obW9udGhseU5vdGVzRm9sZGVyLCAobm90ZSkgPT4ge1xuICAgICAgICBpZiAobm90ZSBpbnN0YW5jZW9mIG9ic2lkaWFuLlRGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKG5vdGUsIFwibW9udGhcIik7XG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSBnZXREYXRlVUlEKGRhdGUsIFwibW9udGhcIik7XG4gICAgICAgICAgICAgICAgbW9udGhseU5vdGVzW2RhdGVTdHJpbmddID0gbm90ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtb250aGx5Tm90ZXM7XG59XG5cbmNsYXNzIFF1YXJ0ZXJseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRhaWx5LW5vdGVzIHBsdWdpblxuICogc28gaXQgd2lsbCByZXBsYWNlIHt7ZGF0ZX19LCB7e3RpdGxlfX0sIGFuZCB7e3RpbWV9fSB3aXRoIHRoZVxuICogZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAqXG4gKiBOb3RlOiBpdCBoYXMgYW4gYWRkZWQgYm9udXMgdGhhdCBpdCdzIG5vdCAndG9kYXknIHNwZWNpZmljLlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVRdWFydGVybHlOb3RlKGRhdGUpIHtcbiAgICBjb25zdCB7IHZhdWx0IH0gPSB3aW5kb3cuYXBwO1xuICAgIGNvbnN0IHsgdGVtcGxhdGUsIGZvcm1hdCwgZm9sZGVyIH0gPSBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3MoKTtcbiAgICBjb25zdCBbdGVtcGxhdGVDb250ZW50cywgSUZvbGRJbmZvXSA9IGF3YWl0IGdldFRlbXBsYXRlSW5mbyh0ZW1wbGF0ZSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBkYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gYXdhaXQgZ2V0Tm90ZVBhdGgoZm9sZGVyLCBmaWxlbmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm9ybWFsaXplZFBhdGgsIHRlbXBsYXRlQ29udGVudHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyooZGF0ZXx0aW1lKVxccyooKFsrLV1cXGQrKShbeXFtd2Roc10pKT9cXHMqKDouKz8pP319L2dpLCAoXywgX3RpbWVPckRhdGUsIGNhbGMsIHRpbWVEZWx0YSwgdW5pdCwgbW9tZW50Rm9ybWF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSB3aW5kb3cubW9tZW50KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGRhdGUuY2xvbmUoKS5zZXQoe1xuICAgICAgICAgICAgICAgIGhvdXI6IG5vdy5nZXQoXCJob3VyXCIpLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogbm93LmdldChcIm1pbnV0ZVwiKSxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6IG5vdy5nZXQoXCJzZWNvbmRcIiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjYWxjKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudERhdGUuYWRkKHBhcnNlSW50KHRpbWVEZWx0YSwgMTApLCB1bml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtb21lbnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGUuZm9ybWF0KG1vbWVudEZvcm1hdC5zdWJzdHJpbmcoMSkudHJpbSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccypkYXRlXFxzKn19L2dpLCBmaWxlbmFtZSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aW1lXFxzKn19L2dpLCB3aW5kb3cubW9tZW50KCkuZm9ybWF0KFwiSEg6bW1cIikpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tcXHMqdGl0bGVcXHMqfX0vZ2ksIGZpbGVuYW1lKSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHdpbmRvdy5hcHAuZm9sZE1hbmFnZXIuc2F2ZShjcmVhdGVkRmlsZSwgSUZvbGRJbmZvKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7bm9ybWFsaXplZFBhdGh9J2AsIGVycik7XG4gICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoXCJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRRdWFydGVybHlOb3RlKGRhdGUsIHF1YXJ0ZXJseSkge1xuICAgIHJldHVybiBxdWFydGVybHlbZ2V0RGF0ZVVJRChkYXRlLCBcInF1YXJ0ZXJcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxRdWFydGVybHlOb3RlcygpIHtcbiAgICBjb25zdCBxdWFydGVybHkgPSB7fTtcbiAgICBpZiAoIWFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHF1YXJ0ZXJseTtcbiAgICB9XG4gICAgY29uc3QgeyB2YXVsdCB9ID0gd2luZG93LmFwcDtcbiAgICBjb25zdCB7IGZvbGRlciB9ID0gZ2V0UXVhcnRlcmx5Tm90ZVNldHRpbmdzKCk7XG4gICAgY29uc3QgcXVhcnRlcmx5Rm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCFxdWFydGVybHlGb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFF1YXJ0ZXJseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yKFwiRmFpbGVkIHRvIGZpbmQgcXVhcnRlcmx5IG5vdGVzIGZvbGRlclwiKTtcbiAgICB9XG4gICAgb2JzaWRpYW4uVmF1bHQucmVjdXJzZUNoaWxkcmVuKHF1YXJ0ZXJseUZvbGRlciwgKG5vdGUpID0+IHtcbiAgICAgICAgaWYgKG5vdGUgaW5zdGFuY2VvZiBvYnNpZGlhbi5URmlsZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IGdldERhdGVGcm9tRmlsZShub3RlLCBcInF1YXJ0ZXJcIik7XG4gICAgICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVTdHJpbmcgPSBnZXREYXRlVUlEKGRhdGUsIFwicXVhcnRlclwiKTtcbiAgICAgICAgICAgICAgICBxdWFydGVybHlbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHF1YXJ0ZXJseTtcbn1cblxuY2xhc3MgWWVhcmx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgZGFpbHktbm90ZXMgcGx1Z2luXG4gKiBzbyBpdCB3aWxsIHJlcGxhY2Uge3tkYXRlfX0sIHt7dGl0bGV9fSwgYW5kIHt7dGltZX19IHdpdGggdGhlXG4gKiBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICpcbiAqIE5vdGU6IGl0IGhhcyBhbiBhZGRlZCBib251cyB0aGF0IGl0J3Mgbm90ICd0b2RheScgc3BlY2lmaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVllYXJseU5vdGUoZGF0ZSkge1xuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyB0ZW1wbGF0ZSwgZm9ybWF0LCBmb2xkZXIgfSA9IGdldFllYXJseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IFt0ZW1wbGF0ZUNvbnRlbnRzLCBJRm9sZEluZm9dID0gYXdhaXQgZ2V0VGVtcGxhdGVJbmZvKHRlbXBsYXRlKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGRhdGUuZm9ybWF0KGZvcm1hdCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBhd2FpdCBnZXROb3RlUGF0aChmb2xkZXIsIGZpbGVuYW1lKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShub3JtYWxpemVkUGF0aCwgdGVtcGxhdGVDb250ZW50c1xuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKihkYXRlfHRpbWUpXFxzKigoWystXVxcZCspKFt5cW13ZGhzXSkpP1xccyooOi4rPyk/fX0vZ2ksIChfLCBfdGltZU9yRGF0ZSwgY2FsYywgdGltZURlbHRhLCB1bml0LCBtb21lbnRGb3JtYXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IHdpbmRvdy5tb21lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZGF0ZS5jbG9uZSgpLnNldCh7XG4gICAgICAgICAgICAgICAgaG91cjogbm93LmdldChcImhvdXJcIiksXG4gICAgICAgICAgICAgICAgbWludXRlOiBub3cuZ2V0KFwibWludXRlXCIpLFxuICAgICAgICAgICAgICAgIHNlY29uZDogbm93LmdldChcInNlY29uZFwiKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGNhbGMpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS5hZGQocGFyc2VJbnQodGltZURlbHRhLCAxMCksIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vbWVudEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZS5mb3JtYXQobW9tZW50Rm9ybWF0LnN1YnN0cmluZygxKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKmRhdGVcXHMqfX0vZ2ksIGZpbGVuYW1lKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t7XFxzKnRpbWVcXHMqfX0vZ2ksIHdpbmRvdy5tb21lbnQoKS5mb3JtYXQoXCJISDptbVwiKSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97e1xccyp0aXRsZVxccyp9fS9naSwgZmlsZW5hbWUpKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgd2luZG93LmFwcC5mb2xkTWFuYWdlci5zYXZlKGNyZWF0ZWRGaWxlLCBJRm9sZEluZm8pO1xuICAgICAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtub3JtYWxpemVkUGF0aH0nYCwgZXJyKTtcbiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShcIlVuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFllYXJseU5vdGUoZGF0ZSwgeWVhcmx5Tm90ZXMpIHtcbiAgICByZXR1cm4geWVhcmx5Tm90ZXNbZ2V0RGF0ZVVJRChkYXRlLCBcInllYXJcIildID8/IG51bGw7XG59XG5mdW5jdGlvbiBnZXRBbGxZZWFybHlOb3RlcygpIHtcbiAgICBjb25zdCB5ZWFybHlOb3RlcyA9IHt9O1xuICAgIGlmICghYXBwSGFzWWVhcmx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSkge1xuICAgICAgICByZXR1cm4geWVhcmx5Tm90ZXM7XG4gICAgfVxuICAgIGNvbnN0IHsgdmF1bHQgfSA9IHdpbmRvdy5hcHA7XG4gICAgY29uc3QgeyBmb2xkZXIgfSA9IGdldFllYXJseU5vdGVTZXR0aW5ncygpO1xuICAgIGNvbnN0IHllYXJseU5vdGVzRm9sZGVyID0gdmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKG9ic2lkaWFuLm5vcm1hbGl6ZVBhdGgoZm9sZGVyKSk7XG4gICAgaWYgKCF5ZWFybHlOb3Rlc0ZvbGRlcikge1xuICAgICAgICB0aHJvdyBuZXcgWWVhcmx5Tm90ZXNGb2xkZXJNaXNzaW5nRXJyb3IoXCJGYWlsZWQgdG8gZmluZCB5ZWFybHkgbm90ZXMgZm9sZGVyXCIpO1xuICAgIH1cbiAgICBvYnNpZGlhbi5WYXVsdC5yZWN1cnNlQ2hpbGRyZW4oeWVhcmx5Tm90ZXNGb2xkZXIsIChub3RlKSA9PiB7XG4gICAgICAgIGlmIChub3RlIGluc3RhbmNlb2Ygb2JzaWRpYW4uVEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBnZXREYXRlRnJvbUZpbGUobm90ZSwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RyaW5nID0gZ2V0RGF0ZVVJRChkYXRlLCBcInllYXJcIik7XG4gICAgICAgICAgICAgICAgeWVhcmx5Tm90ZXNbZGF0ZVN0cmluZ10gPSBub3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHllYXJseU5vdGVzO1xufVxuXG5mdW5jdGlvbiBhcHBIYXNEYWlseU5vdGVzUGx1Z2luTG9hZGVkKCkge1xuICAgIGNvbnN0IHsgYXBwIH0gPSB3aW5kb3c7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBkYWlseU5vdGVzUGx1Z2luID0gYXBwLmludGVybmFsUGx1Z2lucy5wbHVnaW5zW1wiZGFpbHktbm90ZXNcIl07XG4gICAgaWYgKGRhaWx5Tm90ZXNQbHVnaW4gJiYgZGFpbHlOb3Rlc1BsdWdpbi5lbmFibGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5kYWlseT8uZW5hYmxlZDtcbn1cbi8qKlxuICogWFhYOiBcIldlZWtseSBOb3Rlc1wiIGxpdmUgaW4gZWl0aGVyIHRoZSBDYWxlbmRhciBwbHVnaW4gb3IgdGhlIHBlcmlvZGljLW5vdGVzIHBsdWdpbi5cbiAqIENoZWNrIGJvdGggdW50aWwgdGhlIHdlZWtseSBub3RlcyBmZWF0dXJlIGlzIHJlbW92ZWQgZnJvbSB0aGUgQ2FsZW5kYXIgcGx1Z2luLlxuICovXG5mdW5jdGlvbiBhcHBIYXNXZWVrbHlOb3Rlc1BsdWdpbkxvYWRlZCgpIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gd2luZG93O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKGFwcC5wbHVnaW5zLmdldFBsdWdpbihcImNhbGVuZGFyXCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy53ZWVrbHk/LmVuYWJsZWQ7XG59XG5mdW5jdGlvbiBhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5tb250aGx5Py5lbmFibGVkO1xufVxuZnVuY3Rpb24gYXBwSGFzUXVhcnRlcmx5Tm90ZXNQbHVnaW5Mb2FkZWQoKSB7XG4gICAgY29uc3QgeyBhcHAgfSA9IHdpbmRvdztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHBlcmlvZGljTm90ZXMgPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oXCJwZXJpb2RpYy1ub3Rlc1wiKTtcbiAgICByZXR1cm4gcGVyaW9kaWNOb3RlcyAmJiBwZXJpb2RpY05vdGVzLnNldHRpbmdzPy5xdWFydGVybHk/LmVuYWJsZWQ7XG59XG5mdW5jdGlvbiBhcHBIYXNZZWFybHlOb3Rlc1BsdWdpbkxvYWRlZCgpIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gd2luZG93O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcGVyaW9kaWNOb3RlcyA9IGFwcC5wbHVnaW5zLmdldFBsdWdpbihcInBlcmlvZGljLW5vdGVzXCIpO1xuICAgIHJldHVybiBwZXJpb2RpY05vdGVzICYmIHBlcmlvZGljTm90ZXMuc2V0dGluZ3M/LnllYXJseT8uZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGdldFBlcmlvZGljTm90ZVNldHRpbmdzKGdyYW51bGFyaXR5KSB7XG4gICAgY29uc3QgZ2V0U2V0dGluZ3MgPSB7XG4gICAgICAgIGRheTogZ2V0RGFpbHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHdlZWs6IGdldFdlZWtseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgbW9udGg6IGdldE1vbnRobHlOb3RlU2V0dGluZ3MsXG4gICAgICAgIHF1YXJ0ZXI6IGdldFF1YXJ0ZXJseU5vdGVTZXR0aW5ncyxcbiAgICAgICAgeWVhcjogZ2V0WWVhcmx5Tm90ZVNldHRpbmdzLFxuICAgIH1bZ3JhbnVsYXJpdHldO1xuICAgIHJldHVybiBnZXRTZXR0aW5ncygpO1xufVxuZnVuY3Rpb24gY3JlYXRlUGVyaW9kaWNOb3RlKGdyYW51bGFyaXR5LCBkYXRlKSB7XG4gICAgY29uc3QgY3JlYXRlRm4gPSB7XG4gICAgICAgIGRheTogY3JlYXRlRGFpbHlOb3RlLFxuICAgICAgICBtb250aDogY3JlYXRlTW9udGhseU5vdGUsXG4gICAgICAgIHdlZWs6IGNyZWF0ZVdlZWtseU5vdGUsXG4gICAgfTtcbiAgICByZXR1cm4gY3JlYXRlRm5bZ3JhbnVsYXJpdHldKGRhdGUpO1xufVxuXG5leHBvcnRzLkRFRkFVTFRfREFJTFlfTk9URV9GT1JNQVQgPSBERUZBVUxUX0RBSUxZX05PVEVfRk9STUFUO1xuZXhwb3J0cy5ERUZBVUxUX01PTlRITFlfTk9URV9GT1JNQVQgPSBERUZBVUxUX01PTlRITFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfUVVBUlRFUkxZX05PVEVfRk9STUFUID0gREVGQVVMVF9RVUFSVEVSTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfV0VFS0xZX05PVEVfRk9STUFUID0gREVGQVVMVF9XRUVLTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLkRFRkFVTFRfWUVBUkxZX05PVEVfRk9STUFUID0gREVGQVVMVF9ZRUFSTFlfTk9URV9GT1JNQVQ7XG5leHBvcnRzLmFwcEhhc0RhaWx5Tm90ZXNQbHVnaW5Mb2FkZWQgPSBhcHBIYXNEYWlseU5vdGVzUGx1Z2luTG9hZGVkO1xuZXhwb3J0cy5hcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQgPSBhcHBIYXNNb250aGx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1F1YXJ0ZXJseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzUXVhcnRlcmx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1dlZWtseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzV2Vla2x5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmFwcEhhc1llYXJseU5vdGVzUGx1Z2luTG9hZGVkID0gYXBwSGFzWWVhcmx5Tm90ZXNQbHVnaW5Mb2FkZWQ7XG5leHBvcnRzLmNyZWF0ZURhaWx5Tm90ZSA9IGNyZWF0ZURhaWx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlTW9udGhseU5vdGUgPSBjcmVhdGVNb250aGx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlUGVyaW9kaWNOb3RlID0gY3JlYXRlUGVyaW9kaWNOb3RlO1xuZXhwb3J0cy5jcmVhdGVRdWFydGVybHlOb3RlID0gY3JlYXRlUXVhcnRlcmx5Tm90ZTtcbmV4cG9ydHMuY3JlYXRlV2Vla2x5Tm90ZSA9IGNyZWF0ZVdlZWtseU5vdGU7XG5leHBvcnRzLmNyZWF0ZVllYXJseU5vdGUgPSBjcmVhdGVZZWFybHlOb3RlO1xuZXhwb3J0cy5nZXRBbGxEYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcztcbmV4cG9ydHMuZ2V0QWxsTW9udGhseU5vdGVzID0gZ2V0QWxsTW9udGhseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxRdWFydGVybHlOb3RlcyA9IGdldEFsbFF1YXJ0ZXJseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxXZWVrbHlOb3RlcyA9IGdldEFsbFdlZWtseU5vdGVzO1xuZXhwb3J0cy5nZXRBbGxZZWFybHlOb3RlcyA9IGdldEFsbFllYXJseU5vdGVzO1xuZXhwb3J0cy5nZXREYWlseU5vdGUgPSBnZXREYWlseU5vdGU7XG5leHBvcnRzLmdldERhaWx5Tm90ZVNldHRpbmdzID0gZ2V0RGFpbHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldERhdGVGcm9tRmlsZSA9IGdldERhdGVGcm9tRmlsZTtcbmV4cG9ydHMuZ2V0RGF0ZUZyb21QYXRoID0gZ2V0RGF0ZUZyb21QYXRoO1xuZXhwb3J0cy5nZXREYXRlVUlEID0gZ2V0RGF0ZVVJRDtcbmV4cG9ydHMuZ2V0TW9udGhseU5vdGUgPSBnZXRNb250aGx5Tm90ZTtcbmV4cG9ydHMuZ2V0TW9udGhseU5vdGVTZXR0aW5ncyA9IGdldE1vbnRobHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFBlcmlvZGljTm90ZVNldHRpbmdzID0gZ2V0UGVyaW9kaWNOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFF1YXJ0ZXJseU5vdGUgPSBnZXRRdWFydGVybHlOb3RlO1xuZXhwb3J0cy5nZXRRdWFydGVybHlOb3RlU2V0dGluZ3MgPSBnZXRRdWFydGVybHlOb3RlU2V0dGluZ3M7XG5leHBvcnRzLmdldFRlbXBsYXRlSW5mbyA9IGdldFRlbXBsYXRlSW5mbztcbmV4cG9ydHMuZ2V0V2Vla2x5Tm90ZSA9IGdldFdlZWtseU5vdGU7XG5leHBvcnRzLmdldFdlZWtseU5vdGVTZXR0aW5ncyA9IGdldFdlZWtseU5vdGVTZXR0aW5ncztcbmV4cG9ydHMuZ2V0WWVhcmx5Tm90ZSA9IGdldFllYXJseU5vdGU7XG5leHBvcnRzLmdldFllYXJseU5vdGVTZXR0aW5ncyA9IGdldFllYXJseU5vdGVTZXR0aW5ncztcbiIsImltcG9ydCB7QXBwLCBURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtnZXRBbGxEYWlseU5vdGVzfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlIHtcbiAgZGFpbHlOb3RlczogUmVjb3JkPHN0cmluZywgVEZpbGU+O1xuICBhcHA6IEFwcDtcbn1cblxuaW50ZXJmYWNlIFNldERhaWx5Tm90ZXNBY3Rpb24ge1xuICB0eXBlOiAnU0VUX0RBSUxZTk9URVMnO1xuICBwYXlsb2FkOiB7XG4gICAgZGFpbHlOb3RlczogUmVjb3JkPHN0cmluZywgVEZpbGU+O1xuICB9O1xufVxuXG5pbnRlcmZhY2UgU2V0T2JzaWRpYW5BcHBBY3Rpb24ge1xuICB0eXBlOiAnU0VUX0FQUCc7XG4gIHBheWxvYWQ6IHtcbiAgICBhcHA6IEFwcDtcbiAgfTtcbn1cblxuLy8gaW50ZXJmYWNlIEluc2VydERhaWx5Tm90ZUFjdGlvbiB7XG4vLyAgIHR5cGU6IFwiSU5TRVJUX0RBSUxZTk9URVwiO1xuLy8gICBwYXlsb2FkOiB7XG4vLyAgICAgZGFpbHlOb3RlOiBURmlsZTtcbi8vICAgfTtcbi8vIH1cblxuZXhwb3J0IHR5cGUgQWN0aW9ucyA9IFNldERhaWx5Tm90ZXNBY3Rpb24gfCBTZXRPYnNpZGlhbkFwcEFjdGlvbjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGU6IFN0YXRlLCBhY3Rpb246IEFjdGlvbnMpOiBTdGF0ZSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlICdTRVRfREFJTFlOT1RFUyc6IHtcbiAgICAgIGNvbnN0IGRhaWx5Tm90ZXMgPSBnZXRBbGxEYWlseU5vdGVzKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBkYWlseU5vdGVzOiBkYWlseU5vdGVzLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnU0VUX0FQUCc6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBhcHA6IGFjdGlvbi5wYXlsb2FkLmFwcCxcbiAgICAgIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRTdGF0ZTogU3RhdGUgPSB7XG4gIGRhaWx5Tm90ZXM6IG51bGwsXG4gIGFwcDogbnVsbCxcbn07XG4iLCJpbXBvcnQgY29tYmluZVJlZHVjZXJzIGZyb20gJy4uL2xhYnMvY29tYmluZVJlZHVjZXJzJztcbmltcG9ydCBjcmVhdGVTdG9yZSBmcm9tICcuLi9sYWJzL2NyZWF0ZVN0b3JlJztcbmltcG9ydCAqIGFzIGdsb2JhbFN0b3JlIGZyb20gJy4vZ2xvYmFsU3RhdGVTdG9yZSc7XG5pbXBvcnQgKiBhcyBsb2NhdGlvblN0b3JlIGZyb20gJy4vbG9jYXRpb25TdG9yZSc7XG5pbXBvcnQgKiBhcyBtZW1vU3RvcmUgZnJvbSAnLi9tZW1vU3RvcmUnO1xuaW1wb3J0ICogYXMgdXNlclN0b3JlIGZyb20gJy4vdXNlclN0b3JlJztcbmltcG9ydCAqIGFzIHF1ZXJ5U3RvcmUgZnJvbSAnLi9xdWVyeVN0b3JlJztcbmltcG9ydCAqIGFzIGRhaWx5Tm90ZXNTdG9yZSBmcm9tICcuL2RhaWx5Tm90ZXNTdG9yZSc7XG5cbmludGVyZmFjZSBBcHBTdGF0ZSB7XG4gIGdsb2JhbFN0YXRlOiBnbG9iYWxTdG9yZS5TdGF0ZTtcbiAgbG9jYXRpb25TdGF0ZTogbG9jYXRpb25TdG9yZS5TdGF0ZTtcbiAgbWVtb1N0YXRlOiBtZW1vU3RvcmUuU3RhdGU7XG4gIHVzZXJTdGF0ZTogdXNlclN0b3JlLlN0YXRlO1xuICBxdWVyeVN0YXRlOiBxdWVyeVN0b3JlLlN0YXRlO1xuICBkYWlseU5vdGVzU3RhdGU6IGRhaWx5Tm90ZXNTdG9yZS5TdGF0ZTtcbn1cblxudHlwZSBBcHBTdGF0ZUFjdGlvbnMgPVxuICB8IGdsb2JhbFN0b3JlLkFjdGlvbnNcbiAgfCBsb2NhdGlvblN0b3JlLkFjdGlvbnNcbiAgfCBtZW1vU3RvcmUuQWN0aW9uc1xuICB8IHVzZXJTdG9yZS5BY3Rpb25zXG4gIHwgcXVlcnlTdG9yZS5BY3Rpb25zXG4gIHwgZGFpbHlOb3Rlc1N0b3JlLkFjdGlvbnM7XG5cbmNvbnN0IGFwcFN0b3JlID0gY3JlYXRlU3RvcmU8QXBwU3RhdGUsIEFwcFN0YXRlQWN0aW9ucz4oXG4gIHtcbiAgICBnbG9iYWxTdGF0ZTogZ2xvYmFsU3RvcmUuZGVmYXVsdFN0YXRlLFxuICAgIGxvY2F0aW9uU3RhdGU6IGxvY2F0aW9uU3RvcmUuZGVmYXVsdFN0YXRlLFxuICAgIG1lbW9TdGF0ZTogbWVtb1N0b3JlLmRlZmF1bHRTdGF0ZSxcbiAgICB1c2VyU3RhdGU6IHVzZXJTdG9yZS5kZWZhdWx0U3RhdGUsXG4gICAgcXVlcnlTdGF0ZTogcXVlcnlTdG9yZS5kZWZhdWx0U3RhdGUsXG4gICAgZGFpbHlOb3Rlc1N0YXRlOiBkYWlseU5vdGVzU3RvcmUuZGVmYXVsdFN0YXRlLFxuICB9LFxuICBjb21iaW5lUmVkdWNlcnM8QXBwU3RhdGUsIEFwcFN0YXRlQWN0aW9ucz4oe1xuICAgIGdsb2JhbFN0YXRlOiBnbG9iYWxTdG9yZS5yZWR1Y2VyLFxuICAgIGxvY2F0aW9uU3RhdGU6IGxvY2F0aW9uU3RvcmUucmVkdWNlcixcbiAgICBtZW1vU3RhdGU6IG1lbW9TdG9yZS5yZWR1Y2VyLFxuICAgIHVzZXJTdGF0ZTogdXNlclN0b3JlLnJlZHVjZXIsXG4gICAgcXVlcnlTdGF0ZTogcXVlcnlTdG9yZS5yZWR1Y2VyLFxuICAgIGRhaWx5Tm90ZXNTdGF0ZTogZGFpbHlOb3Rlc1N0b3JlLnJlZHVjZXIsXG4gIH0pLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgYXBwU3RvcmU7XG4iLCJpbXBvcnQge2NyZWF0ZUNvbnRleHR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuL2FwcFN0b3JlJztcblxuY29uc3QgYXBwQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoYXBwU3RvcmUuZ2V0U3RhdGUoKSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFwcENvbnRleHQ7XG4iLCIvLyBpbXBvcnQgeyBtb21lbnQgfSBmcm9tICdvYnNpZGlhbic7XG4vLyBpbXBvcnQgdXNlclNlcnZpY2UgZnJvbSBcIi4vdXNlclNlcnZpY2VcIjtcbi8vIGltcG9ydCBhcGkgZnJvbSBcIi4uL2hlbHBlcnMvYXBpXCI7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcbmltcG9ydCB7Z2V0QWxsRGFpbHlOb3RlcywgZ2V0RGFpbHlOb3RlfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xuaW1wb3J0IHtBcHAsIFRGaWxlfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge01vbWVudH0gZnJvbSAnX29ic2lkaWFuQDAuMTMuMTFAb2JzaWRpYW4vbm9kZV9tb2R1bGVzL21vbWVudCc7XG4vLyBpbXBvcnQgeyBNb21lbnR9ICBmcm9tIFwib2JzaWRpYW5cIjtcblxuY2xhc3MgRGFpbHlOb3Rlc1NlcnZpY2Uge1xuICBwdWJsaWMgZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlO1xuICB9XG5cbiAgcHVibGljIGdldEFwcChhcHA6IEFwcCkge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfQVBQJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgYXBwLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gYXBwO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldE15QWxsRGFpbHlOb3RlcygpIHtcbiAgICBjb25zdCBkYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcygpO1xuXG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9EQUlMWU5PVEVTJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgZGFpbHlOb3RlcyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGRhaWx5Tm90ZXM7XG4gIH1cblxuICAvLyBwdWJsaWMgcHVzaERhaWx5Tm90ZShkYWlseU5vdGU6IFRGaWxlKSB7XG4gIC8vICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAvLyAgICAgdHlwZTogXCJJTlNFUlRfREFJTFlOT1RFXCIsXG4gIC8vICAgICBwYXlsb2FkOiB7XG4gIC8vICAgICAgIG1lbW86IHtcbiAgLy8gICAgICAgICAuLi5tZW1vLFxuICAvLyAgICAgICB9LFxuICAvLyAgICAgfSxcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREYWlseU5vdGVCeU1lbW8oZGF0ZTogTW9tZW50KTogUHJvbWlzZTxURmlsZT4ge1xuICAgIGNvbnN0IHtkYWlseU5vdGVzfSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBkYWlseU5vdGUgPSBnZXREYWlseU5vdGUoZGF0ZSwgZGFpbHlOb3Rlcyk7XG4gICAgcmV0dXJuIGRhaWx5Tm90ZTtcbiAgfVxufVxuXG5jb25zdCBkYWlseU5vdGVzU2VydmljZSA9IG5ldyBEYWlseU5vdGVzU2VydmljZSgpO1xuXG5leHBvcnQgZGVmYXVsdCBkYWlseU5vdGVzU2VydmljZTtcbiIsImltcG9ydCB7SW5wdXRBY3Rpb259IGZyb20gJ3RpbnktdW5kbyc7XG5cbi8qKlxuICogRGVmaW5lIHN0b3JhZ2UgZGF0YSB0eXBlXG4gKi9cbmludGVyZmFjZSBTdG9yYWdlRGF0YSB7XG4gIC8vIOe8lui+keWZqOi+k+WFpee8k+WtmOWGheWuuVxuICBlZGl0b3JDb250ZW50Q2FjaGU6IHN0cmluZztcbiAgLy8g5YiG6K+N5byA5YWzXG4gIHNob3VsZFNwbGl0TWVtb1dvcmQ6IGJvb2xlYW47XG4gIC8vIOaYr+WQpumakOiXj+WbvueJh+mTvuaOpeWcsOWdgFxuICBzaG91bGRIaWRlSW1hZ2VVcmw6IGJvb2xlYW47XG4gIC8vIG1hcmtkb3duIOino+aekOW8gOWFs1xuICBzaG91bGRVc2VNYXJrZG93blBhcnNlcjogYm9vbGVhbjtcblxuICAvLyBFZGl0b3Igc2V0dGluZ1xuICB1c2VUaW55VW5kb0hpc3RvcnlDYWNoZTogYm9vbGVhbjtcblxuICAvLyB0aW55IHVuZG8gYWN0aW9ucyBjYWNoZVxuICB0aW55VW5kb0FjdGlvbnNDYWNoZTogSW5wdXRBY3Rpb25bXTtcbiAgLy8gdGlueSB1bmRvIGluZGV4IGNhY2hlXG4gIHRpbnlVbmRvSW5kZXhDYWNoZTogbnVtYmVyO1xufVxuXG50eXBlIFN0b3JhZ2VLZXkgPSBrZXlvZiBTdG9yYWdlRGF0YTtcblxuLyoqXG4gKiBzdG9yYWdlIGhlbHBlclxuICovXG5leHBvcnQgbmFtZXNwYWNlIHN0b3JhZ2Uge1xuICBleHBvcnQgZnVuY3Rpb24gZ2V0KGtleXM6IFN0b3JhZ2VLZXlbXSk6IFBhcnRpYWw8U3RvcmFnZURhdGE+IHtcbiAgICBjb25zdCBkYXRhOiBQYXJ0aWFsPFN0b3JhZ2VEYXRhPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RyaW5naWZ5VmFsdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICBpZiAoc3RyaW5naWZ5VmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSBKU09OLnBhcnNlKHN0cmluZ2lmeVZhbHVlKTtcbiAgICAgICAgICBkYXRhW2tleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignR2V0IHN0b3JhZ2UgZmFpbGVkIGluICcsIGtleSwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHNldChkYXRhOiBQYXJ0aWFsPFN0b3JhZ2VEYXRhPikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ2lmeVZhbHVlID0gSlNPTi5zdHJpbmdpZnkoZGF0YVtrZXkgYXMgU3RvcmFnZUtleV0pO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHN0cmluZ2lmeVZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignU2F2ZSBzdG9yYWdlIGZhaWxlZCBpbiAnLCBrZXksIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gcmVtb3ZlKGtleXM6IFN0b3JhZ2VLZXlbXSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlbW92ZSBzdG9yYWdlIGZhaWxlZCBpbiAnLCBrZXksIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW1pdFN0b3JhZ2VDaGFuZ2VkRXZlbnQoKSB7XG4gICAgY29uc3QgaWZyYW1lRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICBpZnJhbWVFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZyYW1lRWwpO1xuXG4gICAgaWZyYW1lRWwuY29udGVudFdpbmRvdz8ubG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3QnLCBEYXRlLm5vdygpLnRvU3RyaW5nKCkpO1xuICAgIGlmcmFtZUVsLnJlbW92ZSgpO1xuICB9XG59XG4iLCJpbXBvcnQge3N0b3JhZ2V9IGZyb20gJy4uL2hlbHBlcnMvc3RvcmFnZSc7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcbmltcG9ydCB7QXBwU2V0dGluZ30gZnJvbSAnLi4vc3RvcmVzL2dsb2JhbFN0YXRlU3RvcmUnO1xuXG5jbGFzcyBHbG9iYWxTdGF0ZVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBjYWNoZWRTZXR0aW5nID0gc3RvcmFnZS5nZXQoW1xuICAgICAgJ3Nob3VsZFNwbGl0TWVtb1dvcmQnLFxuICAgICAgJ3Nob3VsZEhpZGVJbWFnZVVybCcsXG4gICAgICAnc2hvdWxkVXNlTWFya2Rvd25QYXJzZXInLFxuICAgICAgJ3VzZVRpbnlVbmRvSGlzdG9yeUNhY2hlJyxcbiAgICBdKTtcbiAgICBjb25zdCBkZWZhdWx0QXBwU2V0dGluZyA9IHtcbiAgICAgIHNob3VsZFNwbGl0TWVtb1dvcmQ6IGNhY2hlZFNldHRpbmcuc2hvdWxkU3BsaXRNZW1vV29yZCA/PyB0cnVlLFxuICAgICAgc2hvdWxkSGlkZUltYWdlVXJsOiBjYWNoZWRTZXR0aW5nLnNob3VsZEhpZGVJbWFnZVVybCA/PyB0cnVlLFxuICAgICAgc2hvdWxkVXNlTWFya2Rvd25QYXJzZXI6IGNhY2hlZFNldHRpbmcuc2hvdWxkVXNlTWFya2Rvd25QYXJzZXIgPz8gdHJ1ZSxcbiAgICAgIHVzZVRpbnlVbmRvSGlzdG9yeUNhY2hlOiBjYWNoZWRTZXR0aW5nLnVzZVRpbnlVbmRvSGlzdG9yeUNhY2hlID8/IGZhbHNlLFxuICAgIH07XG5cbiAgICB0aGlzLnNldEFwcFNldHRpbmcoZGVmYXVsdEFwcFNldHRpbmcpO1xuICB9XG5cbiAgcHVibGljIGdldFN0YXRlID0gKCkgPT4ge1xuICAgIHJldHVybiBhcHBTdG9yZS5nZXRTdGF0ZSgpLmdsb2JhbFN0YXRlO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRFZGl0TWVtb0lkID0gKGVkaXRNZW1vSWQ6IHN0cmluZykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfRURJVF9NRU1PX0lEJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgZWRpdE1lbW9JZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgcHVibGljIHNldE1hcmtNZW1vSWQgPSAobWFya01lbW9JZDogc3RyaW5nKSA9PiB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9NQVJLX01FTU9fSUQnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBtYXJrTWVtb0lkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcblxuICBwdWJsaWMgc2V0SXNNb2JpbGVWaWV3ID0gKGlzTW9iaWxlVmlldzogYm9vbGVhbikgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfTU9CSUxFX1ZJRVcnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBpc01vYmlsZVZpZXcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRTaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcgPSAoc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3OiBib29sZWFuKSA9PiB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9TSE9XX1NJREVCQVJfSU5fTU9CSUxFX1ZJRVcnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBzaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRBcHBTZXR0aW5nID0gKGFwcFNldHRpbmc6IFBhcnRpYWw8QXBwU2V0dGluZz4pID0+IHtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX0FQUF9TRVRUSU5HJyxcbiAgICAgIHBheWxvYWQ6IGFwcFNldHRpbmcsXG4gICAgfSk7XG4gICAgc3RvcmFnZS5zZXQoYXBwU2V0dGluZyk7XG4gIH07XG59XG5cbmNvbnN0IGdsb2JhbFN0YXRlU2VydmljZSA9IG5ldyBHbG9iYWxTdGF0ZVNlcnZpY2UoKTtcblxuZXhwb3J0IGRlZmF1bHQgZ2xvYmFsU3RhdGVTZXJ2aWNlO1xuIiwiLy8gaW1wb3J0IHV0aWxzIGZyb20gXCIuLi9oZWxwZXJzL3V0aWxzXCI7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcblxuLy8gY29uc3QgdXBkYXRlTG9jYXRpb25VcmwgPSAobWV0aG9kOiBcInJlcGxhY2VcIiB8IFwicHVzaFwiID0gXCJyZXBsYWNlXCIpID0+IHtcbi8vICAgY29uc3QgeyBxdWVyeSwgcGF0aG5hbWUsIGhhc2ggfSA9IGFwcFN0b3JlLmdldFN0YXRlKCkubG9jYXRpb25TdGF0ZTtcbi8vICAgbGV0IHF1ZXJ5U3RyaW5nID0gdXRpbHMudHJhbnNmb3JtT2JqZWN0VG9QYXJhbXNTdHJpbmcocXVlcnkpO1xuLy8gICBpZiAocXVlcnlTdHJpbmcpIHtcbi8vICAgICBxdWVyeVN0cmluZyA9IFwiP1wiICsgcXVlcnlTdHJpbmc7XG4vLyAgIH0gZWxzZSB7XG4vLyAgICAgcXVlcnlTdHJpbmcgPSBcIlwiO1xuLy8gICB9XG5cbi8vICAgaWYgKG1ldGhvZCA9PT0gXCJyZXBsYWNlXCIpIHtcbi8vICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgXCJcIiwgcGF0aG5hbWUgKyBoYXNoICsgcXVlcnlTdHJpbmcpO1xuLy8gICB9IGVsc2Uge1xuLy8gICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBcIlwiLCBwYXRobmFtZSArIGhhc2ggKyBxdWVyeVN0cmluZyk7XG4vLyAgIH1cbi8vIH07XG5cbmNsYXNzIExvY2F0aW9uU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudXBkYXRlU3RhdGVXaXRoTG9jYXRpb24oKTtcbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlU3RhdGVXaXRoTG9jYXRpb24oKTtcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVN0YXRlV2l0aExvY2F0aW9uID0gKCkgPT4ge1xuICAgIGNvbnN0IHtwYXRobmFtZSwgc2VhcmNoLCBoYXNofSA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHNlYXJjaCk7XG4gICAgY29uc3Qgc3RhdGU6IEFwcExvY2F0aW9uID0ge1xuICAgICAgcGF0aG5hbWU6ICcvJyxcbiAgICAgIGhhc2g6ICcnLFxuICAgICAgcXVlcnk6IHtcbiAgICAgICAgdGFnOiAnJyxcbiAgICAgICAgZHVyYXRpb246IG51bGwsXG4gICAgICAgIHRleHQ6ICcnLFxuICAgICAgICB0eXBlOiAnJyxcbiAgICAgICAgZmlsdGVyOiAnJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBzdGF0ZS5xdWVyeS50YWcgPSB1cmxQYXJhbXMuZ2V0KCd0YWcnKSA/PyAnJztcbiAgICBzdGF0ZS5xdWVyeS50eXBlID0gKHVybFBhcmFtcy5nZXQoJ3R5cGUnKSA/PyAnJykgYXMgTWVtb1NwZWNUeXBlO1xuICAgIHN0YXRlLnF1ZXJ5LnRleHQgPSB1cmxQYXJhbXMuZ2V0KCd0ZXh0JykgPz8gJyc7XG4gICAgc3RhdGUucXVlcnkuZmlsdGVyID0gdXJsUGFyYW1zLmdldCgnZmlsdGVyJykgPz8gJyc7XG4gICAgY29uc3QgZnJvbSA9IHBhcnNlSW50KHVybFBhcmFtcy5nZXQoJ2Zyb20nKSA/PyAnMCcpO1xuICAgIGNvbnN0IHRvID0gcGFyc2VJbnQodXJsUGFyYW1zLmdldCgndG8nKSA/PyAnMCcpO1xuICAgIGlmICh0byA+IGZyb20gJiYgdG8gIT09IDApIHtcbiAgICAgIHN0YXRlLnF1ZXJ5LmR1cmF0aW9uID0ge1xuICAgICAgICBmcm9tLFxuICAgICAgICB0byxcbiAgICAgIH07XG4gICAgfVxuICAgIHN0YXRlLmhhc2ggPSBoYXNoO1xuICAgIHN0YXRlLnBhdGhuYW1lID0gdGhpcy5nZXRWYWxpZFBhdGhuYW1lKHBhdGhuYW1lKTtcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnU0VUX0xPQ0FUSU9OJyxcbiAgICAgIHBheWxvYWQ6IHN0YXRlLFxuICAgIH0pO1xuICB9O1xuXG4gIHB1YmxpYyBnZXRTdGF0ZSA9ICgpID0+IHtcbiAgICByZXR1cm4gYXBwU3RvcmUuZ2V0U3RhdGUoKS5sb2NhdGlvblN0YXRlO1xuICB9O1xuXG4gIHB1YmxpYyBjbGVhclF1ZXJ5ID0gKCkgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfUVVFUlknLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICB0YWc6ICcnLFxuICAgICAgICBkdXJhdGlvbjogbnVsbCxcbiAgICAgICAgdGV4dDogJycsXG4gICAgICAgIHR5cGU6ICcnLFxuICAgICAgICBmaWx0ZXI6ICcnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZUxvY2F0aW9uVXJsKCk7XG4gIH07XG5cbiAgcHVibGljIHNldFF1ZXJ5ID0gKHF1ZXJ5OiBRdWVyeSkgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfUVVFUlknLFxuICAgICAgcGF5bG9hZDogcXVlcnksXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybCgpO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRIYXNoID0gKGhhc2g6IHN0cmluZykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfSEFTSCcsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGhhc2gsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlTG9jYXRpb25VcmwoKTtcbiAgfTtcblxuICBwdWJsaWMgc2V0UGF0aG5hbWUgPSAocGF0aG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfUEFUSE5BTUUnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBwYXRobmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybCgpO1xuICB9O1xuXG4gIHB1YmxpYyBwdXNoSGlzdG9yeSA9IChwYXRobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9QQVRITkFNRScsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIHBhdGhuYW1lLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZUxvY2F0aW9uVXJsKFwicHVzaFwiKTtcbiAgfTtcblxuICBwdWJsaWMgcmVwbGFjZUhpc3RvcnkgPSAocGF0aG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfUEFUSE5BTUUnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBwYXRobmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybChcInJlcGxhY2VcIik7XG4gIH07XG5cbiAgcHVibGljIHNldE1lbW9UeXBlUXVlcnkgPSAodHlwZTogTWVtb1NwZWNUeXBlIHwgJycgPSAnJykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfVFlQRScsXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIHR5cGUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlTG9jYXRpb25VcmwoKTtcbiAgfTtcblxuICBwdWJsaWMgc2V0TWVtb0ZpbHRlciA9IChmaWx0ZXJJZDogc3RyaW5nKSA9PiB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9RVUVSWV9GSUxURVInLFxuICAgICAgcGF5bG9hZDogZmlsdGVySWQsXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybCgpO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRUZXh0UXVlcnkgPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9URVhUJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgdGV4dCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybCgpO1xuICB9O1xuXG4gIHB1YmxpYyBzZXRUYWdRdWVyeSA9ICh0YWc6IHN0cmluZykgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfVEFHX1FVRVJZJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgdGFnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZUxvY2F0aW9uVXJsKCk7XG4gIH07XG5cbiAgcHVibGljIHNldEZyb21BbmRUb1F1ZXJ5ID0gKGZyb206IG51bWJlciwgdG86IG51bWJlcikgPT4ge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdTRVRfRFVSQVRJT05fUVVFUlknLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBkdXJhdGlvbjoge2Zyb20sIHRvfSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVMb2NhdGlvblVybCgpO1xuICB9O1xuXG4gIHB1YmxpYyBnZXRWYWxpZFBhdGhuYW1lID0gKHBhdGhuYW1lOiBzdHJpbmcpOiBBcHBSb3V0ZXIgPT4ge1xuICAgIGlmIChbJy8nLCAnL3JlY3ljbGUnLCAnL3NldHRpbmcnXS5pbmNsdWRlcyhwYXRobmFtZSkpIHtcbiAgICAgIHJldHVybiBwYXRobmFtZSBhcyBBcHBSb3V0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnLyc7XG4gICAgfVxuICB9O1xufVxuXG5jb25zdCBsb2NhdGlvblNlcnZpY2UgPSBuZXcgTG9jYXRpb25TZXJ2aWNlKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGxvY2F0aW9uU2VydmljZTtcbiIsImltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge2dldERhaWx5Tm90ZSwgZ2V0RGFpbHlOb3RlU2V0dGluZ3N9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XG4vLyBpbXBvcnQgYXBwU3RvcmUgZnJvbSBcIi4uL3N0b3Jlcy9hcHBTdG9yZVwiO1xuaW1wb3J0IGRhaWx5Tm90ZXNTZXJ2aWNlIGZyb20gJy4uL3NlcnZpY2VzL2RhaWx5Tm90ZXNTZXJ2aWNlJztcbmltcG9ydCB7VEZpbGV9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hhbmdlTWVtbyhcbiAgbWVtb2lkOiBzdHJpbmcsXG4gIG9yaWdpbmFsQ29udGVudDogc3RyaW5nLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIG1lbW9UeXBlOiBzdHJpbmcsXG4pOiBQcm9taXNlPE1vZGVsLk1lbW8+IHtcbiAgY29uc3Qge2RhaWx5Tm90ZXN9ID0gZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKTtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgY29uc3QgdGltZVN0cmluZyA9IG1lbW9pZC5zbGljZSgwLCAxMSkgKyAnMDAnO1xuICBjb25zdCBpZFN0cmluZyA9IHBhcnNlSW50KG1lbW9pZC5zbGljZSgxNCkpO1xuICBjb25zdCBjaGFuZ2VEYXRlID0gbW9tZW50KHRpbWVTdHJpbmcsICdZWVlZTU1EREhIbW1TUycpO1xuICBjb25zdCBkYWlseU5vdGUgPSBnZXREYWlseU5vdGUoY2hhbmdlRGF0ZSwgZGFpbHlOb3Rlcyk7XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgdmF1bHQucmVhZChkYWlseU5vdGUpO1xuICBjb25zdCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50KTtcbiAgY29uc3QgcmVtb3ZlRW50ZXIgPSBjb250ZW50LnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xuICBjb25zdCBvcmlnaW5hbExpbmUgPSBmaWxlTGluZXNbaWRTdHJpbmddO1xuICBjb25zdCBuZXdMaW5lID0gZmlsZUxpbmVzW2lkU3RyaW5nXS5yZXBsYWNlKG9yaWdpbmFsQ29udGVudCwgcmVtb3ZlRW50ZXIpO1xuICBjb25zdCBuZXdGaWxlQ29udGVudCA9IGZpbGVDb250ZW50LnJlcGxhY2Uob3JpZ2luYWxMaW5lLCBuZXdMaW5lKTtcbiAgYXdhaXQgdmF1bHQubW9kaWZ5KGRhaWx5Tm90ZSwgbmV3RmlsZUNvbnRlbnQpO1xuICByZXR1cm4ge1xuICAgIGlkOiBtZW1vaWQsXG4gICAgY29udGVudDogcmVtb3ZlRW50ZXIsXG4gICAgZGVsZXRlZEF0OiAnJyxcbiAgICBjcmVhdGVkQXQ6IGNoYW5nZURhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOlNTJyksXG4gICAgdXBkYXRlZEF0OiBjaGFuZ2VEYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpTUycpLFxuICAgIG1lbW9UeXBlOiBtZW1vVHlwZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGUobWVtb2lkOiBzdHJpbmcpOiBURmlsZSB7XG4gIGNvbnN0IHtkYWlseU5vdGVzfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XG4gIGNvbnN0IHRpbWVTdHJpbmcgPSBtZW1vaWQuc2xpY2UoMCwgMTMpO1xuICBjb25zdCBjaGFuZ2VEYXRlID0gbW9tZW50KHRpbWVTdHJpbmcsICdZWVlZTU1EREhIbW1TUycpO1xuICBjb25zdCBkYWlseU5vdGUgPSBnZXREYWlseU5vdGUoY2hhbmdlRGF0ZSwgZGFpbHlOb3Rlcyk7XG4gIHJldHVybiBkYWlseU5vdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYWlseU5vdGVQYXRoKCk6IHN0cmluZyB7XG4gIGNvbnN0IGRhaWx5Tm90ZXNTZXR0aW5nID0gZ2V0RGFpbHlOb3RlU2V0dGluZ3MoKTtcbiAgY29uc3QgZGFpbHlOb3RlUGF0aCA9IGRhaWx5Tm90ZXNTZXR0aW5nLmZvbGRlcjtcbiAgcmV0dXJuIGRhaWx5Tm90ZVBhdGg7XG59XG5cbmNvbnN0IGdldEFsbExpbmVzRnJvbUZpbGUgPSAoY2FjaGU6IHN0cmluZykgPT4gY2FjaGUuc3BsaXQoL1xccj9cXG4vKTtcbiIsImltcG9ydCB7Z2V0RGFpbHlOb3RlUGF0aH0gZnJvbSAnLi9vYlVwZGF0ZU1lbW8nO1xuaW1wb3J0IHtURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuXG5leHBvcnQgY29uc3QgZmluZFF1ZXJ5ID0gYXN5bmMgKCk6IFByb21pc2U8YW55W10+ID0+IHtcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcblxuICBjb25zdCBxdWVyeUxpc3QgPSBbXTtcblxuICBjb25zdCBmaWxlUGF0aCA9IGdldERhaWx5Tm90ZVBhdGgoKTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggKyAnL3F1ZXJ5Lm1kJztcblxuICBjb25zdCBxdWVyeUZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KCcnLCBhYnNvbHV0ZVBhdGgpO1xuICBpZiAocXVlcnlGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKHF1ZXJ5RmlsZSk7XG4gICAgY29uc3QgZmlsZUxpbmVzID0gZ2V0QWxsTGluZXNGcm9tRmlsZShmaWxlQ29udGVudHMpO1xuICAgIGlmIChmaWxlTGluZXMgJiYgZmlsZUxpbmVzLmxlbmd0aCAhPSAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVMaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZmlsZUxpbmVzW2ldID09PSAnJykgY29udGludWU7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWREYXRlU3RyaW5nID0gZ2V0Q3JlYXRlZERhdGVGcm9tTGluZShmaWxlTGluZXNbaV0pO1xuICAgICAgICBjb25zdCBjcmVhdGVkRGF0ZSA9IG1vbWVudChjcmVhdGVkRGF0ZVN0cmluZywgJ1lZWVlNTURESEhtbXNzJykuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWREYXRlID0gY3JlYXRlZERhdGU7XG4gICAgICAgIGNvbnN0IGlkID0gY3JlYXRlZERhdGVTdHJpbmcgKyBnZXRJREZyb21MaW5lKGZpbGVMaW5lc1tpXSk7XG4gICAgICAgIGNvbnN0IHF1ZXJ5c3RyaW5nID0gZ2V0U3RyaW5nRnJvbUxpbmUoZmlsZUxpbmVzW2ldKTtcbiAgICAgICAgY29uc3QgdGl0bGUgPSBnZXRUaXRsZUZyb21MaW5lKGZpbGVMaW5lc1tpXSk7XG4gICAgICAgIGxldCBwaW5uZWREYXRlO1xuXG4gICAgICAgIGlmICgvXiguKylwaW5uZWRBdCguKykkLy50ZXN0KGZpbGVMaW5lc1tpXSkpIHtcbiAgICAgICAgICBwaW5uZWREYXRlID0gbW9tZW50KGdldFBpbm5lZERhdGVGcm9tTGluZShmaWxlTGluZXNbaV0pLCAnWVlZWU1NRERISG1tc3MnKTtcbiAgICAgICAgICBxdWVyeUxpc3QucHVzaCh7XG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGNyZWF0ZWREYXRlLFxuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgcGlubmVkQXQ6IHBpbm5lZERhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyksXG4gICAgICAgICAgICBxdWVyeXN0cmluZzogcXVlcnlzdHJpbmcsXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IHVwZGF0ZWREYXRlLFxuICAgICAgICAgICAgdXNlcklkOiAnJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICgvXiguKylcXFtcXF0oLispPyQvLnRlc3QoZmlsZUxpbmVzW2ldKSkge1xuICAgICAgICAgIHF1ZXJ5TGlzdC5wdXNoKHtcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogY3JlYXRlZERhdGUsXG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICBwaW5uZWRBdDogJycsXG4gICAgICAgICAgICBxdWVyeXN0cmluZzogJycsXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IHVwZGF0ZWREYXRlLFxuICAgICAgICAgICAgdXNlcklkOiAnJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVyeUxpc3QucHVzaCh7XG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGNyZWF0ZWREYXRlLFxuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgcGlubmVkQXQ6ICcnLFxuICAgICAgICAgICAgcXVlcnlzdHJpbmc6IHF1ZXJ5c3RyaW5nLFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiB1cGRhdGVkRGF0ZSxcbiAgICAgICAgICAgIHVzZXJJZDogJycsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcXVlcnlMaXN0O1xufTtcblxuY29uc3QgZ2V0QWxsTGluZXNGcm9tRmlsZSA9IChjYWNoZTogc3RyaW5nKSA9PiBjYWNoZS5zcGxpdCgvXFxyP1xcbi8pO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGdldENyZWF0ZWREYXRlRnJvbUxpbmUgPSAobGluZTogc3RyaW5nKSA9PiAvXihcXGR7MTR9KS8uZXhlYyhsaW5lKT8uWzFdO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGdldElERnJvbUxpbmUgPSAobGluZTogc3RyaW5nKSA9PiAvXihcXGR7MTR9KShcXGR7MSx9KVxccy8uZXhlYyhsaW5lKT8uWzJdO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGdldFN0cmluZ0Zyb21MaW5lID0gKGxpbmU6IHN0cmluZykgPT4gL14oXFxkezE0fSkoXFxkezEsfSlcXHMoLispXFxzKFxcWyguKyk/XFxdKS8uZXhlYyhsaW5lKT8uWzRdO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGdldFRpdGxlRnJvbUxpbmUgPSAobGluZTogc3RyaW5nKSA9PiAvXihcXGR7MTR9KShcXGR7MSx9KVxccyguKylcXHMoXFxbKC4rKVxcXSkvLmV4ZWMobGluZSk/LlszXTtcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBnZXRQaW5uZWREYXRlRnJvbUxpbmUgPSAobGluZTogc3RyaW5nKSA9Pi9eKFxcZHsxNH0pKFxcZHsxLH0pXFxzKC4rKVxccyhcXFsoLispXFxdKVxccyhwaW5uZWRBdFxcOiAoXFxkezE0fSkpLy5leGVjKGxpbmUpPy5bN107XG4iLCJpbXBvcnQge2dldERhaWx5Tm90ZVBhdGh9IGZyb20gJy4vb2JVcGRhdGVNZW1vJztcbmltcG9ydCB7VEZpbGUsIG5vcm1hbGl6ZVBhdGgsIE5vdGljZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlT2JzaWRpYW5RdWVyeSA9IGFzeW5jICh0aXRsZTogc3RyaW5nLCBxdWVyeXN0cmluZzogc3RyaW5nKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcblxuICBjb25zdCBmaWxlUGF0aCA9IGdldERhaWx5Tm90ZVBhdGgoKTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggKyAnL3F1ZXJ5Lm1kJztcblxuICBjb25zdCBxdWVyeUZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KCcnLCBhYnNvbHV0ZVBhdGgpO1xuXG4gIGlmIChxdWVyeUZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgIGNvbnN0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQocXVlcnlGaWxlKTtcbiAgICBjb25zdCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgY29uc3QgZGF0ZSA9IG1vbWVudCgpO1xuICAgIGNvbnN0IGNyZWF0ZWREYXRlID0gZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKTtcbiAgICBjb25zdCB1cGRhdGVkRGF0ZSA9IGNyZWF0ZWREYXRlO1xuICAgIC8vIGNvbnN0IGxpbmVOdW0gPSBmaWxlTGluZXMubGVuZ3RoICsgMTtcbiAgICAvLyBsZXQgbGluZU51bTtcbiAgICBsZXQgbGluZU51bTtcbiAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMSAmJiBmaWxlTGluZXNbMF0gPT09ICcnKSB7XG4gICAgICBsaW5lTnVtID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZU51bSA9IGZpbGVMaW5lcy5sZW5ndGggKyAxO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGRhdGUuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpICsgbGluZU51bTtcblxuICAgIGF3YWl0IGNyZWF0ZVF1ZXJ5SW5GaWxlKHF1ZXJ5RmlsZSwgZmlsZUNvbnRlbnRzLCBpZCwgdGl0bGUsIHF1ZXJ5c3RyaW5nKTtcblxuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGNyZWF0ZWRBdDogY3JlYXRlZERhdGUsXG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgcGlubmVkQXQ6ICcnLFxuICAgICAgICBxdWVyeXN0cmluZzogcXVlcnlzdHJpbmcsXG4gICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgdXBkYXRlZEF0OiB1cGRhdGVkRGF0ZSxcbiAgICAgICAgdXNlcklkOiAnJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBxdWVyeUZpbGVQYXRoID0gbm9ybWFsaXplUGF0aChhYnNvbHV0ZVBhdGgpO1xuICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBjcmVhdGVRdWVyeUZpbGUocXVlcnlGaWxlUGF0aCk7XG4gICAgY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChmaWxlKTtcbiAgICBjb25zdCBkYXRlID0gbW9tZW50KCk7XG4gICAgY29uc3QgY3JlYXRlZERhdGUgPSBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuICAgIGNvbnN0IHVwZGF0ZWREYXRlID0gY3JlYXRlZERhdGU7XG4gICAgY29uc3QgaWQgPSBkYXRlLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKSArIDE7XG5cbiAgICBhd2FpdCBjcmVhdGVRdWVyeUluRmlsZShmaWxlLCBmaWxlQ29udGVudHMsIGlkLCB0aXRsZSwgcXVlcnlzdHJpbmcpO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgY3JlYXRlZEF0OiBjcmVhdGVkRGF0ZSxcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBwaW5uZWRBdDogJycsXG4gICAgICAgIHF1ZXJ5c3RyaW5nOiBxdWVyeXN0cmluZyxcbiAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICB1cGRhdGVkQXQ6IHVwZGF0ZWREYXRlLFxuICAgICAgICB1c2VySWQ6ICcnLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUXVlcnlJbkZpbGUgPSBhc3luYyAoXG4gIGZpbGU6IFRGaWxlLFxuICBmaWxlQ29udGVudDogc3RyaW5nLFxuICBpZDogc3RyaW5nLFxuICB0aXRsZTogc3RyaW5nLFxuICBxdWVyeVN0cmluZzogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgbGV0IG5ld0NvbnRlbnQ7XG4gIGlmIChmaWxlQ29udGVudCA9PT0gJycpIHtcbiAgICBuZXdDb250ZW50ID0gaWQgKyAnICcgKyB0aXRsZSArICcgJyArIHF1ZXJ5U3RyaW5nO1xuICB9IGVsc2Uge1xuICAgIG5ld0NvbnRlbnQgPSBmaWxlQ29udGVudCArICdcXG4nICsgaWQgKyAnICcgKyB0aXRsZSArICcgJyArIHF1ZXJ5U3RyaW5nO1xuICB9XG5cbiAgYXdhaXQgdmF1bHQubW9kaWZ5KGZpbGUsIG5ld0NvbnRlbnQpO1xuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVF1ZXJ5RmlsZSA9IGFzeW5jIChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFRGaWxlPiA9PiB7XG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjcmVhdGVkRmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZShwYXRoLCAnJyk7XG4gICAgcmV0dXJuIGNyZWF0ZWRGaWxlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZpbGU6ICcke3BhdGh9J2AsIGVycik7XG4gICAgbmV3IE5vdGljZSgnVW5hYmxlIHRvIGNyZWF0ZSBuZXcgZmlsZS4nKTtcbiAgfVxufTtcblxuY29uc3QgZ2V0QWxsTGluZXNGcm9tRmlsZSA9IChjYWNoZTogc3RyaW5nKSA9PiBjYWNoZS5zcGxpdCgvXFxyP1xcbi8pO1xuIiwiaW1wb3J0IHtub3JtYWxpemVQYXRoLCBURm9sZGVyLCBURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtnZXRBbGxEYWlseU5vdGVzLCBnZXREYWlseU5vdGVTZXR0aW5ncywgZ2V0RGF0ZUZyb21GaWxlfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5pbXBvcnQge1Byb2Nlc3NFbnRyaWVzQmVsb3d9IGZyb20gJy4uL21lbW9zJztcbmltcG9ydCB7RGVmYXVsdE1lbW9Db21wb3NpdGlvbn0gZnJvbSAnLi4vbWVtb3MnO1xuXG5leHBvcnQgY2xhc3MgRGFpbHlOb3Rlc0ZvbGRlck1pc3NpbmdFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZW1haW5pbmdNZW1vcyhub3RlOiBURmlsZSk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmICghbm90ZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gIGxldCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKG5vdGUpO1xuICBsZXQgcmVnZXhNYXRjaDtcbiAgaWYgKFxuICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24gIT0gJycgJiZcbiAgICAve1RJTUV9L2cudGVzdChEZWZhdWx0TWVtb0NvbXBvc2l0aW9uKSAmJlxuICAgIC97Q09OVEVOVH0vZy50ZXN0KERlZmF1bHRNZW1vQ29tcG9zaXRpb24pXG4gICkge1xuICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgcmVnZXhNYXRjaCA9ICcoLXxcXFxcKikgKFxcXFxbKC57MX0pXFxcXF1cXFxccyk/JyArXG4gICAgICBEZWZhdWx0TWVtb0NvbXBvc2l0aW9uLnJlcGxhY2UoL3tUSU1FfS9nLCAnKChcXFxcPHRpbWVcXFxcPik/XFxcXGR7MSwyfTpcXFxcZHsyfSk/JykucmVwbGFjZSgvIHtDT05URU5UfS9nLCAnJyk7XG4gIH0gZWxzZSB7XG4gICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICByZWdleE1hdGNoID0gJygtfFxcXFwqKSAoXFxcXFsoLnsxfSlcXFxcXVxcXFxzKT8oKFxcXFw8dGltZVxcXFw+KT9cXFxcZHsxLDJ9XFxcXDpcXFxcZHsyfSk/JztcbiAgfVxuICBjb25zdCByZWdleE1hdGNoUmUgPSBuZXcgUmVnRXhwKHJlZ2V4TWF0Y2gsICdnJyk7XG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGNvbnN0IG1hdGNoTGVuZ3RoID0gKGZpbGVDb250ZW50cy5tYXRjaChyZWdleE1hdGNoUmUpIHx8IFtdKS5sZW5ndGg7XG4gIC8vIGNvbnN0IG1hdGNoTGVuZ3RoID0gKGZpbGVDb250ZW50cy5tYXRjaCgvKC18XFwqKSAoXFxbIFxcXVxccyk/KChcXDx0aW1lXFw+KT9cXGR7MSwyfVxcOlxcZHsyfSk/L2cpIHx8IFtdKS5sZW5ndGg7XG4gIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChQcm9jZXNzRW50cmllc0JlbG93LnJlcGxhY2UoLyhbLj8qK14kW1xcXVxcXFwoKXt9fC1dKS9nLCAnXFxcXCQxJyksICdnJyk7XG4gIGNvbnN0IHByb2Nlc3NFbnRyaWVzSGVhZGVyID0gKGZpbGVDb250ZW50cy5tYXRjaChyZSkgfHwgW10pLmxlbmd0aDtcbiAgZmlsZUNvbnRlbnRzID0gbnVsbDtcbiAgaWYgKHByb2Nlc3NFbnRyaWVzSGVhZGVyKSB7XG4gICAgcmV0dXJuIG1hdGNoTGVuZ3RoO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TWVtb3NGcm9tRGFpbHlOb3RlKGRhaWx5Tm90ZTogVEZpbGUgfCBudWxsLCBkYWlseUV2ZW50czogYW55W10pOiBQcm9taXNlPGFueVtdPiB7XG4gIGlmICghZGFpbHlOb3RlKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gIGNvbnN0IE1lbW9zID0gYXdhaXQgZ2V0UmVtYWluaW5nTWVtb3MoZGFpbHlOb3RlKTtcblxuICBpZiAoTWVtb3MpIHtcbiAgICBsZXQgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChkYWlseU5vdGUpO1xuICAgIGxldCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gZ2V0RGF0ZUZyb21GaWxlKGRhaWx5Tm90ZSwgJ2RheScpO1xuICAgIGNvbnN0IGVuZERhdGUgPSBnZXREYXRlRnJvbUZpbGUoZGFpbHlOb3RlLCAnZGF5Jyk7XG4gICAgbGV0IHByb2Nlc3NIZWFkZXJGb3VuZCA9IGZhbHNlO1xuICAgIGxldCBtZW1vVHlwZTogc3RyaW5nO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZUxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsaW5lID0gZmlsZUxpbmVzW2ldO1xuICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgIGlmIChwcm9jZXNzSGVhZGVyRm91bmQgPT0gZmFsc2UgJiYgbGluZUNvbnRhaW5zUGFyc2VCZWxvd1Rva2VuKGxpbmUpKSB7XG4gICAgICAgIHByb2Nlc3NIZWFkZXJGb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvY2Vzc0hlYWRlckZvdW5kID09IHRydWUgJiYgIWxpbmVDb250YWluc1BhcnNlQmVsb3dUb2tlbihsaW5lKSAmJiAvXiN7MSx9IC9nLnRlc3QobGluZSkpIHtcbiAgICAgICAgcHJvY2Vzc0hlYWRlckZvdW5kID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChsaW5lQ29udGFpbnNUaW1lKGxpbmUpICYmIHByb2Nlc3NIZWFkZXJGb3VuZCkge1xuICAgICAgICBjb25zdCBob3VyVGV4dCA9IGV4dHJhY3RIb3VyRnJvbUJ1bGxldExpbmUobGluZSk7XG4gICAgICAgIGNvbnN0IG1pblRleHQgPSBleHRyYWN0TWluRnJvbUJ1bGxldExpbmUobGluZSk7XG4gICAgICAgIHN0YXJ0RGF0ZS5ob3VycyhwYXJzZUludChob3VyVGV4dCkpO1xuICAgICAgICBzdGFydERhdGUubWludXRlcyhwYXJzZUludChtaW5UZXh0KSk7XG4gICAgICAgIGVuZERhdGUuaG91cnMocGFyc2VJbnQoaG91clRleHQpKTtcbiAgICAgICAgaWYgKHBhcnNlSW50KGhvdXJUZXh0KSA+IDIyKSB7XG4gICAgICAgICAgZW5kRGF0ZS5taW51dGVzKHBhcnNlSW50KG1pblRleHQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbmREYXRlLm1pbnV0ZXMocGFyc2VJbnQobWluVGV4dCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgvXlxccypbLSpdXFxzKFxcWyguezF9KVxcXSlcXHMvZy50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgY29uc3QgbWVtb1Rhc2tUeXBlID0gZXh0cmFjdE1lbW9UYXNrVHlwZUZyb21MaW5lKGxpbmUpO1xuICAgICAgICAgIGlmIChtZW1vVGFza1R5cGUgPT09ICcgJykge1xuICAgICAgICAgICAgbWVtb1R5cGUgPSAnVEFTSy1UT0RPJztcbiAgICAgICAgICB9IGVsc2UgaWYgKG1lbW9UYXNrVHlwZSA9PT0gJ3gnIHx8IG1lbW9UYXNrVHlwZSA9PT0gJ1gnKSB7XG4gICAgICAgICAgICBtZW1vVHlwZSA9ICdUQVNLLURPTkUnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZW1vVHlwZSA9ICdUQVNLLScgKyBtZW1vVGFza1R5cGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lbW9UeXBlID0gJ0pPVVJOQUwnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhd1RleHQgPSBleHRyYWN0VGV4dEZyb21Ub2RvTGluZShsaW5lKTtcbiAgICAgICAgaWYocmF3VGV4dCAhPT0gJycpIHtcbiAgICAgICAgICBkYWlseUV2ZW50cy5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBzdGFydERhdGUuZm9ybWF0KCdZWVlZTU1EREhIbW1TUycpICsgaSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHJhd1RleHQsXG4gICAgICAgICAgICB1c2VyX2lkOiAxLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBzdGFydERhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOlNTJyksXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IGVuZERhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOlNTJyksXG4gICAgICAgICAgICBtZW1vVHlwZTogbWVtb1R5cGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZmlsZUxpbmVzID0gbnVsbDtcbiAgICBmaWxlQ29udGVudHMgPSBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNZW1vcygpOiBQcm9taXNlPGFueVtdPiB7XG4gIGNvbnN0IGV2ZW50czogYW55W10gfCBQcm9taXNlTGlrZTxhbnlbXT4gPSBbXTtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgY29uc3Qge2ZvbGRlcn0gPSBnZXREYWlseU5vdGVTZXR0aW5ncygpO1xuXG4gIGNvbnN0IGRhaWx5Tm90ZXNGb2xkZXIgPSB2YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgobm9ybWFsaXplUGF0aChmb2xkZXIpKSBhcyBURm9sZGVyO1xuXG4gIGlmICghZGFpbHlOb3Rlc0ZvbGRlcikge1xuICAgIHRocm93IG5ldyBEYWlseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yKCdGYWlsZWQgdG8gZmluZCBkYWlseSBub3RlcyBmb2xkZXInKTtcbiAgfVxuXG4gIGNvbnN0IGRhaWx5Tm90ZXMgPSBnZXRBbGxEYWlseU5vdGVzKCk7XG5cbiAgZm9yIChjb25zdCBzdHJpbmcgaW4gZGFpbHlOb3Rlcykge1xuICAgIGlmIChkYWlseU5vdGVzW3N0cmluZ10gaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgYXdhaXQgZ2V0TWVtb3NGcm9tRGFpbHlOb3RlKGRhaWx5Tm90ZXNbc3RyaW5nXSwgZXZlbnRzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXZlbnRzO1xufVxuXG5jb25zdCBnZXRBbGxMaW5lc0Zyb21GaWxlID0gKGNhY2hlOiBzdHJpbmcpID0+IGNhY2hlLnNwbGl0KC9cXHI/XFxuLyk7XG4vLyBjb25zdCBsaW5lSXNWYWxpZFRvZG8gPSAobGluZTogc3RyaW5nKSA9PiB7XG4vLyAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuLy8gICByZXR1cm4gL15cXHMqW1xcLVxcKl1cXHNcXFsoXFxzfHh8WHxcXFxcfFxcLXxcXD58RHxcXD98XFwvfFxcK3xSfFxcIXxpfEJ8UHxDKVxcXVxccz9cXHMqXFxTLy50ZXN0KGxpbmUpXG4vLyB9XG5jb25zdCBsaW5lQ29udGFpbnNUaW1lID0gKGxpbmU6IHN0cmluZykgPT4ge1xuICBsZXQgcmVnZXhNYXRjaDtcbiAgaWYgKFxuICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24gIT0gJycgJiZcbiAgICAve1RJTUV9L2cudGVzdChEZWZhdWx0TWVtb0NvbXBvc2l0aW9uKSAmJlxuICAgIC97Q09OVEVOVH0vZy50ZXN0KERlZmF1bHRNZW1vQ29tcG9zaXRpb24pXG4gICkge1xuICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgcmVnZXhNYXRjaCA9ICdeXFxcXHMqKC18XFxcXCopXFxcXHMoXFxcXFsoLnsxfSlcXFxcXVxcXFxzKT8nICtcbiAgICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24ucmVwbGFjZSgve1RJTUV9L2csICcoXFxcXDx0aW1lXFxcXD4pP1xcXFxkezEsMn06XFxcXGR7Mn0oXFxcXDxcXFxcL3RpbWVcXFxcPik/JykucmVwbGFjZShcbiAgICAgICAgL3tDT05URU5UfS9nLFxuICAgICAgICAnKC4qKSQnLFxuICAgICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHJlZ2V4TWF0Y2ggPSAnXlxcXFxzKigtfFxcXFwqKVxcXFxzKFxcXFxbKC57MX0pXFxcXF1cXFxccyk/KFxcXFw8dGltZVxcXFw+KT9cXFxcZHsxLDJ9XFxcXDpcXFxcZHsyfSguKikkJztcbiAgfVxuICBjb25zdCByZWdleE1hdGNoUmUgPSBuZXcgUmVnRXhwKHJlZ2V4TWF0Y2gsICcnKTtcbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgcmV0dXJuIHJlZ2V4TWF0Y2hSZS50ZXN0KGxpbmUpO1xuICAvLyBUaGUgYmVsb3cgbGluZSBleGNsdWRlcyBlbnRyaWVzIHdpdGggYSAnOicgYWZ0ZXIgdGhlIHRpbWUgYXMgSSB3YXMgaGF2aW5nIGlzc3VlcyB3aXRoIG15IGNhbGVuZGFyXG4gIC8vIGJlaW5nIHB1bGxlZCBpbi4gT25jZSBtYWRlIGNvbmZpZ3VyYWJsZSB3aWxsIGJlIHNpbXBsZXIgdG8gbWFuYWdlLlxuICAvLyByZXR1cm4gL15cXHMqW1xcLVxcKl1cXHMoXFxbKFxcc3x4fFh8XFxcXHxcXC18XFw+fER8XFw/fFxcL3xcXCt8UnxcXCF8aXxCfFB8QylcXF1cXHMpPyhcXDx0aW1lXFw+KT9cXGR7MSwyfVxcOlxcZHsyfVteOl0oLiopJC8udGVzdChsaW5lKTtcbn07XG5cbmNvbnN0IGxpbmVDb250YWluc1BhcnNlQmVsb3dUb2tlbiA9IChsaW5lOiBzdHJpbmcpID0+IHtcbiAgaWYgKFByb2Nlc3NFbnRyaWVzQmVsb3cgPT09ICcnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKFByb2Nlc3NFbnRyaWVzQmVsb3cucmVwbGFjZSgvKFsuPyorXiRbXFxdXFxcXCgpe318LV0pL2csICdcXFxcJDEnKSwgJycpO1xuICByZXR1cm4gcmUudGVzdChsaW5lKTtcbn07XG5cbmNvbnN0IGV4dHJhY3RUZXh0RnJvbVRvZG9MaW5lID0gKGxpbmU6IHN0cmluZykgPT4ge1xuICBsZXQgcmVnZXhNYXRjaDtcbiAgaWYgKFxuICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24gIT0gJycgJiZcbiAgICAve1RJTUV9L2cudGVzdChEZWZhdWx0TWVtb0NvbXBvc2l0aW9uKSAmJlxuICAgIC97Q09OVEVOVH0vZy50ZXN0KERlZmF1bHRNZW1vQ29tcG9zaXRpb24pXG4gICkge1xuICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgcmVnZXhNYXRjaCA9ICdeXFxcXHMqW1xcXFwtXFxcXCpdXFxcXHMoXFxcXFsoLnsxfSlcXFxcXVxcXFxzPyk/JyArXG4gICAgICBEZWZhdWx0TWVtb0NvbXBvc2l0aW9uLnJlcGxhY2UoL3tUSU1FfS9nLCAnKFxcXFw8dGltZVxcXFw+KT8oKFxcXFxkezEsMn0pXFxcXDooXFxcXGR7Mn0pKT8oXFxcXDxcXFxcL3RpbWVcXFxcPik/JykucmVwbGFjZShcbiAgICAgICAgL3tDT05URU5UfS9nLFxuICAgICAgICAnKC4qKSQnLFxuICAgICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHJlZ2V4TWF0Y2ggPSAnXlxcXFxzKltcXFxcLVxcXFwqXVxcXFxzKFxcXFxbKC57MX0pXFxcXF1cXFxccz8pPyhcXFxcPHRpbWVcXFxcPik/KChcXFxcZHsxLDJ9KVxcXFw6KFxcXFxkezJ9KSk/KFxcXFw8XFxcXC90aW1lXFxcXD4pP1xcXFxzPyguKikkJztcbiAgfVxuICBjb25zdCByZWdleE1hdGNoUmUgPSBuZXcgUmVnRXhwKHJlZ2V4TWF0Y2gsICcnKTtcbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgcmV0dXJuIHJlZ2V4TWF0Y2hSZS5leGVjKGxpbmUpPy5bOF07XG4gIC8vIHJldHVybiAvXlxccypbXFwtXFwqXVxccyhcXFsoLnsxfSlcXF1cXHM/KT8oXFw8dGltZVxcPik/KChcXGR7MSwyfSlcXDooXFxkezJ9KSk/KFxcPFxcL3RpbWVcXD4pP1xccz8oLiopJC8uZXhlYyhsaW5lKT8uWzhdO1xufTtcblxuY29uc3QgZXh0cmFjdEhvdXJGcm9tQnVsbGV0TGluZSA9IChsaW5lOiBzdHJpbmcpID0+IHtcbiAgbGV0IHJlZ2V4SG91ck1hdGNoO1xuICBpZiAoXG4gICAgRGVmYXVsdE1lbW9Db21wb3NpdGlvbiAhPSAnJyAmJlxuICAgIC97VElNRX0vZy50ZXN0KERlZmF1bHRNZW1vQ29tcG9zaXRpb24pICYmXG4gICAgL3tDT05URU5UfS9nLnRlc3QoRGVmYXVsdE1lbW9Db21wb3NpdGlvbilcbiAgKSB7XG4gICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICByZWdleEhvdXJNYXRjaCA9ICdeXFxcXHMqW1xcXFwtXFxcXCpdXFxcXHMoXFxcXFsoLnsxfSlcXFxcXVxcXFxzPyk/JyArXG4gICAgICBEZWZhdWx0TWVtb0NvbXBvc2l0aW9uLnJlcGxhY2UoL3tUSU1FfS9nLCAnKFxcXFw8dGltZVxcXFw+KT8oXFxcXGR7MSwyfSlcXFxcOihcXFxcZHsyfSkoXFxcXDxcXFxcL3RpbWVcXFxcPik/JykucmVwbGFjZShcbiAgICAgICAgL3tDT05URU5UfS9nLFxuICAgICAgICAnKC4qKSQnLFxuICAgICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHJlZ2V4SG91ck1hdGNoID0gJ15cXFxccypbXFxcXC1cXFxcKl1cXFxccyhcXFxcWyguezF9KVxcXFxdXFxcXHM/KT8oXFxcXDx0aW1lXFxcXD4pPyhcXFxcZHsxLDJ9KVxcXFw6KFxcXFxkezJ9KSguKikkJztcbiAgfVxuICBjb25zdCByZWdleE1hdGNoUmUgPSBuZXcgUmVnRXhwKHJlZ2V4SG91ck1hdGNoLCAnJyk7XG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIHJldHVybiByZWdleE1hdGNoUmUuZXhlYyhsaW5lKT8uWzRdO1xufTtcblxuY29uc3QgZXh0cmFjdE1pbkZyb21CdWxsZXRMaW5lID0gKGxpbmU6IHN0cmluZykgPT4ge1xuICBsZXQgcmVnZXhIb3VyTWF0Y2g7XG4gIGlmIChcbiAgICBEZWZhdWx0TWVtb0NvbXBvc2l0aW9uICE9ICcnICYmXG4gICAgL3tUSU1FfS9nLnRlc3QoRGVmYXVsdE1lbW9Db21wb3NpdGlvbikgJiZcbiAgICAve0NPTlRFTlR9L2cudGVzdChEZWZhdWx0TWVtb0NvbXBvc2l0aW9uKVxuICApIHtcbiAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHJlZ2V4SG91ck1hdGNoID0gJ15cXFxccypbXFxcXC1cXFxcKl1cXFxccyhcXFxcWyguezF9KVxcXFxdXFxcXHM/KT8nICtcbiAgICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24ucmVwbGFjZSgve1RJTUV9L2csICcoXFxcXDx0aW1lXFxcXD4pPyhcXFxcZHsxLDJ9KVxcXFw6KFxcXFxkezJ9KShcXFxcPFxcXFwvdGltZVxcXFw+KT8nKS5yZXBsYWNlKFxuICAgICAgICAve0NPTlRFTlR9L2csXG4gICAgICAgICcoLiopJCcsXG4gICAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgcmVnZXhIb3VyTWF0Y2ggPSAnXlxcXFxzKltcXFxcLVxcXFwqXVxcXFxzKFxcXFxbKC57MX0pXFxcXF1cXFxccz8pPyhcXFxcPHRpbWVcXFxcPik/KFxcXFxkezEsMn0pXFxcXDooXFxcXGR7Mn0pKC4qKSQnO1xuICB9XG4gIGNvbnN0IHJlZ2V4TWF0Y2hSZSA9IG5ldyBSZWdFeHAocmVnZXhIb3VyTWF0Y2gsICcnKTtcbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgcmV0dXJuIHJlZ2V4TWF0Y2hSZS5leGVjKGxpbmUpPy5bNV07XG4gIC8vIC9eXFxzKltcXC1cXCpdXFxzKFxcWyguezF9KVxcXVxccz8pPyhcXDx0aW1lXFw+KT8oXFxkezEsMn0pXFw6KFxcZHsyfSkoLiopJC8uZXhlYyhsaW5lKT8uWzVdO1xufTtcblxuY29uc3QgZXh0cmFjdE1lbW9UYXNrVHlwZUZyb21MaW5lID0gKGxpbmU6IHN0cmluZykgPT5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgL15cXHMqW1xcLVxcKl1cXHMoXFxbKC57MX0pXFxdKVxccyguKikkLy5leGVjKGxpbmUpPy5bMl07XG4vLyBUaGUgYmVsb3cgbGluZSBleGNsdWRlcyBlbnRyaWVzIHdpdGggYSAnOicgYWZ0ZXIgdGhlIHRpbWUgYXMgSSB3YXMgaGF2aW5nIGlzc3VlcyB3aXRoIG15IGNhbGVuZGFyXG4vLyBiZWluZyBwdWxsZWQgaW4uIE9uY2UgbWFkZSBjb25maWd1cmFibGUgd2lsbCBiZSBzaW1wbGVyIHRvIG1hbmFnZS5cbi8vIHJldHVybiAvXlxccypbXFwtXFwqXVxccyhcXFsoXFxzfHh8WHxcXFxcfFxcLXxcXD58RHxcXD98XFwvfFxcK3xSfFxcIXxpfEJ8UHxDKVxcXVxccyk/KFxcPHRpbWVcXD4pP1xcZHsxLDJ9XFw6XFxkezJ9W146XSguKikkLy50ZXN0KGxpbmUpO1xuIiwiaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7VEZpbGV9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuaW1wb3J0IHtnZXREYWlseU5vdGVQYXRofSBmcm9tICcuL29iVXBkYXRlTWVtbyc7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVPYnNpZGlhblF1ZXJ5ID0gYXN5bmMgKHF1ZXJ5SWQ6IHN0cmluZywgdGl0bGU6IHN0cmluZywgcXVlcnlTdHJpbmc6IHN0cmluZyk6IFByb21pc2U8YW55PiA9PiB7XG4gIGNvbnN0IHttZXRhZGF0YUNhY2hlLCB2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG5cbiAgY29uc3QgZmlsZVBhdGggPSBnZXREYWlseU5vdGVQYXRoKCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoICsgJy9xdWVyeS5tZCc7XG5cbiAgY29uc3QgcXVlcnlGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCgnJywgYWJzb2x1dGVQYXRoKTtcblxuICBpZiAocXVlcnlGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKHF1ZXJ5RmlsZSk7XG4gICAgY29uc3QgZmlsZUxpbmVzID0gZ2V0QWxsTGluZXNGcm9tRmlsZShmaWxlQ29udGVudHMpO1xuXG4gICAgbGV0IGxpbmVJRDtcblxuICAgIGlmICgvXlxcZHsxLDN9JC8udGVzdChxdWVyeUlkKSkge1xuICAgICAgbGluZUlEID0gcXVlcnlJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZUlEID0gZ2V0SURGcm9tTGluZShxdWVyeUlkKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lTnVtID0gcGFyc2VJbnQobGluZUlEKSAtIDE7XG5cbiAgICBpZiAoZmlsZUxpbmVzICYmIGZpbGVMaW5lcy5sZW5ndGggIT0gMCkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGZpbGVMaW5lc1tsaW5lTnVtXTtcblxuICAgICAgY29uc3QgZGF0ZSA9IG1vbWVudCgpO1xuICAgICAgY29uc3QgdXBkYXRlZERhdGVTdHJpbmcgPSBkYXRlLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWREYXRlID0gZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKTtcbiAgICAgIGNvbnN0IG5ld0xpbmVOdW0gPSBsaW5lTnVtICsgMTtcbiAgICAgIGNvbnN0IGlkID0gdXBkYXRlZERhdGVTdHJpbmcgKyBuZXdMaW5lTnVtO1xuICAgICAgaWYgKC9eKC4rKXBpbm5lZEF0KC4rKSQvLnRlc3Qob2xkQ29udGVudCkpIHtcbiAgICAgICAgY29uc3QgcGlubmVkU3RyaW5nID0gZ2V0UGlubmVkU3RyaW5nRnJvbUxpbmUob2xkQ29udGVudCk7XG4gICAgICAgIGNvbnN0IHBpbm5lZERhdGVTdHJpbmcgPSBnZXRQaW5uZWREYXRlRnJvbUxpbmUob2xkQ29udGVudCk7XG4gICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBpZCArICcgJyArIHRpdGxlICsgJyAnICsgcXVlcnlTdHJpbmcgKyAnICcgKyBwaW5uZWRTdHJpbmc7XG4gICAgICAgIGNvbnN0IHBpbm5lZEF0RGF0ZSA9IG1vbWVudChwaW5uZWREYXRlU3RyaW5nLCAnWVlZWU1NRERISG1tc3MnKS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKTtcbiAgICAgICAgY29uc3QgbmV3RmlsZUNvbnRlbnRzID0gZmlsZUNvbnRlbnRzLnJlcGxhY2Uob2xkQ29udGVudCwgbmV3Q29udGVudCk7XG5cbiAgICAgICAgYXdhaXQgdmF1bHQubW9kaWZ5KHF1ZXJ5RmlsZSwgbmV3RmlsZUNvbnRlbnRzKTtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogdXBkYXRlZERhdGUsXG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICBwaW5uZWRBdDogcGlubmVkQXREYXRlLFxuICAgICAgICAgICAgcXVlcnlzdHJpbmc6IHF1ZXJ5U3RyaW5nLFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiB1cGRhdGVkRGF0ZSxcbiAgICAgICAgICAgIHVzZXJJZDogJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBpZCArICcgJyArIHRpdGxlICsgJyAnICsgcXVlcnlTdHJpbmc7XG5cbiAgICAgICAgY29uc3QgbmV3RmlsZUNvbnRlbnRzID0gZmlsZUNvbnRlbnRzLnJlcGxhY2Uob2xkQ29udGVudCwgbmV3Q29udGVudCk7XG5cbiAgICAgICAgYXdhaXQgdmF1bHQubW9kaWZ5KHF1ZXJ5RmlsZSwgbmV3RmlsZUNvbnRlbnRzKTtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogdXBkYXRlZERhdGUsXG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICBwaW5uZWRBdDogJycsXG4gICAgICAgICAgICBxdWVyeXN0cmluZzogcXVlcnlTdHJpbmcsXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IHVwZGF0ZWREYXRlLFxuICAgICAgICAgICAgdXNlcklkOiAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuY29uc3QgZ2V0QWxsTGluZXNGcm9tRmlsZSA9IChjYWNoZTogc3RyaW5nKSA9PiBjYWNoZS5zcGxpdCgvXFxyP1xcbi8pO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGdldElERnJvbUxpbmUgPSAobGluZTogc3RyaW5nKSA9PiAvXihcXGR7MTR9KShcXGR7MSx9KS8uZXhlYyhsaW5lKT8uWzJdO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGdldFBpbm5lZFN0cmluZ0Zyb21MaW5lID0gKGxpbmU6IHN0cmluZykgPT4vXihcXGR7MTR9KShcXGR7MSx9KVxccyguKylcXHMoXFxbKC4rKVxcXSlcXHMocGlubmVkQXRcXDogKFxcZHsxNH0pXFxkKykvLmV4ZWMobGluZSk/Lls2XTtcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBnZXRQaW5uZWREYXRlRnJvbUxpbmUgPSAobGluZTogc3RyaW5nKSA9Pi9eKFxcZHsxNH0pKFxcZHsxLH0pXFxzKC4rKVxccyhcXFsoLispXFxdKVxccyhwaW5uZWRBdFxcOiAoXFxkezE0fSlcXGQrKS8uZXhlYyhsaW5lKT8uWzddO1xuIiwiaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHtjcmVhdGVEYWlseU5vdGUsIGdldEFsbERhaWx5Tm90ZXMsIGdldERhaWx5Tm90ZX0gZnJvbSAnb2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlJztcclxuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XHJcbmltcG9ydCB7SW5zZXJ0QWZ0ZXJ9IGZyb20gJy4uL21lbW9zJztcclxuaW1wb3J0IHtkYWlseU5vdGVzU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMnO1xyXG5pbXBvcnQge0RlZmF1bHRNZW1vQ29tcG9zaXRpb259IGZyb20gJy4uL21lbW9zJztcclxuXHJcbmludGVyZmFjZSBNQ29udGVudCB7XHJcbiAgY29udGVudDogc3RyaW5nO1xyXG4gIHBvc051bT86IG51bWJlcjtcclxufVxyXG5cclxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzExNTE1MC9ob3ctdG8tZXNjYXBlLXJlZ3VsYXItZXhwcmVzc2lvbi1zcGVjaWFsLWNoYXJhY3RlcnMtdXNpbmctamF2YXNjcmlwdFxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHRleHQ6IGFueSkge1xyXG4gIHJldHVybiBhd2FpdCB0ZXh0LnJlcGxhY2UoL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nLCAnXFxcXCQmJyk7XHJcbn1cclxuXHJcbi8vY3JlZGl0IHRvIGNoaG91bWFubiwgb3JpZ2luYWwgY29kZSBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vY2hob3VtYW5uL3F1aWNrYWRkL2Jsb2IvNzUzNmExMjA3MDFhNjI2ZWYwMTBkYjU2N2NlYTdjZjMwMThlNmM4Mi9zcmMvdXRpbGl0eS50cyNMMTMwXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW5lc0luU3RyaW5nKGlucHV0OiBzdHJpbmcpIHtcclxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcclxuICBsZXQgdGVtcFN0cmluZyA9IGlucHV0O1xyXG5cclxuICB3aGlsZSAodGVtcFN0cmluZy5jb250YWlucygnXFxuJykpIHtcclxuICAgIGNvbnN0IGxpbmVFbmRJbmRleCA9IHRlbXBTdHJpbmcuaW5kZXhPZignXFxuJyk7XHJcbiAgICBsaW5lcy5wdXNoKHRlbXBTdHJpbmcuc2xpY2UoMCwgbGluZUVuZEluZGV4KSk7XHJcbiAgICB0ZW1wU3RyaW5nID0gdGVtcFN0cmluZy5zbGljZShsaW5lRW5kSW5kZXggKyAxKTtcclxuICB9XHJcblxyXG4gIGxpbmVzLnB1c2godGVtcFN0cmluZyk7XHJcblxyXG4gIHJldHVybiBsaW5lcztcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JJbnNlcnQoTWVtb0NvbnRlbnQ6IHN0cmluZywgaXNMaXN0OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbC5NZW1vPiB7XHJcbiAgLy8gY29uc3QgcGx1Z2luID0gd2luZG93LnBsdWdpbjtcclxuICBjb25zdCB7dmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG4gIGNvbnN0IHJlbW92ZUVudGVyID0gTWVtb0NvbnRlbnQucmVwbGFjZSgvXFxuL2csICc8YnI+Jyk7XHJcbiAgY29uc3QgZGF0ZSA9IG1vbWVudCgpO1xyXG4gIGNvbnN0IHRpbWVIb3VyID0gZGF0ZS5mb3JtYXQoJ0hIJyk7XHJcbiAgY29uc3QgdGltZU1pbnV0ZSA9IGRhdGUuZm9ybWF0KCdtbScpO1xyXG4gIGxldCBuZXdFdmVudDtcclxuICBsZXQgbGluZU51bTtcclxuICBjb25zdCB0aW1lVGV4dCA9IFN0cmluZyh0aW1lSG91cikgKyBgOmAgKyBTdHJpbmcodGltZU1pbnV0ZSk7XHJcblxyXG4gIGlmIChpc0xpc3QgJiYgRGVmYXVsdE1lbW9Db21wb3NpdGlvbiA9PT0gJycpIHtcclxuICAgIG5ld0V2ZW50ID0gYC0gWyBdIGAgKyBTdHJpbmcodGltZUhvdXIpICsgYDpgICsgU3RyaW5nKHRpbWVNaW51dGUpICsgYCBgICsgcmVtb3ZlRW50ZXI7XHJcbiAgfSBlbHNlIGlmICghaXNMaXN0ICYmIERlZmF1bHRNZW1vQ29tcG9zaXRpb24gPT09ICcnKSB7XHJcbiAgICBuZXdFdmVudCA9IGAtIGAgKyBTdHJpbmcodGltZUhvdXIpICsgYDpgICsgU3RyaW5nKHRpbWVNaW51dGUpICsgYCBgICsgcmVtb3ZlRW50ZXI7XHJcbiAgfVxyXG5cclxuICBpZiAoaXNMaXN0ICYmIERlZmF1bHRNZW1vQ29tcG9zaXRpb24gIT0gJycpIHtcclxuICAgIG5ld0V2ZW50ID0gYC0gWyBdIGAgKyBEZWZhdWx0TWVtb0NvbXBvc2l0aW9uLnJlcGxhY2UoL3tUSU1FfS9nLCB0aW1lVGV4dCkucmVwbGFjZSgve0NPTlRFTlR9L2csIHJlbW92ZUVudGVyKTtcclxuICB9IGVsc2UgaWYgKCFpc0xpc3QgJiYgRGVmYXVsdE1lbW9Db21wb3NpdGlvbiAhPSAnJykge1xyXG4gICAgbmV3RXZlbnQgPSBgLSBgICsgRGVmYXVsdE1lbW9Db21wb3NpdGlvbi5yZXBsYWNlKC97VElNRX0vZywgdGltZVRleHQpLnJlcGxhY2UoL3tDT05URU5UfS9nLCByZW1vdmVFbnRlcik7XHJcbiAgfVxyXG5cclxuICBjb25zdCBkYWlseU5vdGVzID0gYXdhaXQgZ2V0QWxsRGFpbHlOb3RlcygpO1xyXG4gIGNvbnN0IGV4aXN0aW5nRmlsZSA9IGdldERhaWx5Tm90ZShkYXRlLCBkYWlseU5vdGVzKTtcclxuICBpZiAoIWV4aXN0aW5nRmlsZSkge1xyXG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IGNyZWF0ZURhaWx5Tm90ZShkYXRlKTtcclxuICAgIGF3YWl0IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldE15QWxsRGFpbHlOb3RlcygpO1xyXG4gICAgY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChmaWxlKTtcclxuICAgIGNvbnN0IG5ld0ZpbGVDb250ZW50ID0gYXdhaXQgaW5zZXJ0QWZ0ZXJIYW5kbGVyKEluc2VydEFmdGVyLCBuZXdFdmVudCwgZmlsZUNvbnRlbnRzKTtcclxuICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShmaWxlLCBuZXdGaWxlQ29udGVudC5jb250ZW50KTtcclxuICAgIGlmIChuZXdGaWxlQ29udGVudC5wb3NOdW0gPT09IC0xKSB7XHJcbiAgICAgIGNvbnN0IGFsbExpbmVzID0gZ2V0QWxsTGluZXNGcm9tRmlsZShuZXdGaWxlQ29udGVudC5jb250ZW50KTtcclxuICAgICAgbGluZU51bSA9IGFsbExpbmVzLmxlbmd0aCArIDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsaW5lTnVtID0gbmV3RmlsZUNvbnRlbnQucG9zTnVtICsgMTtcclxuICAgIH1cclxuICAgIGlmIChpc0xpc3QpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpZDogZGF0ZS5mb3JtYXQoJ1lZWVlNTURESEhtbScpICsgJzAwJyArIGxpbmVOdW0sXHJcbiAgICAgICAgY29udGVudDogTWVtb0NvbnRlbnQsXHJcbiAgICAgICAgZGVsZXRlZEF0OiAnJyxcclxuICAgICAgICBjcmVhdGVkQXQ6IGRhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyksXHJcbiAgICAgICAgdXBkYXRlZEF0OiBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpLFxyXG4gICAgICAgIG1lbW9UeXBlOiAnVEFTSy1UT0RPJyxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgaWQ6IGRhdGUuZm9ybWF0KCdZWVlZTU1EREhIbW0nKSArICcwMCcgKyBsaW5lTnVtLFxyXG4gICAgICAgIGNvbnRlbnQ6IE1lbW9Db250ZW50LFxyXG4gICAgICAgIGRlbGV0ZWRBdDogJycsXHJcbiAgICAgICAgY3JlYXRlZEF0OiBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpLFxyXG4gICAgICAgIHVwZGF0ZWRBdDogZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKSxcclxuICAgICAgICBtZW1vVHlwZTogJ0pPVVJOQUwnLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKGV4aXN0aW5nRmlsZSk7XHJcbiAgICBjb25zdCBuZXdGaWxlQ29udGVudCA9IGF3YWl0IGluc2VydEFmdGVySGFuZGxlcihJbnNlcnRBZnRlciwgbmV3RXZlbnQsIGZpbGVDb250ZW50cyk7XHJcbiAgICBhd2FpdCB2YXVsdC5tb2RpZnkoZXhpc3RpbmdGaWxlLCBuZXdGaWxlQ29udGVudC5jb250ZW50KTtcclxuICAgIGlmIChuZXdGaWxlQ29udGVudC5wb3NOdW0gPT09IC0xKSB7XHJcbiAgICAgIGNvbnN0IGFsbExpbmVzID0gZ2V0QWxsTGluZXNGcm9tRmlsZShuZXdGaWxlQ29udGVudC5jb250ZW50KTtcclxuICAgICAgbGluZU51bSA9IGFsbExpbmVzLmxlbmd0aCArIDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsaW5lTnVtID0gbmV3RmlsZUNvbnRlbnQucG9zTnVtICsgMTtcclxuICAgIH1cclxuICAgIGlmIChpc0xpc3QpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpZDogZGF0ZS5mb3JtYXQoJ1lZWVlNTURESEhtbScpICsgJzAwJyArIGxpbmVOdW0sXHJcbiAgICAgICAgY29udGVudDogTWVtb0NvbnRlbnQsXHJcbiAgICAgICAgZGVsZXRlZEF0OiAnJyxcclxuICAgICAgICBjcmVhdGVkQXQ6IGRhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyksXHJcbiAgICAgICAgdXBkYXRlZEF0OiBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpLFxyXG4gICAgICAgIG1lbW9UeXBlOiAnVE9ETy1CbGFuaycsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGlkOiBkYXRlLmZvcm1hdCgnWVlZWU1NRERISG1tJykgKyAnMDAnICsgbGluZU51bSxcclxuICAgICAgICBjb250ZW50OiBNZW1vQ29udGVudCxcclxuICAgICAgICBkZWxldGVkQXQ6ICcnLFxyXG4gICAgICAgIGNyZWF0ZWRBdDogZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKSxcclxuICAgICAgICB1cGRhdGVkQXQ6IGRhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOnNzJyksXHJcbiAgICAgICAgbWVtb1R5cGU6ICdKT1VSTkFMJyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vY3JlZGl0IHRvIGNoaG91bWFubiwgb3JpZ2luYWwgY29kZSBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vY2hob3VtYW5uL3F1aWNrYWRkXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnNlcnRBZnRlckhhbmRsZXIodGFyZ2V0U3RyaW5nOiBzdHJpbmcsIGZvcm1hdHRlZDogc3RyaW5nLCBmaWxlQ29udGVudDogc3RyaW5nKSB7XHJcbiAgLy8gY29uc3QgdGFyZ2V0U3RyaW5nOiBzdHJpbmcgPSBwbHVnaW4uc2V0dGluZ3MuSW5zZXJ0QWZ0ZXI7XHJcbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICBjb25zdCB0YXJnZXRSZWdleCA9IG5ldyBSZWdFeHAoYFxccyoke2F3YWl0IGVzY2FwZVJlZ0V4cCh0YXJnZXRTdHJpbmcpfVxccypgKTtcclxuICBjb25zdCBmaWxlQ29udGVudExpbmVzOiBzdHJpbmdbXSA9IGdldExpbmVzSW5TdHJpbmcoZmlsZUNvbnRlbnQpO1xyXG5cclxuICBjb25zdCB0YXJnZXRQb3NpdGlvbiA9IGZpbGVDb250ZW50TGluZXMuZmluZEluZGV4KChsaW5lKSA9PiB0YXJnZXRSZWdleC50ZXN0KGxpbmUpKTtcclxuICBjb25zdCB0YXJnZXROb3RGb3VuZCA9IHRhcmdldFBvc2l0aW9uID09PSAtMTtcclxuICBpZiAodGFyZ2V0Tm90Rm91bmQpIHtcclxuICAgIC8vIGlmICh0aGlzLmNob2ljZS5pbnNlcnRBZnRlcj8uY3JlYXRlSWZOb3RGb3VuZCkge1xyXG4gICAgLy8gICAgIHJldHVybiBhd2FpdCBjcmVhdGVJbnNlcnRBZnRlcklmTm90Rm91bmQoZm9ybWF0dGVkKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBjb25zb2xlLmxvZygndW5hYmxlIHRvIGZpbmQgaW5zZXJ0IGFmdGVyIGxpbmUgaW4gZmlsZS4nKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IG5leHRIZWFkZXJQb3NpdGlvbkFmdGVyVGFyZ2V0UG9zaXRpb24gPSBmaWxlQ29udGVudExpbmVzXHJcbiAgICAuc2xpY2UodGFyZ2V0UG9zaXRpb24gKyAxKVxyXG4gICAgLmZpbmRJbmRleCgobGluZSkgPT4gL14jKyB8LS0tLy50ZXN0KGxpbmUpKTtcclxuICBjb25zdCBmb3VuZE5leHRIZWFkZXIgPSBuZXh0SGVhZGVyUG9zaXRpb25BZnRlclRhcmdldFBvc2l0aW9uICE9PSAtMTtcclxuXHJcbiAgaWYgKGZvdW5kTmV4dEhlYWRlcikge1xyXG4gICAgbGV0IGVuZE9mU2VjdGlvbkluZGV4OiBudW1iZXI7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IG5leHRIZWFkZXJQb3NpdGlvbkFmdGVyVGFyZ2V0UG9zaXRpb24gKyB0YXJnZXRQb3NpdGlvbjsgaSA+IHRhcmdldFBvc2l0aW9uOyBpLS0pIHtcclxuICAgICAgY29uc3QgbGluZUlzTmV3bGluZTogYm9vbGVhbiA9IC9eW1xcc1xcbiBdKiQvLnRlc3QoZmlsZUNvbnRlbnRMaW5lc1tpXSk7XHJcbiAgICAgIGlmICghbGluZUlzTmV3bGluZSkge1xyXG4gICAgICAgIGVuZE9mU2VjdGlvbkluZGV4ID0gaTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghZW5kT2ZTZWN0aW9uSW5kZXgpIGVuZE9mU2VjdGlvbkluZGV4ID0gdGFyZ2V0UG9zaXRpb247XHJcblxyXG4gICAgcmV0dXJuIGF3YWl0IGluc2VydFRleHRBZnRlclBvc2l0aW9uSW5Cb2R5KGZvcm1hdHRlZCwgZmlsZUNvbnRlbnQsIGVuZE9mU2VjdGlvbkluZGV4LCBmb3VuZE5leHRIZWFkZXIpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gYXdhaXQgaW5zZXJ0VGV4dEFmdGVyUG9zaXRpb25JbkJvZHkoZm9ybWF0dGVkLCBmaWxlQ29udGVudCwgZmlsZUNvbnRlbnRMaW5lcy5sZW5ndGggLSAxLCBmb3VuZE5leHRIZWFkZXIpO1xyXG4gIH1cclxuICAvLyByZXR1cm4gaW5zZXJ0VGV4dEFmdGVyUG9zaXRpb25JbkJvZHkoZm9ybWF0dGVkLCBmaWxlQ29udGVudCwgdGFyZ2V0UG9zaXRpb24pO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zZXJ0VGV4dEFmdGVyUG9zaXRpb25JbkJvZHkoXHJcbiAgdGV4dDogc3RyaW5nLFxyXG4gIGJvZHk6IHN0cmluZyxcclxuICBwb3M6IG51bWJlcixcclxuICBmb3VuZD86IGJvb2xlYW4sXHJcbik6IFByb21pc2U8TUNvbnRlbnQ+IHtcclxuICBpZiAocG9zID09PSAtMSkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY29udGVudDogYCR7Ym9keX1cXG4ke3RleHR9YCxcclxuICAgICAgcG9zTnVtOiAtMSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb25zdCBzcGxpdENvbnRlbnQgPSBib2R5LnNwbGl0KCdcXG4nKTtcclxuXHJcbiAgaWYgKGZvdW5kKSB7XHJcbiAgICBjb25zdCBwcmUgPSBzcGxpdENvbnRlbnQuc2xpY2UoMCwgcG9zICsgMSkuam9pbignXFxuJyk7XHJcbiAgICBjb25zdCBwb3N0ID0gc3BsaXRDb250ZW50LnNsaWNlKHBvcyArIDEpLmpvaW4oJ1xcbicpO1xyXG4gICAgLy8gcmV0dXJuIGAke3ByZX1cXG4ke3RleHR9XFxuJHtwb3N0fWA7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjb250ZW50OiBgJHtwcmV9XFxuJHt0ZXh0fVxcbiR7cG9zdH1gLFxyXG4gICAgICBwb3NOdW06IHBvcyxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IHByZSA9IHNwbGl0Q29udGVudC5zbGljZSgwLCBwb3MgKyAxKS5qb2luKCdcXG4nKTtcclxuICAgIGNvbnN0IHBvc3QgPSBzcGxpdENvbnRlbnQuc2xpY2UocG9zICsgMSkuam9pbignXFxuJyk7XHJcbiAgICBpZiAoL1tcXHNcXFNdKj8vZy50ZXN0KHBvc3QpKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgY29udGVudDogYCR7cHJlfVxcbiR7dGV4dH1gLFxyXG4gICAgICAgIHBvc051bTogcG9zLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBjb250ZW50OiBgJHtwcmV9JHt0ZXh0fVxcbiR7cG9zdH1gLFxyXG4gICAgICAgIHBvc051bTogcG9zLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgLy8gcmV0dXJuIGAke3ByZX0ke3RleHR9XFxuJHtwb3N0fWA7XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBnZXRBbGxMaW5lc0Zyb21GaWxlID0gKGNhY2hlOiBzdHJpbmcpID0+IGNhY2hlLnNwbGl0KC9cXHI/XFxuLyk7XHJcbiIsImltcG9ydCB7Z2V0RGFpbHlOb3RlUGF0aH0gZnJvbSAnLi9vYlVwZGF0ZU1lbW8nO1xuaW1wb3J0IHtURmlsZSwgbm9ybWFsaXplUGF0aCwgTm90aWNlfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge21vbWVudH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG5pbXBvcnQge2NyZWF0ZURhaWx5Tm90ZSwgZ2V0QWxsRGFpbHlOb3RlcywgZ2V0RGFpbHlOb3RlfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xuaW1wb3J0IHtpbnNlcnRBZnRlckhhbmRsZXJ9IGZyb20gJy4vb2JDcmVhdGVNZW1vJztcbmltcG9ydCB7SW5zZXJ0QWZ0ZXJ9IGZyb20gJy4uL21lbW9zJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVEZWxldGVkTWVtbyhkZWxldGVkTWVtb2lkOiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XG4gIGNvbnN0IHt2YXVsdCwgbWV0YWRhdGFDYWNoZX0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gIGlmICgvXFxkezE0LH0vLnRlc3QoZGVsZXRlZE1lbW9pZCkpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGdldERhaWx5Tm90ZVBhdGgoKTtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCArICcvZGVsZXRlLm1kJztcbiAgICBjb25zdCBkZWxldGVGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCgnJywgYWJzb2x1dGVQYXRoKTtcblxuICAgIGlmIChkZWxldGVGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgIGxldCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKGRlbGV0ZUZpbGUpO1xuICAgICAgbGV0IGZpbGVMaW5lcyA9IGdldEFsbExpbmVzRnJvbUZpbGUoZmlsZUNvbnRlbnRzKTtcbiAgICAgIGlmIChmaWxlTGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpbmVOdW0gPSBwYXJzZUludChkZWxldGVkTWVtb2lkLnNsaWNlKDE0KSk7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBmaWxlTGluZXNbbGluZU51bSAtIDFdO1xuICAgICAgICBjb25zdCBuZXdEZWxldGVmaWxlQ29udGVudHMgPSBmaWxlQ29udGVudHMucmVwbGFjZShsaW5lLCAnJyk7XG4gICAgICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShkZWxldGVGaWxlLCBuZXdEZWxldGVmaWxlQ29udGVudHMpO1xuICAgICAgICBpZiAoL14tICguKykkLy50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgY29uc3QgaWQgPSBleHRyYWN0SURmcm9tVGV4dChsaW5lKTtcbiAgICAgICAgICBjb25zdCBkYXRlID0gbW9tZW50KGlkLCAnWVlZWU1NRERISG1tc3MnKTtcbiAgICAgICAgICBjb25zdCB0aW1lSG91ciA9IGRhdGUuZm9ybWF0KCdISCcpO1xuICAgICAgICAgIGNvbnN0IHRpbWVNaW51dGUgPSBkYXRlLmZvcm1hdCgnbW0nKTtcblxuICAgICAgICAgIGNvbnN0IG5ld0V2ZW50ID0gYC0gYCArIFN0cmluZyh0aW1lSG91cikgKyBgOmAgKyBTdHJpbmcodGltZU1pbnV0ZSkgKyBgIGAgKyBleHRyYWN0Q29udGVudGZyb21UZXh0KGxpbmUpO1xuICAgICAgICAgIGNvbnN0IGRhaWx5Tm90ZXMgPSBhd2FpdCBnZXRBbGxEYWlseU5vdGVzKCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdGaWxlID0gZ2V0RGFpbHlOb3RlKGRhdGUsIGRhaWx5Tm90ZXMpO1xuICAgICAgICAgIGlmICghZXhpc3RpbmdGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgY3JlYXRlRGFpbHlOb3RlKGRhdGUpO1xuICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChmaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0ZpbGVDb250ZW50ID0gYXdhaXQgaW5zZXJ0QWZ0ZXJIYW5kbGVyKEluc2VydEFmdGVyLCBuZXdFdmVudCwgZmlsZUNvbnRlbnRzKTtcbiAgICAgICAgICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShmaWxlLCBuZXdGaWxlQ29udGVudC5jb250ZW50KTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZWxldGVkQXQ6ICcnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChleGlzdGluZ0ZpbGUpO1xuICAgICAgICAgICAgY29uc3QgbmV3RmlsZUNvbnRlbnQgPSBhd2FpdCBpbnNlcnRBZnRlckhhbmRsZXIoSW5zZXJ0QWZ0ZXIsIG5ld0V2ZW50LCBmaWxlQ29udGVudHMpO1xuICAgICAgICAgICAgYXdhaXQgdmF1bHQubW9kaWZ5KGV4aXN0aW5nRmlsZSwgbmV3RmlsZUNvbnRlbnQuY29udGVudCk7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGVsZXRlZEF0OiAnJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbGVMaW5lcyA9IG51bGw7XG4gICAgICAgIGZpbGVDb250ZW50cyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVGb3JldmVyKGRlbGV0ZWRNZW1vaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7dmF1bHQsIG1ldGFkYXRhQ2FjaGV9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuICBpZiAoL1xcZHsxNCx9Ly50ZXN0KGRlbGV0ZWRNZW1vaWQpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBnZXREYWlseU5vdGVQYXRoKCk7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggKyAnL2RlbGV0ZS5tZCc7XG4gICAgY29uc3QgZGVsZXRlRmlsZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoJycsIGFic29sdXRlUGF0aCk7XG5cbiAgICBpZiAoZGVsZXRlRmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICBsZXQgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChkZWxldGVGaWxlKTtcbiAgICAgIGxldCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBsaW5lTnVtID0gcGFyc2VJbnQoZGVsZXRlZE1lbW9pZC5zbGljZSgxNCkpO1xuICAgICAgICBjb25zdCBsaW5lID0gZmlsZUxpbmVzW2xpbmVOdW0gLSAxXTtcbiAgICAgICAgaWYgKC9eLSAoLispJC8udGVzdChsaW5lKSkge1xuICAgICAgICAgIC8vIGNvbnN0IGlkID0gZXh0cmFjdElEZnJvbVRleHQoZmlsZUxpbmVzW2ldKTtcbiAgICAgICAgICBjb25zdCBuZXdGaWxlQ29udGVudCA9IGZpbGVDb250ZW50cy5yZXBsYWNlKGxpbmUsICcnKTtcbiAgICAgICAgICBhd2FpdCB2YXVsdC5tb2RpZnkoZGVsZXRlRmlsZSwgbmV3RmlsZUNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmaWxlTGluZXMgPSBudWxsO1xuICAgICAgZmlsZUNvbnRlbnRzID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgLy8gcmV0dXJuIGRlbGV0ZWRNZW1vcztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERlbGV0ZWRNZW1vcygpOiBQcm9taXNlPGFueVtdPiB7XG4gIGNvbnN0IHt2YXVsdCwgbWV0YWRhdGFDYWNoZX0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG5cbiAgY29uc3QgZmlsZVBhdGggPSBnZXREYWlseU5vdGVQYXRoKCk7XG4gIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoICsgJy9kZWxldGUubWQnO1xuICBjb25zdCBkZWxldGVkTWVtb3M6IGFueVtdIHwgUHJvbWlzZUxpa2U8YW55W10+ID0gW107XG4gIGNvbnN0IGRlbGV0ZUZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KCcnLCBhYnNvbHV0ZVBhdGgpO1xuICBpZiAoZGVsZXRlRmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgbGV0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQoZGVsZXRlRmlsZSk7XG4gICAgbGV0IGZpbGVMaW5lcyA9IGdldEFsbExpbmVzRnJvbUZpbGUoZmlsZUNvbnRlbnRzKTtcbiAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGRlbGV0ZWRNZW1vcztcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlTGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGZpbGVMaW5lc1tpXTtcbiAgICAgICAgaWYgKCEvLSAvLnRlc3QobGluZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBpZCA9IGV4dHJhY3RJRGZyb21UZXh0KGxpbmUpO1xuICAgICAgICAgIGNvbnN0IHRpbWVTdHJpbmcgPSBpZC5zbGljZSgwLCAxMyk7XG4gICAgICAgICAgLy8gY29uc3QgaWRTdHJpbmcgPSBwYXJzZUludChpZC5zbGljZSgxNCkpO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZWREYXRlID0gbW9tZW50KHRpbWVTdHJpbmcsICdZWVlZTU1EREhIbW1zcycpO1xuICAgICAgICAgIGNvbnN0IGRlbGV0ZWREYXRlSUQgPSBleHRyYWN0RGVsZXRlRGF0ZWZyb21UZXh0KGZpbGVMaW5lc1tpXSk7XG4gICAgICAgICAgY29uc3QgZGVsZXRlZERhdGUgPSBtb21lbnQoZGVsZXRlZERhdGVJRC5zbGljZSgwLCAxMyksICdZWVlZTU1EREhIbW1zcycpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBleHRyYWN0Q29udGVudGZyb21UZXh0KGZpbGVMaW5lc1tpXSk7XG4gICAgICAgICAgZGVsZXRlZE1lbW9zLnB1c2goe1xuICAgICAgICAgICAgaWQ6IGRlbGV0ZWREYXRlSUQsXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxuICAgICAgICAgICAgdXNlcl9pZDogMSxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogY3JlYXRlZERhdGUuZm9ybWF0KCdZWVlZL01NL0REIEhIOm1tOlNTJyksXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IGNyZWF0ZWREYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpTUycpLFxuICAgICAgICAgICAgZGVsZXRlZEF0OiBkZWxldGVkRGF0ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZpbGVMaW5lcyA9IG51bGw7XG4gICAgZmlsZUNvbnRlbnRzID0gbnVsbDtcbiAgfVxuICByZXR1cm4gZGVsZXRlZE1lbW9zO1xufVxuXG5leHBvcnQgY29uc3Qgc2VuZE1lbW9Ub0RlbGV0ZSA9IGFzeW5jIChtZW1vQ29udGVudDogc3RyaW5nKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcblxuICBjb25zdCBmaWxlUGF0aCA9IGdldERhaWx5Tm90ZVBhdGgoKTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggKyAnL2RlbGV0ZS5tZCc7XG5cbiAgY29uc3QgZGVsZXRlRmlsZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoJycsIGFic29sdXRlUGF0aCk7XG5cbiAgaWYgKGRlbGV0ZUZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgIGNvbnN0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQoZGVsZXRlRmlsZSk7XG4gICAgY29uc3QgZmlsZUxpbmVzID0gZ2V0QWxsTGluZXNGcm9tRmlsZShmaWxlQ29udGVudHMpO1xuICAgIGNvbnN0IGRhdGUgPSBtb21lbnQoKTtcbiAgICBjb25zdCBkZWxldGVEYXRlID0gZGF0ZS5mb3JtYXQoJ1lZWVkvTU0vREQgSEg6bW06c3MnKTtcbiAgICBsZXQgbGluZU51bTtcbiAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMSAmJiBmaWxlTGluZXNbMF0gPT09ICcnKSB7XG4gICAgICBsaW5lTnVtID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZU51bSA9IGZpbGVMaW5lcy5sZW5ndGggKyAxO1xuICAgIH1cbiAgICBjb25zdCBkZWxldGVEYXRlSUQgPSBkYXRlLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKSArIGxpbmVOdW07XG5cbiAgICBhd2FpdCBjcmVhdGVEZWxldGVNZW1vSW5GaWxlKGRlbGV0ZUZpbGUsIGZpbGVDb250ZW50cywgbWVtb0NvbnRlbnQsIGRlbGV0ZURhdGVJRCk7XG5cbiAgICByZXR1cm4gZGVsZXRlRGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZWxldGVGaWxlUGF0aCA9IG5vcm1hbGl6ZVBhdGgoYWJzb2x1dGVQYXRoKTtcbiAgICBjb25zdCBmaWxlID0gYXdhaXQgY3JlYXRlZGVsZXRlRmlsZShkZWxldGVGaWxlUGF0aCk7XG4gICAgLy8gY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChkZWxldGVGaWxlKTtcbiAgICAvLyBjb25zdCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgY29uc3QgZGF0ZSA9IG1vbWVudCgpO1xuICAgIGNvbnN0IGRlbGV0ZURhdGUgPSBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuICAgIGNvbnN0IGxpbmVOdW0gPSAxO1xuICAgIGNvbnN0IGRlbGV0ZURhdGVJRCA9IGRhdGUuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpICsgbGluZU51bTtcblxuICAgIGF3YWl0IGNyZWF0ZURlbGV0ZU1lbW9JbkZpbGUoZmlsZSwgJycsIG1lbW9Db250ZW50LCBkZWxldGVEYXRlSUQpO1xuXG4gICAgcmV0dXJuIGRlbGV0ZURhdGU7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVEZWxldGVNZW1vSW5GaWxlID0gYXN5bmMgKFxuICBmaWxlOiBURmlsZSxcbiAgZmlsZUNvbnRlbnQ6IHN0cmluZyxcbiAgbWVtb0NvbnRlbnQ6IHN0cmluZyxcbiAgZGVsZXRlRGF0ZTogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgbGV0IG5ld0NvbnRlbnQ7XG4gIGlmIChmaWxlQ29udGVudCA9PT0gJycpIHtcbiAgICBuZXdDb250ZW50ID0gbWVtb0NvbnRlbnQgKyAnIGRlbGV0ZWRBdDogJyArIGRlbGV0ZURhdGU7XG4gIH0gZWxzZSB7XG4gICAgbmV3Q29udGVudCA9IGZpbGVDb250ZW50ICsgJ1xcbicgKyBtZW1vQ29udGVudCArICcgZGVsZXRlZEF0OiAnICsgZGVsZXRlRGF0ZTtcbiAgfVxuXG4gIGF3YWl0IHZhdWx0Lm1vZGlmeShmaWxlLCBuZXdDb250ZW50KTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVkZWxldGVGaWxlID0gYXN5bmMgKHBhdGg6IHN0cmluZyk6IFByb21pc2U8VEZpbGU+ID0+IHtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcblxuICB0cnkge1xuICAgIGNvbnN0IGNyZWF0ZWRGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlKHBhdGgsICcnKTtcbiAgICByZXR1cm4gY3JlYXRlZEZpbGU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZTogJyR7cGF0aH0nYCwgZXJyKTtcbiAgICBuZXcgTm90aWNlKCdVbmFibGUgdG8gY3JlYXRlIG5ldyBmaWxlLicpO1xuICB9XG59O1xuXG5jb25zdCBnZXRBbGxMaW5lc0Zyb21GaWxlID0gKGNhY2hlOiBzdHJpbmcpID0+IGNhY2hlLnNwbGl0KC9cXHI/XFxuLyk7XG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuY29uc3QgZXh0cmFjdElEZnJvbVRleHQgPSAobGluZTogc3RyaW5nKSA9PiAvXi0gKFxcZHsxNH0pKFxcZCspXFxzKC4rKVxccyhkZWxldGVkQXQ6ICkoLispJC8uZXhlYyhsaW5lKT8uWzFdO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGV4dHJhY3RDb250ZW50ZnJvbVRleHQgPSAobGluZTogc3RyaW5nKSA9PiAvXi0gKFxcZCspXFxzKC4rKVxccyhkZWxldGVkQXQ6ICkoLispJC8uZXhlYyhsaW5lKT8uWzJdO1xuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmNvbnN0IGV4dHJhY3REZWxldGVEYXRlZnJvbVRleHQgPSAobGluZTogc3RyaW5nKSA9PiAvXi0gKFxcZCspXFxzKC4rKVxccyhkZWxldGVkQXQ6ICkoLispJC8uZXhlYyhsaW5lKT8uWzRdO1xuLy8gY29uc3QgZXh0cmFjdE1lbW9UYXNrVHlwZUZyb21MaW5lID0gKGxpbmU6IHN0cmluZykgPT5cbi8vICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbi8vICAgL15cXHMqW1xcLVxcKl1cXHMoXFxbKC57MX0pXFxdKVxccyguKikkLy5leGVjKGxpbmUpPy5bMl07XG4iLCJpbXBvcnQge21vbWVudH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtnZXREYWlseU5vdGV9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XG5pbXBvcnQge0RlZmF1bHRNZW1vQ29tcG9zaXRpb259IGZyb20gJy4uL21lbW9zJztcbi8vIGltcG9ydCBhcHBTdG9yZSBmcm9tIFwiLi4vc3RvcmVzL2FwcFN0b3JlXCI7XG5pbXBvcnQgZGFpbHlOb3Rlc1NlcnZpY2UgZnJvbSAnLi4vc2VydmljZXMvZGFpbHlOb3Rlc1NlcnZpY2UnO1xuLy8gaW1wb3J0IHsgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuaW1wb3J0IHtzZW5kTWVtb1RvRGVsZXRlfSBmcm9tICcuL29iRGVsZXRlTWVtbyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvYkhpZGVNZW1vKG1lbW9pZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbC5NZW1vPiB7XG4gIGNvbnN0IHtkYWlseU5vdGVzfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XG4gIGlmICgvXFxkezE0LH0vLnRlc3QobWVtb2lkKSkge1xuICAgIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XG4gICAgY29uc3QgdGltZVN0cmluZyA9IG1lbW9pZC5zbGljZSgwLCAxMyk7XG4gICAgY29uc3QgaWRTdHJpbmcgPSBwYXJzZUludChtZW1vaWQuc2xpY2UoMTQpKTtcbiAgICBjb25zdCBjaGFuZ2VEYXRlID0gbW9tZW50KHRpbWVTdHJpbmcsICdZWVlZTU1EREhIbW1TUycpO1xuICAgIGNvbnN0IGRhaWx5Tm90ZSA9IGdldERhaWx5Tm90ZShjaGFuZ2VEYXRlLCBkYWlseU5vdGVzKTtcbiAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IHZhdWx0LnJlYWQoZGFpbHlOb3RlKTtcbiAgICBjb25zdCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50KTtcbiAgICBjb25zdCBjb250ZW50ID0gZXh0cmFjdENvbnRlbnRmcm9tVGV4dChmaWxlTGluZXNbaWRTdHJpbmddKTtcbiAgICBjb25zdCBvcmlnaW5hbExpbmUgPSAnLSAnICsgbWVtb2lkICsgJyAnICsgY29udGVudDtcbiAgICBjb25zdCBuZXdMaW5lID0gZmlsZUxpbmVzW2lkU3RyaW5nXTtcbiAgICBjb25zdCBuZXdGaWxlQ29udGVudCA9IGZpbGVDb250ZW50LnJlcGxhY2UobmV3TGluZSwgJycpO1xuICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShkYWlseU5vdGUsIG5ld0ZpbGVDb250ZW50KTtcbiAgICBjb25zdCBkZWxldGVEYXRlID0gYXdhaXQgc2VuZE1lbW9Ub0RlbGV0ZShvcmlnaW5hbExpbmUpO1xuICAgIHJldHVybiBkZWxldGVEYXRlO1xuICB9XG59XG5cbmNvbnN0IGdldEFsbExpbmVzRnJvbUZpbGUgPSAoY2FjaGU6IHN0cmluZykgPT4gY2FjaGUuc3BsaXQoL1xccj9cXG4vKTtcbmNvbnN0IGV4dHJhY3RDb250ZW50ZnJvbVRleHQgPSAobGluZTogc3RyaW5nKSA9PiB7XG4gIGxldCByZWdleE1hdGNoO1xuICBpZiAoXG4gICAgRGVmYXVsdE1lbW9Db21wb3NpdGlvbiAhPSAnJyAmJlxuICAgIC97VElNRX0vZy50ZXN0KERlZmF1bHRNZW1vQ29tcG9zaXRpb24pICYmXG4gICAgL3tDT05URU5UfS9nLnRlc3QoRGVmYXVsdE1lbW9Db21wb3NpdGlvbilcbiAgKSB7XG4gICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICByZWdleE1hdGNoID0gJ15cXFxccypbXFxcXC1cXFxcKl1cXFxccyhcXFxcWyguezF9KVxcXFxdXFxcXHM/KT8nICtcbiAgICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24ucmVwbGFjZSgve1RJTUV9L2csICcoXFxcXDx0aW1lXFxcXD4pPygoXFxcXGR7MSwyfSlcXFxcOihcXFxcZHsyfSkpPyhcXFxcPFxcXFwvdGltZVxcXFw+KT8nKS5yZXBsYWNlKFxuICAgICAgICAve0NPTlRFTlR9L2csXG4gICAgICAgICcoLiopJCcsXG4gICAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgcmVnZXhNYXRjaCA9ICdeXFxcXHMqW1xcXFwtXFxcXCpdXFxcXHMoXFxcXFsoLnsxfSlcXFxcXVxcXFxzPyk/KFxcXFw8dGltZVxcXFw+KT8oKFxcXFxkezEsMn0pXFxcXDooXFxcXGR7Mn0pKT8oXFxcXDxcXFxcL3RpbWVcXFxcPik/XFxcXHM/KC4qKSQnO1xuICB9XG4gIGNvbnN0IHJlZ2V4TWF0Y2hSZSA9IG5ldyBSZWdFeHAocmVnZXhNYXRjaCwgJycpO1xuICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICByZXR1cm4gcmVnZXhNYXRjaFJlLmV4ZWMobGluZSk/Lls4XTtcbiAgLy8gcmV0dXJuIC9eXFxzKltcXC1cXCpdXFxzKFxcWyguezF9KVxcXVxccz8pPyhcXDx0aW1lXFw+KT8oKFxcZHsxLDJ9KVxcOihcXGR7Mn0pKT8oXFw8XFwvdGltZVxcPik/XFxzPyguKikkLy5leGVjKGxpbmUpPy5bOF07XG59O1xuIiwiaW1wb3J0IHtnZXREYWlseU5vdGVQYXRofSBmcm9tICcuL29iVXBkYXRlTWVtbyc7XG5pbXBvcnQge1RGaWxlfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVF1ZXJ5Rm9yZXZlcihxdWVyeUlEOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge3ZhdWx0LCBtZXRhZGF0YUNhY2hlfSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgaWYgKC9cXGR7MTQsfS8udGVzdChxdWVyeUlEKSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gZ2V0RGFpbHlOb3RlUGF0aCgpO1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoICsgJy9xdWVyeS5tZCc7XG4gICAgY29uc3QgcXVlcnlGaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdCgnJywgYWJzb2x1dGVQYXRoKTtcblxuICAgIGlmIChxdWVyeUZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgbGV0IGZpbGVDb250ZW50cyA9IGF3YWl0IHZhdWx0LnJlYWQocXVlcnlGaWxlKTtcbiAgICAgIGxldCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBsaW5lTnVtID0gcGFyc2VJbnQocXVlcnlJRC5zbGljZSgxNCkpO1xuICAgICAgICBjb25zdCBsaW5lID0gZmlsZUxpbmVzW2xpbmVOdW0gLSAxXTtcbiAgICAgICAgaWYgKC9eXFxkezE0LH0oLispJC8udGVzdChsaW5lKSkge1xuICAgICAgICAgIC8vIGNvbnN0IGlkID0gZXh0cmFjdElEZnJvbVRleHQoZmlsZUxpbmVzW2ldKTtcbiAgICAgICAgICBjb25zdCBuZXdGaWxlQ29udGVudCA9IGZpbGVDb250ZW50cy5yZXBsYWNlKGxpbmUsICcnKTtcbiAgICAgICAgICBhd2FpdCB2YXVsdC5tb2RpZnkocXVlcnlGaWxlLCBuZXdGaWxlQ29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZpbGVMaW5lcyA9IG51bGw7XG4gICAgICBmaWxlQ29udGVudHMgPSBudWxsO1xuICAgIH1cbiAgfVxuICAvLyByZXR1cm4gZGVsZXRlZE1lbW9zO1xufVxuXG5jb25zdCBnZXRBbGxMaW5lc0Zyb21GaWxlID0gKGNhY2hlOiBzdHJpbmcpID0+IGNhY2hlLnNwbGl0KC9cXHI/XFxuLyk7XG4iLCJpbXBvcnQge2dldERhaWx5Tm90ZVBhdGh9IGZyb20gJy4vb2JVcGRhdGVNZW1vJztcbmltcG9ydCB7VEZpbGUsIE5vdGljZX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuXG5leHBvcnQgY29uc3QgcGluUXVlcnlJbkZpbGUgPSBhc3luYyAocXVlcnlJRDogc3RyaW5nKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgaWYgKC9cXGR7MTQsfS8udGVzdChxdWVyeUlEKSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gZ2V0RGFpbHlOb3RlUGF0aCgpO1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IGZpbGVQYXRoICsgJy9xdWVyeS5tZCc7XG5cbiAgICBjb25zdCBxdWVyeUZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KCcnLCBhYnNvbHV0ZVBhdGgpO1xuXG4gICAgaWYgKHF1ZXJ5RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICBjb25zdCBmaWxlQ29udGVudHMgPSBhd2FpdCB2YXVsdC5yZWFkKHF1ZXJ5RmlsZSk7XG4gICAgICBjb25zdCBmaWxlTGluZXMgPSBnZXRBbGxMaW5lc0Zyb21GaWxlKGZpbGVDb250ZW50cyk7XG4gICAgICBjb25zdCBkYXRlID0gbW9tZW50KCk7XG4gICAgICBjb25zdCBvcmlnaW5hbExpbmVOdW0gPSBwYXJzZUludChxdWVyeUlELnNsaWNlKDE0KSk7XG4gICAgICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBmaWxlTGluZXNbb3JpZ2luYWxMaW5lTnVtIC0gMV07XG4gICAgICBjb25zdCBwaW5uZWRBdERhdGUgPSBkYXRlLmZvcm1hdCgnWVlZWS9NTS9ERCBISDptbTpzcycpO1xuICAgICAgbGV0IGxpbmVOdW07XG4gICAgICBpZiAoZmlsZUxpbmVzLmxlbmd0aCA9PT0gMSAmJiBmaWxlTGluZXNbMF0gPT09ICcnKSB7XG4gICAgICAgIGxpbmVOdW0gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZU51bSA9IGZpbGVMaW5lcy5sZW5ndGggKyAxO1xuICAgICAgfVxuICAgICAgY29uc3QgcGlubmVkQXREYXRlSUQgPSBkYXRlLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKSArIGxpbmVOdW07XG4gICAgICBjb25zdCBuZXdRdWVyeSA9IG9yaWdpbmFsQ29udGVudCArICcgcGlubmVkQXQ6ICcgKyBwaW5uZWRBdERhdGVJRDtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBmaWxlQ29udGVudHMucmVwbGFjZShvcmlnaW5hbENvbnRlbnQsIG5ld1F1ZXJ5KTtcbiAgICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShxdWVyeUZpbGUsIG5ld0NvbnRlbnQpO1xuICAgICAgLy8gYXdhaXQgY3JlYXRlRGVsZXRlTWVtb0luRmlsZShxdWVyeUZpbGUsIGZpbGVDb250ZW50cyAsIG9yaWdpbmFsQ29udGVudCAsIHBpbm5lZEF0RGF0ZUlEKTtcbiAgICAgIHJldHVybiBwaW5uZWRBdERhdGU7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgdW5waW5RdWVyeUluRmlsZSA9IGFzeW5jIChxdWVyeUlEOiBzdHJpbmcpOiBQcm9taXNlPGFueT4gPT4ge1xuICBjb25zdCB7bWV0YWRhdGFDYWNoZSwgdmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuXG4gIGNvbnN0IGZpbGVQYXRoID0gZ2V0RGFpbHlOb3RlUGF0aCgpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCArICcvcXVlcnkubWQnO1xuXG4gIGNvbnN0IHF1ZXJ5RmlsZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoJycsIGFic29sdXRlUGF0aCk7XG5cbiAgaWYgKHF1ZXJ5RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgY29uc3QgZmlsZUNvbnRlbnRzID0gYXdhaXQgdmF1bHQucmVhZChxdWVyeUZpbGUpO1xuICAgIGNvbnN0IGZpbGVMaW5lcyA9IGdldEFsbExpbmVzRnJvbUZpbGUoZmlsZUNvbnRlbnRzKTtcbiAgICBjb25zdCBvcmlnaW5hbExpbmVOdW0gPSBwYXJzZUludChxdWVyeUlELnNsaWNlKDE0KSk7XG4gICAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZmlsZUxpbmVzW29yaWdpbmFsTGluZU51bSAtIDFdO1xuICAgIGNvbnN0IHBpbm5lZEF0U3RyaW5nID0gZXh0cmFjdFBpbm5lZEF0ZnJvbVRleHQob3JpZ2luYWxDb250ZW50KTtcbiAgICBjb25zdCBuZXdGaWxlQ29udGVudHMgPSBmaWxlQ29udGVudHMucmVwbGFjZShwaW5uZWRBdFN0cmluZywgJycpO1xuICAgIGF3YWl0IHZhdWx0Lm1vZGlmeShxdWVyeUZpbGUsIG5ld0ZpbGVDb250ZW50cyk7XG4gIH1cbiAgcmV0dXJuO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZURlbGV0ZU1lbW9JbkZpbGUgPSBhc3luYyAoXG4gIGZpbGU6IFRGaWxlLFxuICBmaWxlQ29udGVudDogc3RyaW5nLFxuICBtZW1vQ29udGVudDogc3RyaW5nLFxuICBwaW5uZWRBdERhdGVJRDogc3RyaW5nLFxuKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgY29uc3Qge3ZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcbiAgbGV0IG5ld0NvbnRlbnQ7XG4gIGlmIChmaWxlQ29udGVudCA9PT0gJycpIHtcbiAgICBuZXdDb250ZW50ID0gbWVtb0NvbnRlbnQgKyAnIHBpbm5lZEF0OiAnICsgcGlubmVkQXREYXRlSUQ7XG4gIH0gZWxzZSB7XG4gICAgbmV3Q29udGVudCA9IGZpbGVDb250ZW50ICsgJ1xcbicgKyBtZW1vQ29udGVudCArICcgcGlubmVkQXQ6ICcgKyBwaW5uZWRBdERhdGVJRDtcbiAgfVxuXG4gIGF3YWl0IHZhdWx0Lm1vZGlmeShmaWxlLCBuZXdDb250ZW50KTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVxdWVyeUZpbGUgPSBhc3luYyAocGF0aDogc3RyaW5nKTogUHJvbWlzZTxURmlsZT4gPT4ge1xuICBjb25zdCB7dmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY3JlYXRlZEZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUocGF0aCwgJycpO1xuICAgIHJldHVybiBjcmVhdGVkRmlsZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmaWxlOiAnJHtwYXRofSdgLCBlcnIpO1xuICAgIG5ldyBOb3RpY2UoJ1VuYWJsZSB0byBjcmVhdGUgbmV3IGZpbGUuJyk7XG4gIH1cbn07XG5cbmNvbnN0IGdldEFsbExpbmVzRnJvbUZpbGUgPSAoY2FjaGU6IHN0cmluZykgPT4gY2FjaGUuc3BsaXQoL1xccj9cXG4vKTtcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBleHRyYWN0UGlubmVkQXRmcm9tVGV4dCA9IChsaW5lOiBzdHJpbmcpID0+L14oXFxkezE0fSkoXFxkezEsfSlcXHMoLispXFxzKFxcWyguKylcXF0pKFxcc3Bpbm5lZEF0XFw6IChcXGR7MTQsfSkpJC8uZXhlYyhsaW5lKT8uWzZdO1xuIiwiLy8gaW1wb3J0IHV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCB7ZmluZFF1ZXJ5fSBmcm9tICcuLi9vYkNvbXBvbmVudHMvb2JHZXRRdWVyaWVzJztcbmltcG9ydCB7Y3JlYXRlT2JzaWRpYW5RdWVyeX0gZnJvbSAnLi4vb2JDb21wb25lbnRzL29iQ3JlYXRlUXVlcnknO1xuaW1wb3J0IHtnZXRNZW1vc30gZnJvbSAnLi4vb2JDb21wb25lbnRzL29iR2V0TWVtb3MnO1xuaW1wb3J0IHt1cGRhdGVPYnNpZGlhblF1ZXJ5fSBmcm9tICcuLi9vYkNvbXBvbmVudHMvb2JVcGRhdGVRdWVyeSc7XG5pbXBvcnQge29iSGlkZU1lbW99IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYkhpZGVNZW1vJztcbmltcG9ydCB7ZGVsZXRlRm9yZXZlciwgZ2V0RGVsZXRlZE1lbW9zLCByZXN0b3JlRGVsZXRlZE1lbW99IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYkRlbGV0ZU1lbW8nO1xuaW1wb3J0IHtkZWxldGVRdWVyeUZvcmV2ZXJ9IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYkRlbGV0ZVF1ZXJ5JztcbmltcG9ydCB7cGluUXVlcnlJbkZpbGUsIHVucGluUXVlcnlJbkZpbGV9IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYlBpblF1ZXJ5JztcblxuLy8gdHlwZSBSZXNwb25zZVR5cGU8VCA9IHVua25vd24+ID0ge1xuLy8gICBzdWNjZWVkOiBib29sZWFuO1xuLy8gICBtZXNzYWdlOiBzdHJpbmc7XG4vLyAgIGRhdGE6IFQ7XG4vLyB9O1xuXG4vLyB0eXBlIFJlcXVlc3RDb25maWcgPSB7XG4vLyAgIG1ldGhvZDogc3RyaW5nO1xuLy8gICB1cmw6IHN0cmluZztcbi8vICAgZGF0YT86IGFueTtcbi8vICAgZGF0YVR5cGU/OiBcImpzb25cIiB8IFwiZmlsZVwiO1xuLy8gfTtcblxuLy8gYXN5bmMgZnVuY3Rpb24gcmVxdWVzdDxUPihjb25maWc6IFJlcXVlc3RDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlVHlwZTxUPj4ge1xuLy8gICBjb25zdCB7IG1ldGhvZCwgdXJsLCBkYXRhLCBkYXRhVHlwZSB9ID0gY29uZmlnO1xuLy8gICBjb25zdCByZXF1ZXN0Q29uZmlnOiBSZXF1ZXN0SW5pdCA9IHtcbi8vICAgICBtZXRob2QsXG4vLyAgIH07XG5cbi8vICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuLy8gICAgIGlmIChkYXRhVHlwZSA9PT0gXCJmaWxlXCIpIHtcbi8vICAgICAgIHJlcXVlc3RDb25maWcuYm9keSA9IGRhdGE7XG4vLyAgICAgfSBlbHNlIHtcbi8vICAgICAgIHJlcXVlc3RDb25maWcuaGVhZGVycyA9IHtcbi8vICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4vLyAgICAgICB9O1xuLy8gICAgICAgcmVxdWVzdENvbmZpZy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4vLyAgICAgfVxuLy8gICB9XG5cbi8vICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHJlcXVlc3RDb25maWcpO1xuLy8gICBjb25zdCByZXNwb25zZURhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBSZXNwb25zZVR5cGU8VD47XG5cbi8vICAgaWYgKCFyZXNwb25zZURhdGEuc3VjY2VlZCkge1xuLy8gICAgIHRocm93IHJlc3BvbnNlRGF0YTtcbi8vICAgfVxuXG4vLyAgIHJldHVybiByZXNwb25zZURhdGE7XG4vLyB9XG5cbm5hbWVzcGFjZSBhcGkge1xuICBleHBvcnQgZnVuY3Rpb24gZ2V0VXNlckluZm8oKSB7XG4gICAgLy8gcmV0dXJuIHJlcXVlc3Q8TW9kZWwuVXNlcj4oe1xuICAgIC8vICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIC8vICAgdXJsOiBcIi9hcGkvdXNlci9tZVwiLFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNpZ25pbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSB7XG4gIC8vICAgcmV0dXJuIHJlcXVlc3Qoe1xuICAvLyAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgLy8gICAgIHVybDogXCIvYXBpL2F1dGgvc2lnbmluXCIsXG4gIC8vICAgICBkYXRhOiB7IHVzZXJuYW1lLCBwYXNzd29yZCB9LFxuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNpZ251cCh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSB7XG4gIC8vICAgcmV0dXJuIHJlcXVlc3Qoe1xuICAvLyAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgLy8gICAgIHVybDogXCIvYXBpL2F1dGgvc2lnbnVwXCIsXG4gIC8vICAgICBkYXRhOiB7IHVzZXJuYW1lLCBwYXNzd29yZCB9LFxuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNpZ25vdXQoKSB7XG4gIC8vICAgcmV0dXJuIHJlcXVlc3Qoe1xuICAvLyAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgLy8gICAgIHVybDogXCIvYXBpL2F1dGgvc2lnbm91dFwiLFxuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVXNlcm5hbWVVc2FibGUodXNlcm5hbWU6IHN0cmluZykge1xuICAgIC8vIHJldHVybiByZXF1ZXN0PGJvb2xlYW4+KHtcbiAgICAvLyAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgLy8gICB1cmw6IFwiL2FwaS91c2VyL2NoZWNrdXNlcm5hbWVcIixcbiAgICAvLyAgIGRhdGE6IHsgdXNlcm5hbWUgfSxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiBjaGVja1Bhc3N3b3JkVmFsaWQocGFzc3dvcmQ6IHN0cmluZykge1xuICAgIC8vIHJldHVybiByZXF1ZXN0PGJvb2xlYW4+KHtcbiAgICAvLyAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgLy8gICB1cmw6IFwiL2FwaS91c2VyL3ZhbGlkcGFzc3dvcmRcIixcbiAgICAvLyAgIGRhdGE6IHsgcGFzc3dvcmQgfSxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiB1cGRhdGVVc2VyaW5mbyh1c2VyaW5mbzogUGFydGlhbDx7dXNlcm5hbWU6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZzsgZ2l0aHViTmFtZTogc3RyaW5nfT4pIHtcbiAgICAvLyByZXR1cm4gcmVxdWVzdCh7XG4gICAgLy8gICBtZXRob2Q6IFwiUEFUQ0hcIixcbiAgICAvLyAgIHVybDogXCIvYXBpL3VzZXIvbWVcIixcbiAgICAvLyAgIGRhdGE6IHVzZXJpbmZvLFxuICAgIC8vIH0pO1xuICB9XG5cbiAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE15TWVtb3MoKSB7XG4gICAgcmV0dXJuIGF3YWl0IGdldE1lbW9zKCk7XG5cbiAgICAvLyByZXR1cm4gcmVxdWVzdDxNb2RlbC5NZW1vW10+KHtcbiAgICAvLyAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAvLyAgIHVybDogXCIvYXBpL21lbW8vYWxsXCIsXG4gICAgLy8gfSk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZ2V0TXlEZWxldGVkTWVtb3MoKSB7XG4gICAgcmV0dXJuIGdldERlbGV0ZWRNZW1vcygpO1xuICAgIC8vIHJldHVybiByZXF1ZXN0PE1vZGVsLk1lbW9bXT4oe1xuICAgIC8vICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIC8vICAgdXJsOiBcIi9hcGkvbWVtby9hbGw/ZGVsZXRlZD10cnVlXCIsXG4gICAgLy8gfSk7XG4gIH1cblxuICAvLyBleHBvcnQgZnVuY3Rpb24gY3JlYXRlTWVtbyhjb250ZW50OiBzdHJpbmcpIHtcbiAgLy8gICByZXR1cm4gY3JlYXRlTWVtb3MoY29udGVudCk7XG4gIC8vICAgLy8gcmV0dXJuIHJlcXVlc3Q8TW9kZWwuTWVtbz4oe1xuICAvLyAgIC8vICAgbWV0aG9kOiBcIlBVVFwiLFxuICAvLyAgIC8vICAgdXJsOiBcIi9hcGkvbWVtby9cIixcbiAgLy8gICAvLyAgIGRhdGE6IHsgY29udGVudCB9LFxuICAvLyAgIC8vIH0pO1xuICAvLyB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZU1lbW8obWVtb0lkOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZykge1xuICAvLyAgIC8vIHJldHVybiByZXF1ZXN0PE1vZGVsLk1lbW8+KHtcbiAgLy8gICAvLyAgIG1ldGhvZDogXCJQQVRDSFwiLFxuICAvLyAgIC8vICAgdXJsOiBgL2FwaS9tZW1vLyR7bWVtb0lkfWAsXG4gIC8vICAgLy8gICBkYXRhOiB7IGNvbnRlbnQgfSxcbiAgLy8gICAvLyB9KTtcbiAgLy8gfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiBoaWRlTWVtbyhtZW1vSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBvYkhpZGVNZW1vKG1lbW9JZCk7XG4gICAgLy8gcmV0dXJuIHJlcXVlc3Qoe1xuICAgIC8vICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL21lbW8vJHttZW1vSWR9YCxcbiAgICAvLyAgIGRhdGE6IHtcbiAgICAvLyAgICAgZGVsZXRlZEF0OiB1dGlscy5nZXREYXRlVGltZVN0cmluZyhEYXRlLm5vdygpKSxcbiAgICAvLyAgIH0sXG4gICAgLy8gfSk7XG4gIH1cblxuICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBleHBvcnQgZnVuY3Rpb24gcmVzdG9yZU1lbW8obWVtb0lkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVzdG9yZURlbGV0ZWRNZW1vKG1lbW9JZCk7XG4gICAgLy8gcmV0dXJuIHJlcXVlc3Qoe1xuICAgIC8vICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL21lbW8vJHttZW1vSWR9YCxcbiAgICAvLyAgIGRhdGE6IHtcbiAgICAvLyAgICAgZGVsZXRlZEF0OiBcIlwiLFxuICAgIC8vICAgfSxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWxldGVNZW1vKG1lbW9JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRlbGV0ZUZvcmV2ZXIobWVtb0lkKTtcbiAgICAvLyByZXR1cm4gcmVxdWVzdCh7XG4gICAgLy8gICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL21lbW8vJHttZW1vSWR9YCxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRNeVF1ZXJpZXMoKSB7XG4gICAgcmV0dXJuIGZpbmRRdWVyeSgpO1xuICAgIC8vIHJldHVybiByZXF1ZXN0PE1vZGVsLlF1ZXJ5W10+KHtcbiAgICAvLyAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAvLyAgIHVybDogXCIvYXBpL3F1ZXJ5L2FsbFwiLFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVF1ZXJ5KHRpdGxlOiBzdHJpbmcsIHF1ZXJ5c3RyaW5nOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY3JlYXRlT2JzaWRpYW5RdWVyeSh0aXRsZSwgcXVlcnlzdHJpbmcpO1xuICAgIC8vIHJldHVybiByZXF1ZXN0PE1vZGVsLlF1ZXJ5Pih7XG4gICAgLy8gICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgLy8gICB1cmw6IFwiL2FwaS9xdWVyeS9cIixcbiAgICAvLyAgIGRhdGE6IHsgdGl0bGUsIHF1ZXJ5c3RyaW5nIH0sXG4gICAgLy8gfSk7XG4gIH1cblxuICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBleHBvcnQgZnVuY3Rpb24gdXBkYXRlUXVlcnkocXVlcnlJZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nLCBxdWVyeXN0cmluZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHVwZGF0ZU9ic2lkaWFuUXVlcnkocXVlcnlJZCwgdGl0bGUsIHF1ZXJ5c3RyaW5nKTtcbiAgICAvLyByZXR1cm4gcmVxdWVzdDxNb2RlbC5RdWVyeT4oe1xuICAgIC8vICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL3F1ZXJ5LyR7cXVlcnlJZH1gLFxuICAgIC8vICAgZGF0YTogeyB0aXRsZSwgcXVlcnlzdHJpbmcgfSxcbiAgICAvLyB9KTtcbiAgfVxuXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGV4cG9ydCBmdW5jdGlvbiBkZWxldGVRdWVyeUJ5SWQocXVlcnlJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRlbGV0ZVF1ZXJ5Rm9yZXZlcihxdWVyeUlkKTtcbiAgICAvLyByZXR1cm4gcmVxdWVzdCh7XG4gICAgLy8gICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL3F1ZXJ5LyR7cXVlcnlJZH1gLFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgZXhwb3J0IGZ1bmN0aW9uIHBpblF1ZXJ5KHF1ZXJ5SWQ6IHN0cmluZykge1xuICAgIHJldHVybiBwaW5RdWVyeUluRmlsZShxdWVyeUlkKTtcbiAgICAvLyByZXR1cm4gcmVxdWVzdCh7XG4gICAgLy8gICBtZXRob2Q6IFwiUEFUQ0hcIixcbiAgICAvLyAgIHVybDogYC9hcGkvcXVlcnkvJHtxdWVyeUlkfWAsXG4gICAgLy8gICBkYXRhOiB7IHBpbm5lZEF0OiB1dGlscy5nZXREYXRlVGltZVN0cmluZyhEYXRlLm5vdygpKSB9LFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgZXhwb3J0IGZ1bmN0aW9uIHVucGluUXVlcnkocXVlcnlJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHVucGluUXVlcnlJbkZpbGUocXVlcnlJZCk7XG4gICAgLy8gcmV0dXJuIHJlcXVlc3Qoe1xuICAgIC8vICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgLy8gICB1cmw6IGAvYXBpL3F1ZXJ5LyR7cXVlcnlJZH1gLFxuICAgIC8vICAgZGF0YTogeyBwaW5uZWRBdDogXCJcIiB9LFxuICAgIC8vIH0pO1xuICB9XG5cbiAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgLy8gZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZEZpbGUoZm9ybURhdGE6IEZvcm1EYXRhKSB7XG4gIC8vICAgLy8gcmV0dXJuIHJlcXVlc3Q8TW9kZWwuUmVzb3VyY2U+KHtcbiAgLy8gICAvLyAgIG1ldGhvZDogXCJQVVRcIixcbiAgLy8gICAvLyAgIHVybDogXCIvYXBpL3Jlc291cmNlL1wiLFxuICAvLyAgIC8vICAgZGF0YTogZm9ybURhdGEsXG4gIC8vICAgLy8gICBkYXRhVHlwZTogXCJmaWxlXCIsXG4gIC8vICAgLy8gfSk7XG4gIC8vIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgYXBpO1xuIiwiLy8g56e75Yqo56uv5qC35byP6YCC6YWN6aKd5aSW57G75ZCNXHJcbmV4cG9ydCBjb25zdCBTSE9XX1NJREVSQkFSX01PQklMRV9DTEFTU05BTUUgPSAnbW9iaWxlLXNob3ctc2lkZWJhcic7XHJcblxyXG4vLyDpu5jorqTliqjnlLvmjIHnu63ml7bplb9cclxuZXhwb3J0IGNvbnN0IEFOSU1BVElPTl9EVVJBVElPTiA9IDIwMDtcclxuXHJcbi8vIHRvYXN0IOWKqOeUu+aMgee7reaXtumVv1xyXG5leHBvcnQgY29uc3QgVE9BU1RfQU5JTUFUSU9OX0RVUkFUSU9OID0gNDAwO1xyXG5cclxuLy8g5LiA5aSp55qE5q+r56eS5pWwXHJcbmV4cG9ydCBjb25zdCBEQUlMWV9USU1FU1RBTVAgPSAzNjAwICogMjQgKiAxMDAwO1xyXG5cclxuLy8g5qCH562+IOato+WImVxyXG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG5leHBvcnQgY29uc3QgVEFHX1JFRyA9IC9cXHMjKFtcXHB7TGV0dGVyfVxccHtFbW9qaV9QcmVzZW50YXRpb259XFxwe051bWJlcn1cXC9fLV0rKS9ndTtcclxuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuZXhwb3J0IGNvbnN0IEZJUlNUX1RBR19SRUcgPSAvKDxwPnw8YnI+KSMoW1xccHtMZXR0ZXJ9XFxwe0Vtb2ppX1ByZXNlbnRhdGlvbn1cXHB7TnVtYmVyfVxcL18tXSspL2d1O1xyXG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG5leHBvcnQgY29uc3QgTk9QX0ZJUlNUX1RBR19SRUcgPSAvXiMoW1xccHtMZXR0ZXJ9XFxwe0Vtb2ppX1ByZXNlbnRhdGlvbn1cXHB7TnVtYmVyfVxcL18tXSspL2d1O1xyXG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG5leHBvcnQgY29uc3QgQUxMX1RBR19SRUcgPSAvKFtcXHB7TGV0dGVyfVxccHtFbW9qaV9QcmVzZW50YXRpb259XFxwe051bWJlcn1cXC9fLV0rKS91O1xyXG5cclxuLy8gVVJMIOato+WImVxyXG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG5leHBvcnQgY29uc3QgTElOS19SRUcgPSAvKFxcc3zvvJp8PnxeKSgoaHR0cHxmdHB8aHR0cHMpOlxcL1xcLyhbXFx3Xy1dKyg/Oig/OlxcLltcXHdfLV0rKSspKShbXFx3LixAP149JSY6XFwvfisjLV0qW1xcd0A/Xj0lJlxcL34rIy1dKSkvZztcclxuXHJcbi8vIGV4cG9ydCBjb25zdCBDSEVDS19MSU5LX1JFRyA9IC8oXFwoKFxccyopKShodHRwfGZ0cHxodHRwcyk6XFwvXFwvKFtcXHdfLV0rKD86KD86XFwuW1xcd18tXSspKykpKFtcXHcuLEA/Xj0lJjpcXC9+KyMtXSpbXFx3QD9ePSUmXFwvfisjLV0pL2c7XHJcbi8vIGV4cG9ydCBjb25zdCBMSU5LX1JFRyA9IC8oaHR0cHM/OlxcL1xcL1teXFxzPFxcXFwqPiddKykvZztcclxuXHJcbi8vIE1BUktET1dOIFVSTCDmraPliJlcclxuLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuZXhwb3J0IGNvbnN0IE1EX0xJTktfUkVHID0gL1xcWyhbXFxzXFxTXSo/KVxcXVxcKChbXFxzXFxTXSo/KVxcKS9ndTtcclxuXHJcbi8vIOWbvueJhyDmraPliJlcclxuZXhwb3J0IGNvbnN0IElNQUdFX1VSTF9SRUcgPSAvKFteXFxzPFxcXFwqPiddK1xcLihqcGVnfGpwZ3xnaWZ8cG5nfHN2ZykpKFxcXVxcXSk/KFxcKSk/L2c7XHJcblxyXG4vLyBNYXJrZG93biDlhoXpg6jlm77niYfmraPliJlcclxuLy8gR3JvdXAgMSDkuLrlm77niYdcclxuLy8gR3JvdXAgMiDkuLrnvKnmlL7mr5TkvotcclxuZXhwb3J0IGNvbnN0IE1BUktET1dOX1VSTF9SRUcgPSAvKCFcXFsoW15cXF1dKikoXFx8KT8oLio/KVxcXVxcKCguKj8pKFwiKD86LipbXlwiXSlcIik/XFxzKlxcKSkvZztcclxuXHJcbi8vIOajgOa1i+aYr+WQpuS4uuWklumDqOWbvueJh1xyXG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG5leHBvcnQgY29uc3QgTUFSS0RPV05fV0VCX1VSTF9SRUcgPSAvKFxcc3zvvJp8XikoaHR0cFtzXT86XFwvXFwvKShbXlxcL1xcc10rXFwvKShcXFMqPykoanBlZ3xqcGd8Z2lmfHBuZ3xzdmd8Ym1wfHdlcGcpKD8hXFwpKS9nO1xyXG5cclxuLy8gV2lraSDlm77niYfmraPliJlcclxuLy8gR3JvdXAgMSDkuLrlm77niYdcclxuLy8gR3JvdXAgNSDkuLrnvKnmlL7mr5TkvotcclxuZXhwb3J0IGNvbnN0IFdJS0lfSU1BR0VfVVJMX1JFRyA9IC8hXFxbXFxbKCguKj8pXFwuKGpwZWd8anBnfGdpZnxwbmd8c3ZnfGJtcHx3ZXBnKSk/KFxcfCk/KC4qPylcXF1cXF0vZztcclxuXHJcbi8vIG1lbW8g5YWz6IGU5q2j5YiZXHJcbmV4cG9ydCBjb25zdCBNRU1PX0xJTktfUkVHID0gL1xcW0AoLis/KVxcXVxcKCguKz8pXFwpL2c7XHJcblxyXG4vLyBJbnRlcm5hbFxyXG4iLCJpbXBvcnQgYXBpIGZyb20gJy4uL2hlbHBlcnMvYXBpJztcclxuaW1wb3J0IHtGSVJTVF9UQUdfUkVHLCBOT1BfRklSU1RfVEFHX1JFRywgVEFHX1JFR30gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xyXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XHJcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xyXG5pbXBvcnQge3dhaXRGb3JJbnNlcnR9IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYkNyZWF0ZU1lbW8nO1xyXG5pbXBvcnQge2NoYW5nZU1lbW99IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYlVwZGF0ZU1lbW8nO1xyXG4vLyBpbXBvcnQgdXNlclNlcnZpY2UgZnJvbSBcIi4vdXNlclNlcnZpY2VcIjtcclxuXHJcbmNsYXNzIE1lbW9TZXJ2aWNlIHtcclxuICBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGdldFN0YXRlKCkge1xyXG4gICAgcmV0dXJuIGFwcFN0b3JlLmdldFN0YXRlKCkubWVtb1N0YXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGZldGNoQWxsTWVtb3MoKSB7XHJcbiAgICAvLyBpZiAoIXVzZXJTZXJ2aWNlLmdldFN0YXRlKCkudXNlcikge1xyXG4gICAgLy8gICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhcGkuZ2V0TXlNZW1vcygpO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGFwaS5nZXRNeU1lbW9zKCk7XHJcbiAgICBjb25zdCBtZW1vcyA9IFtdIGFzIGFueVtdO1xyXG4gICAgZm9yIChjb25zdCBtIG9mIGRhdGEpIHtcclxuICAgICAgbWVtb3MucHVzaChtKTtcclxuICAgIH1cclxuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcclxuICAgICAgdHlwZTogJ1NFVF9NRU1PUycsXHJcbiAgICAgIHBheWxvYWQ6IHtcclxuICAgICAgICBtZW1vcyxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWVtb3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZmV0Y2hEZWxldGVkTWVtb3MoKSB7XHJcbiAgICAvLyBpZiAoIXVzZXJTZXJ2aWNlLmdldFN0YXRlKCkudXNlcikge1xyXG4gICAgLy8gICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGFwaS5nZXRNeURlbGV0ZWRNZW1vcygpO1xyXG4gICAgZGF0YS5zb3J0KFxyXG4gICAgICAoYToge2RlbGV0ZWRBdDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZX0sIGI6IHtkZWxldGVkQXQ6IHN0cmluZyB8IG51bWJlciB8IERhdGV9KSA9PlxyXG4gICAgICAgIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShiLmRlbGV0ZWRBdCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYS5kZWxldGVkQXQpLFxyXG4gICAgKTtcclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHB1c2hNZW1vKG1lbW86IE1vZGVsLk1lbW8pIHtcclxuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcclxuICAgICAgdHlwZTogJ0lOU0VSVF9NRU1PJyxcclxuICAgICAgcGF5bG9hZDoge1xyXG4gICAgICAgIG1lbW86IHtcclxuICAgICAgICAgIC4uLm1lbW8sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE1lbW9CeUlkKGlkOiBzdHJpbmcpIHtcclxuICAgIGZvciAoY29uc3QgbSBvZiB0aGlzLmdldFN0YXRlKCkubWVtb3MpIHtcclxuICAgICAgaWYgKG0uaWQgPT09IGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIG07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBoaWRlTWVtb0J5SWQoaWQ6IHN0cmluZykge1xyXG4gICAgYXdhaXQgYXBpLmhpZGVNZW1vKGlkKTtcclxuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcclxuICAgICAgdHlwZTogJ0RFTEVURV9NRU1PX0JZX0lEJyxcclxuICAgICAgcGF5bG9hZDoge1xyXG4gICAgICAgIGlkOiBpZCxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHJlc3RvcmVNZW1vQnlJZChpZDogc3RyaW5nKSB7XHJcbiAgICBhd2FpdCBhcGkucmVzdG9yZU1lbW8oaWQpO1xyXG4gICAgLy8gbWVtb1NlcnZpY2UuY2xlYXJNZW1vcygpO1xyXG4gICAgLy8gbWVtb1NlcnZpY2UuZmV0Y2hBbGxNZW1vcygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRlbGV0ZU1lbW9CeUlkKGlkOiBzdHJpbmcpIHtcclxuICAgIGF3YWl0IGFwaS5kZWxldGVNZW1vKGlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0TWVtbyhtZW1vOiBNb2RlbC5NZW1vKSB7XHJcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XHJcbiAgICAgIHR5cGU6ICdFRElUX01FTU8nLFxyXG4gICAgICBwYXlsb2FkOiBtZW1vLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlVGFnc1N0YXRlKCkge1xyXG4gICAgY29uc3Qge21lbW9zfSA9IHRoaXMuZ2V0U3RhdGUoKTtcclxuICAgIGNvbnN0IHRhZ3NTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIGZvciAoY29uc3QgbSBvZiBtZW1vcykge1xyXG4gICAgICBmb3IgKGNvbnN0IHQgb2YgQXJyYXkuZnJvbShtLmNvbnRlbnQubWF0Y2goVEFHX1JFRykgPz8gW10pKSB7XHJcbiAgICAgICAgdGFnc1NldC5hZGQodC5yZXBsYWNlKFRBR19SRUcsICckMScpLnRyaW0oKSk7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCB0IG9mIEFycmF5LmZyb20obS5jb250ZW50Lm1hdGNoKE5PUF9GSVJTVF9UQUdfUkVHKSA/PyBbXSkpIHtcclxuICAgICAgICB0YWdzU2V0LmFkZCh0LnJlcGxhY2UoTk9QX0ZJUlNUX1RBR19SRUcsICckMScpLnRyaW0oKSk7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCB0IG9mIEFycmF5LmZyb20obS5jb250ZW50Lm1hdGNoKEZJUlNUX1RBR19SRUcpID8/IFtdKSkge1xyXG4gICAgICAgIHRhZ3NTZXQuYWRkKHQucmVwbGFjZShGSVJTVF9UQUdfUkVHLCAnJDInKS50cmltKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xyXG4gICAgICB0eXBlOiAnU0VUX1RBR1MnLFxyXG4gICAgICBwYXlsb2FkOiB7XHJcbiAgICAgICAgdGFnczogQXJyYXkuZnJvbSh0YWdzU2V0KSxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyTWVtb3MoKSB7XHJcbiAgICBhcHBTdG9yZS5kaXNwYXRjaCh7XHJcbiAgICAgIHR5cGU6ICdTRVRfTUVNT1MnLFxyXG4gICAgICBwYXlsb2FkOiB7XHJcbiAgICAgICAgbWVtb3M6IFtdLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0TGlua2VkTWVtb3MobWVtb0lkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsLk1lbW9bXT4ge1xyXG4gICAgY29uc3Qge21lbW9zfSA9IHRoaXMuZ2V0U3RhdGUoKTtcclxuICAgIHJldHVybiBtZW1vcy5maWx0ZXIoKG0pID0+IG0uY29udGVudC5pbmNsdWRlcyhtZW1vSWQpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVNZW1vKHRleHQ6IHN0cmluZywgaXNMaXN0OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbC5NZW1vPiB7XHJcbiAgICBjb25zdCBtZW1vID0gYXdhaXQgd2FpdEZvckluc2VydCh0ZXh0LCBpc0xpc3QpO1xyXG4gICAgcmV0dXJuIG1lbW87XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlTWVtbyhtZW1vSWQ6IHN0cmluZywgb3JpZ2luYWxUZXh0OiBzdHJpbmcsIHRleHQ6IHN0cmluZywgdHlwZTogc3RyaW5nKTogUHJvbWlzZTxNb2RlbC5NZW1vPiB7XHJcbiAgICBjb25zdCBtZW1vID0gYXdhaXQgY2hhbmdlTWVtbyhtZW1vSWQsIG9yaWdpbmFsVGV4dCwgdGV4dCwgdHlwZSk7XHJcbiAgICByZXR1cm4gbWVtbztcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IG1lbW9TZXJ2aWNlID0gbmV3IE1lbW9TZXJ2aWNlKCk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBtZW1vU2VydmljZTtcclxuIiwiLy8gaW1wb3J0IHVzZXJTZXJ2aWNlIGZyb20gXCIuL3VzZXJTZXJ2aWNlXCI7XG5pbXBvcnQgYXBpIGZyb20gJy4uL2hlbHBlcnMvYXBpJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuXG5jbGFzcyBRdWVyeVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIGFwcFN0b3JlLmdldFN0YXRlKCkucXVlcnlTdGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRNeUFsbFF1ZXJpZXMoKSB7XG4gICAgLy8gaWYgKCF1c2VyU2VydmljZS5nZXRTdGF0ZSgpLnVzZXIpIHtcbiAgICAvLyAgIHJldHVybiBmYWxzZTtcbiAgICAvLyB9XG5cbiAgICAvLyBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwaS5nZXRNeVF1ZXJpZXMoKTtcbiAgICAvLyBhcHBTdG9yZS5kaXNwYXRjaCh7XG4gICAgLy8gICB0eXBlOiBcIlNFVF9RVUVSSUVTXCIsXG4gICAgLy8gICBwYXlsb2FkOiB7XG4gICAgLy8gICAgIHF1ZXJpZXM6IGRhdGEsXG4gICAgLy8gICB9LFxuICAgIC8vIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGkuZ2V0TXlRdWVyaWVzKCk7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1NFVF9RVUVSSUVTJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgcXVlcmllczogZGF0YSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwdWJsaWMgZ2V0UXVlcnlCeUlkKGlkOiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IHEgb2YgdGhpcy5nZXRTdGF0ZSgpLnF1ZXJpZXMpIHtcbiAgICAgIGlmIChxLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm4gcTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHVzaFF1ZXJ5KHF1ZXJ5OiBNb2RlbC5RdWVyeSkge1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdJTlNFUlRfUVVFUlknLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBxdWVyeToge1xuICAgICAgICAgIC4uLnF1ZXJ5LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBlZGl0UXVlcnkocXVlcnk6IE1vZGVsLlF1ZXJ5KSB7XG4gICAgYXBwU3RvcmUuZGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ1VQREFURV9RVUVSWScsXG4gICAgICBwYXlsb2FkOiBxdWVyeSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWxldGVRdWVyeShxdWVyeUlkOiBzdHJpbmcpIHtcbiAgICBhd2FpdCBhcGkuZGVsZXRlUXVlcnlCeUlkKHF1ZXJ5SWQpO1xuICAgIGFwcFN0b3JlLmRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdERUxFVEVfUVVFUllfQllfSUQnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBpZDogcXVlcnlJZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlUXVlcnkodGl0bGU6IHN0cmluZywgcXVlcnlzdHJpbmc6IHN0cmluZykge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGkuY3JlYXRlUXVlcnkodGl0bGUsIHF1ZXJ5c3RyaW5nKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVRdWVyeShxdWVyeUlkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIHF1ZXJ5c3RyaW5nOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgYXBpLnVwZGF0ZVF1ZXJ5KHF1ZXJ5SWQsIHRpdGxlLCBxdWVyeXN0cmluZyk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGluUXVlcnkocXVlcnlJZDogc3RyaW5nKSB7XG4gICAgYXdhaXQgYXBpLnBpblF1ZXJ5KHF1ZXJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVucGluUXVlcnkocXVlcnlJZDogc3RyaW5nKSB7XG4gICAgYXdhaXQgYXBpLnVucGluUXVlcnkocXVlcnlJZCk7XG4gIH1cbn1cblxuY29uc3QgcXVlcnlTZXJ2aWNlID0gbmV3IFF1ZXJ5U2VydmljZSgpO1xuXG5leHBvcnQgZGVmYXVsdCBxdWVyeVNlcnZpY2U7XG4iLCIvLyBpbXBvcnQgYXBpIGZyb20gXCIuLi9oZWxwZXJzL2FwaVwiO1xyXG5cclxuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHtURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQge2NyZWF0ZURhaWx5Tm90ZSwgZ2V0QWxsRGFpbHlOb3RlcywgZ2V0RGFpbHlOb3RlfSBmcm9tICdvYnNpZGlhbi1kYWlseS1ub3Rlcy1pbnRlcmZhY2UnO1xyXG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcclxuLy8gaW1wb3J0IGRhaWx5Tm90ZXNTZXJ2aWNlIGZyb20gJy4vZGFpbHlOb3Rlc1NlcnZpY2UnO1xyXG5cclxuLy8gaW50ZXJmYWNlIEZpbGVEYXRhIHtcclxuLy8gICBidWZmZXI6IEFycmF5QnVmZmVyO1xyXG4vLyAgIG1pbWVUeXBlOiBzdHJpbmc7XHJcbi8vICAgb3JpZ2luYWxOYW1lOiBzdHJpbmc7XHJcbi8vIH1cclxuXHJcbmNsYXNzIFJlc291cmNlU2VydmljZSB7XHJcbiAgLyoqXHJcbiAgICogVXBsb2FkIHJlc291cmNlIGZpbGUgdG8gc2VydmVyLFxyXG4gICAqIEBwYXJhbSBmaWxlIGZpbGVcclxuICAgKiBAcmV0dXJucyByZXNvdXJjZTogaWQsIGZpbGVuYW1lXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIHVwbG9hZChmaWxlOiBGaWxlKSB7XHJcbiAgICAvLyBjb25zdCB7IG5hbWU6IGZpbGVuYW1lLCBzaXplIH0gPSBmaWxlO1xyXG5cclxuICAgIGNvbnN0IHt2YXVsdCwgZmlsZU1hbmFnZXJ9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG5cclxuICAgIGNvbnN0IGZpbGVBcnJheSA9IGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKTtcclxuICAgIGNvbnN0IGV4dCA9IGdldEV4dChmaWxlLnR5cGUpO1xyXG5cclxuICAgIC8vIGNvbnNvbGUubG9nKG5ld09uZSk7XHJcblxyXG4gICAgLy8gY29uc3QgZmlsZU5hbWUgPSBcIlBhc3RlIEltYWdlIFwiICsgbW9tZW50KCkuZm9ybWF0KFwiWVlZWU1NRERISG1tc3NcIik7XHJcbiAgICBjb25zdCBkYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcygpO1xyXG4gICAgY29uc3QgZGF0ZSA9IG1vbWVudCgpO1xyXG4gICAgY29uc3QgZXhpc3RpbmdGaWxlID0gZ2V0RGFpbHlOb3RlKGRhdGUsIGRhaWx5Tm90ZXMpO1xyXG4gICAgbGV0IG5ld0ZpbGU7XHJcbiAgICBpZiAoIWV4aXN0aW5nRmlsZSkge1xyXG4gICAgICBjb25zdCBkYWlseUZpbGUgPSBhd2FpdCBjcmVhdGVEYWlseU5vdGUoZGF0ZSk7XHJcbiAgICAgIG5ld0ZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGVCaW5hcnkoXHJcbiAgICAgICAgLy9AdHMtZXhwZWN0LWVycm9yLCBwcml2YXRlIG1ldGhvZFxyXG4gICAgICAgIGF3YWl0IHZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhgUGFzdGVkIEltYWdlICR7bW9tZW50KCkuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpfWAsIGV4dCwgZGFpbHlGaWxlKSxcclxuICAgICAgICBmaWxlQXJyYXksXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2UgaWYgKGV4aXN0aW5nRmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XHJcbiAgICAgIG5ld0ZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGVCaW5hcnkoXHJcbiAgICAgICAgLy9AdHMtZXhwZWN0LWVycm9yLCBwcml2YXRlIG1ldGhvZFxyXG4gICAgICAgIGF3YWl0IHZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhcclxuICAgICAgICAgIGBQYXN0ZWQgSW1hZ2UgJHttb21lbnQoKS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzJyl9YCxcclxuICAgICAgICAgIGV4dCxcclxuICAgICAgICAgIGV4aXN0aW5nRmlsZSxcclxuICAgICAgICApLFxyXG4gICAgICAgIGZpbGVBcnJheSxcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0ZpbGVQYXRoID0gZmlsZU1hbmFnZXIuZ2VuZXJhdGVNYXJrZG93bkxpbmsobmV3RmlsZSwgbmV3RmlsZS5wYXRoLCAnJywgJycpO1xyXG5cclxuICAgIHJldHVybiBuZXdGaWxlUGF0aDtcclxuXHJcbiAgICAvLyBjb25zdCBmaWxlUGF0aCA9IGF3YWl0IHZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhmaWxlTmFtZSwgXCJwbmdcIiwgXCJcIik7XHJcblxyXG4gICAgLy8gY29uc3QgIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAvLyByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZS5hcnJheUJ1ZmZlcik7XHJcbiAgICAvLyByZWFkZXIub25sb2FkID0gKCkgPT57XHJcbiAgICAvLyAgIC8vIGNvbnNvbGUubG9nKCdSRVNVTFQnLCByZWFkZXIucmVzdWx0KVxyXG4gICAgLy8gICBmaWxlQXJyYXJ5ID0gcmVhZGVyLnJlc3VsdDtcclxuICAgIC8vICAgY29uc29sZS5sb2coZmlsZUFycmFyeSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gaWYgKHNpemUgPiA1IDw8IDIwKSB7XHJcbiAgICAvLyAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIui2hei/h+acgOWkp+aWh+S7tuWkp+WwjyA1TWJcIik7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuXHJcbiAgICAvLyBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlXCIsIGZpbGUsIGZpbGVuYW1lKTtcclxuXHJcbiAgICAvLyBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwaS51cGxvYWRGaWxlKGZvcm1EYXRhKTtcclxuICB9XHJcbn1cclxuXHJcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXHJcbmNvbnN0IGdldEV4dCA9IChsaW5lOiBzdHJpbmcpID0+IC9eaW1hZ2VcXC8oLispJC8uZXhlYyhsaW5lKT8uWzFdO1xyXG5cclxuY29uc3QgcmVzb3VyY2VTZXJ2aWNlID0gbmV3IFJlc291cmNlU2VydmljZSgpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgcmVzb3VyY2VTZXJ2aWNlO1xyXG4iLCJjb25zdCBnZXRJbml0aWFsQWN0aW9uID0gKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiaW5pdGlhbFRleHRcIixcbiAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgc2VsZWN0aW9uU3RhcnQ6IDAsXG4gICAgICAgIHNlbGVjdGlvbkVuZDogMCxcbiAgICB9O1xufTtcbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gICAgaW5pdGlhbFZhbHVlOiBcIlwiLFxuICAgIGludGVydmFsOiAzMDAsXG59O1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlueVVuZG8ge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZyA9IGRlZmF1bHRDb25maWcpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgdGhpcy5ydW5VbmRvID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSB0aGlzLmFjdGlvbnNbdGhpcy5jdXJyZW50SW5kZXhdLnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSB0aGlzLmFjdGlvbnNbdGhpcy5jdXJyZW50SW5kZXhdLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKGN1cnNvclBvc2l0aW9uLCBjdXJzb3JQb3NpdGlvbik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoQ2hhbmdlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucnVuUmVkbyA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRJbmRleCA8IHRoaXMuYWN0aW9ucy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gdGhpcy5hY3Rpb25zW3RoaXMuY3VycmVudEluZGV4XS5zZWxlY3Rpb25FbmQ7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSB0aGlzLmFjdGlvbnNbdGhpcy5jdXJyZW50SW5kZXhdLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKGN1cnNvclBvc2l0aW9uLCBjdXJzb3JQb3NpdGlvbik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoQ2hhbmdlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2V0QWN0aW9ucyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGlvbnM7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2V0U3RhdGUgPSAoYWN0aW9ucywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucyA9IFsuLi5hY3Rpb25zXTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gaW5kZXggPCB0aGlzLmFjdGlvbnMubGVuZ3RoID8gaW5kZXggOiB0aGlzLmFjdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hDaGFuZ2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yZXNldFN0YXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25zID0gW2dldEluaXRpYWxBY3Rpb24oKV07XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IDA7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoQ2hhbmdlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucm1FdmVudExpc3RlbmVycygpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN1YnNjcmliZSA9IChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChjYWxsYmFjayk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlRWxlbWVudEtleWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleWJvYXJkRXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgIGlmIChrZXlib2FyZEV2ZW50LmtleSA9PT0gXCJ6XCIgJiYgIWtleWJvYXJkRXZlbnQuc2hpZnRLZXkgJiYgKGtleWJvYXJkRXZlbnQubWV0YUtleSB8fCBrZXlib2FyZEV2ZW50LmN0cmxLZXkpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1blVuZG8oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChrZXlib2FyZEV2ZW50LmtleSA9PT0gXCJ6XCIgJiYga2V5Ym9hcmRFdmVudC5zaGlmdEtleSAmJiAoa2V5Ym9hcmRFdmVudC5tZXRhS2V5IHx8IGtleWJvYXJkRXZlbnQuY3RybEtleSkpIHx8XG4gICAgICAgICAgICAgICAgKGtleWJvYXJkRXZlbnQua2V5ID09PSBcInlcIiAmJiAoa2V5Ym9hcmRFdmVudC5tZXRhS2V5IHx8IGtleWJvYXJkRXZlbnQuY3RybEtleSkpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1blJlZG8oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVFbGVtZW50SW5wdXQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0RXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RBY3Rpb24gPSB0aGlzLmFjdGlvbnNbdGhpcy5jdXJyZW50SW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5wdXNoTmV3QWN0aW9uKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBpbnB1dEV2ZW50LmlucHV0VHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5lbGVtZW50LnZhbHVlLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydDogdGhpcy5lbGVtZW50LnNlbGVjdGlvbkVuZCAtICh0aGlzLmVsZW1lbnQudmFsdWUubGVuZ3RoIC0gbGFzdEFjdGlvbi52YWx1ZS5sZW5ndGgpLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbkVuZDogdGhpcy5lbGVtZW50LnNlbGVjdGlvbkVuZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuaGFuZGxlRWxlbWVudEtleWRvd24pO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCB0aGlzLmhhbmRsZUVsZW1lbnRJbnB1dCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucm1FdmVudExpc3RlbmVycyA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmhhbmRsZUVsZW1lbnRLZXlkb3duKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgdGhpcy5oYW5kbGVFbGVtZW50SW5wdXQpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnB1c2hOZXdBY3Rpb24gPSAoYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYXN0QWN0aW9uID0gdGhpcy5hY3Rpb25zW3RoaXMuY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgIGlmIChsYXN0QWN0aW9uICYmIGxhc3RBY3Rpb24udHlwZSA9PT0gYWN0aW9uLnR5cGUgJiYgYWN0aW9uLnRpbWVzdGFtcCAtIGxhc3RBY3Rpb24udGltZXN0YW1wIDwgdGhpcy5jb25maWcuaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbnNbdGhpcy5jdXJyZW50SW5kZXhdID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBsYXN0QWN0aW9uKSwgeyB2YWx1ZTogYWN0aW9uLnZhbHVlLCBzZWxlY3Rpb25FbmQ6IGFjdGlvbi5zZWxlY3Rpb25FbmQsIHRpbWVzdGFtcDogYWN0aW9uLnRpbWVzdGFtcCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5tYXhTaXplICYmIHRoaXMuY3VycmVudEluZGV4ID49IHRoaXMuY29uZmlnLm1heFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uc1swXSA9IGdldEluaXRpYWxBY3Rpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uc1t0aGlzLmN1cnJlbnRJbmRleF0gPSBhY3Rpb247XG4gICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zID0gdGhpcy5hY3Rpb25zLnNsaWNlKDAsIHRoaXMuY3VycmVudEluZGV4ICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoQ2hhbmdlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNiIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgY2IoWy4uLnRoaXMuYWN0aW9uc10sIHRoaXMuY3VycmVudEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5jb25maWcgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRDb25maWcpLCBjb25maWcpO1xuICAgICAgICBpZiAodGhpcy5jb25maWcuaW5pdGlhbEFjdGlvbnMgJiYgdGhpcy5jb25maWcuaW5pdGlhbEFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25zID0gdGhpcy5jb25maWcuaW5pdGlhbEFjdGlvbnM7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcuaW5pdGlhbEluZGV4ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jb25maWcuaW5pdGlhbEluZGV4IDwgdGhpcy5hY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gdGhpcy5jb25maWcuaW5pdGlhbEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSB0aGlzLmFjdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucyA9IFtnZXRJbml0aWFsQWN0aW9uKCldO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSAwO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluaXRpYWxWYWx1ZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbnNlcnRUZXh0XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmNvbmZpZy5pbml0aWFsVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkVuZDogdGhpcy5jb25maWcuaW5pdGlhbFZhbHVlLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudC52YWx1ZSA9IHRoaXMuYWN0aW9uc1t0aGlzLmN1cnJlbnRJbmRleF0udmFsdWU7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG59XG4iLCJpbXBvcnQge3VzZUNhbGxiYWNrLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuXG5mdW5jdGlvbiB1c2VSZWZyZXNoKCkge1xuICBjb25zdCBbLCBzZXRCb29sZWFuXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdCByZWZyZXNoID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEJvb2xlYW4oKHBzKSA9PiB7XG4gICAgICByZXR1cm4gIXBzO1xuICAgIH0pO1xuICB9LCBbXSk7XG5cbiAgcmV0dXJuIHJlZnJlc2g7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZVJlZnJlc2g7XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE3LjAuMlxuICogcmVhY3QtanN4LXJ1bnRpbWUucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO3JlcXVpcmUoXCJvYmplY3QtYXNzaWduXCIpO3ZhciBmPXJlcXVpcmUoXCJyZWFjdFwiKSxnPTYwMTAzO2V4cG9ydHMuRnJhZ21lbnQ9NjAxMDc7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmZvcil7dmFyIGg9U3ltYm9sLmZvcjtnPWgoXCJyZWFjdC5lbGVtZW50XCIpO2V4cG9ydHMuRnJhZ21lbnQ9aChcInJlYWN0LmZyYWdtZW50XCIpfXZhciBtPWYuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQuUmVhY3RDdXJyZW50T3duZXIsbj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHA9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtcbmZ1bmN0aW9uIHEoYyxhLGspe3ZhciBiLGQ9e30sZT1udWxsLGw9bnVsbDt2b2lkIDAhPT1rJiYoZT1cIlwiK2spO3ZvaWQgMCE9PWEua2V5JiYoZT1cIlwiK2Eua2V5KTt2b2lkIDAhPT1hLnJlZiYmKGw9YS5yZWYpO2ZvcihiIGluIGEpbi5jYWxsKGEsYikmJiFwLmhhc093blByb3BlcnR5KGIpJiYoZFtiXT1hW2JdKTtpZihjJiZjLmRlZmF1bHRQcm9wcylmb3IoYiBpbiBhPWMuZGVmYXVsdFByb3BzLGEpdm9pZCAwPT09ZFtiXSYmKGRbYl09YVtiXSk7cmV0dXJueyQkdHlwZW9mOmcsdHlwZTpjLGtleTplLHJlZjpsLHByb3BzOmQsX293bmVyOm0uY3VycmVudH19ZXhwb3J0cy5qc3g9cTtleHBvcnRzLmpzeHM9cTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtcnVudGltZS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0ICogYXMganN4UnVudGltZSBmcm9tIFwiRTpcXFxcb2JkZXZcXFxcLm9ic2lkaWFuXFxcXHBsdWdpbnNcXFxcb2JzaWRpYW4tbWVtb3NcXFxcbm9kZV9tb2R1bGVzXFxcXHJlYWN0XFxcXGpzeC1ydW50aW1lLmpzXCJcbmV4cG9ydCBjb25zdCBqc3ggPSBqc3hSdW50aW1lLmpzeFxuZXhwb3J0IGNvbnN0IGpzeHMgPSBqc3hSdW50aW1lLmpzeHNcbmV4cG9ydCBjb25zdCBGcmFnbWVudCA9IGpzeFJ1bnRpbWUuRnJhZ21lbnQiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtSZWFjdE5vZGV9IGZyb20gJ3JlYWN0JztcblxuaW50ZXJmYWNlIE9ubHlXaGVuUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICB3aGVuOiBib29sZWFuO1xufVxuXG5jb25zdCBPbmx5V2hlbjogUmVhY3QuRkM8T25seVdoZW5Qcm9wcz4gPSAocHJvcHM6IE9ubHlXaGVuUHJvcHMpID0+IHtcbiAgY29uc3Qge2NoaWxkcmVuLCB3aGVufSA9IHByb3BzO1xuICByZXR1cm4gd2hlbiA/IDw+e2NoaWxkcmVufTwvPiA6IG51bGw7XG59O1xuXG5jb25zdCBPbmx5ID0gT25seVdoZW47XG5cbmV4cG9ydCBkZWZhdWx0IE9ubHk7XG4iLCIvKiBqc2hpbnQgYnJvd3NlcjogdHJ1ZSAqL1xuXG4oZnVuY3Rpb24gKCkge1xuXG4vLyBUaGUgcHJvcGVydGllcyB0aGF0IHdlIGNvcHkgaW50byBhIG1pcnJvcmVkIGRpdi5cbi8vIE5vdGUgdGhhdCBzb21lIGJyb3dzZXJzLCBzdWNoIGFzIEZpcmVmb3gsXG4vLyBkbyBub3QgY29uY2F0ZW5hdGUgcHJvcGVydGllcywgaS5lLiBwYWRkaW5nLXRvcCwgYm90dG9tIGV0Yy4gLT4gcGFkZGluZyxcbi8vIHNvIHdlIGhhdmUgdG8gZG8gZXZlcnkgc2luZ2xlIHByb3BlcnR5IHNwZWNpZmljYWxseS5cbnZhciBwcm9wZXJ0aWVzID0gW1xuICAnZGlyZWN0aW9uJywgIC8vIFJUTCBzdXBwb3J0XG4gICdib3hTaXppbmcnLFxuICAnd2lkdGgnLCAgLy8gb24gQ2hyb21lIGFuZCBJRSwgZXhjbHVkZSB0aGUgc2Nyb2xsYmFyLCBzbyB0aGUgbWlycm9yIGRpdiB3cmFwcyBleGFjdGx5IGFzIHRoZSB0ZXh0YXJlYSBkb2VzXG4gICdoZWlnaHQnLFxuICAnb3ZlcmZsb3dYJyxcbiAgJ292ZXJmbG93WScsICAvLyBjb3B5IHRoZSBzY3JvbGxiYXIgZm9yIElFXG5cbiAgJ2JvcmRlclRvcFdpZHRoJyxcbiAgJ2JvcmRlclJpZ2h0V2lkdGgnLFxuICAnYm9yZGVyQm90dG9tV2lkdGgnLFxuICAnYm9yZGVyTGVmdFdpZHRoJyxcbiAgJ2JvcmRlclN0eWxlJyxcblxuICAncGFkZGluZ1RvcCcsXG4gICdwYWRkaW5nUmlnaHQnLFxuICAncGFkZGluZ0JvdHRvbScsXG4gICdwYWRkaW5nTGVmdCcsXG5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2ZvbnRcbiAgJ2ZvbnRTdHlsZScsXG4gICdmb250VmFyaWFudCcsXG4gICdmb250V2VpZ2h0JyxcbiAgJ2ZvbnRTdHJldGNoJyxcbiAgJ2ZvbnRTaXplJyxcbiAgJ2ZvbnRTaXplQWRqdXN0JyxcbiAgJ2xpbmVIZWlnaHQnLFxuICAnZm9udEZhbWlseScsXG5cbiAgJ3RleHRBbGlnbicsXG4gICd0ZXh0VHJhbnNmb3JtJyxcbiAgJ3RleHRJbmRlbnQnLFxuICAndGV4dERlY29yYXRpb24nLCAgLy8gbWlnaHQgbm90IG1ha2UgYSBkaWZmZXJlbmNlLCBidXQgYmV0dGVyIGJlIHNhZmVcblxuICAnbGV0dGVyU3BhY2luZycsXG4gICd3b3JkU3BhY2luZycsXG5cbiAgJ3RhYlNpemUnLFxuICAnTW96VGFiU2l6ZSdcblxuXTtcblxudmFyIGlzQnJvd3NlciA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyk7XG52YXIgaXNGaXJlZm94ID0gKGlzQnJvd3NlciAmJiB3aW5kb3cubW96SW5uZXJTY3JlZW5YICE9IG51bGwpO1xuXG5mdW5jdGlvbiBnZXRDYXJldENvb3JkaW5hdGVzKGVsZW1lbnQsIHBvc2l0aW9uLCBvcHRpb25zKSB7XG4gIGlmKCFpc0Jyb3dzZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RleHRhcmVhLWNhcmV0LXBvc2l0aW9uI2dldENhcmV0Q29vcmRpbmF0ZXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIGEgYnJvd3NlcicpO1xuICB9XG5cbiAgdmFyIGRlYnVnID0gb3B0aW9ucyAmJiBvcHRpb25zLmRlYnVnIHx8IGZhbHNlO1xuICBpZiAoZGVidWcpIHtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaW5wdXQtdGV4dGFyZWEtY2FyZXQtcG9zaXRpb24tbWlycm9yLWRpdicpO1xuICAgIGlmICggZWwgKSB7IGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpOyB9XG4gIH1cblxuICAvLyBtaXJyb3JlZCBkaXZcbiAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBkaXYuaWQgPSAnaW5wdXQtdGV4dGFyZWEtY2FyZXQtcG9zaXRpb24tbWlycm9yLWRpdic7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcblxuICB2YXIgc3R5bGUgPSBkaXYuc3R5bGU7XG4gIHZhciBjb21wdXRlZCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlPyBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIDogZWxlbWVudC5jdXJyZW50U3R5bGU7ICAvLyBjdXJyZW50U3R5bGUgZm9yIElFIDwgOVxuXG4gIC8vIGRlZmF1bHQgdGV4dGFyZWEgc3R5bGVzXG4gIHN0eWxlLndoaXRlU3BhY2UgPSAncHJlLXdyYXAnO1xuICBpZiAoZWxlbWVudC5ub2RlTmFtZSAhPT0gJ0lOUFVUJylcbiAgICBzdHlsZS53b3JkV3JhcCA9ICdicmVhay13b3JkJzsgIC8vIG9ubHkgZm9yIHRleHRhcmVhLXNcblxuICAvLyBwb3NpdGlvbiBvZmYtc2NyZWVuXG4gIHN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsgIC8vIHJlcXVpcmVkIHRvIHJldHVybiBjb29yZGluYXRlcyBwcm9wZXJseVxuICBpZiAoIWRlYnVnKVxuICAgIHN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsgIC8vIG5vdCAnZGlzcGxheTogbm9uZScgYmVjYXVzZSB3ZSB3YW50IHJlbmRlcmluZ1xuXG4gIC8vIHRyYW5zZmVyIHRoZSBlbGVtZW50J3MgcHJvcGVydGllcyB0byB0aGUgZGl2XG4gIHByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIHN0eWxlW3Byb3BdID0gY29tcHV0ZWRbcHJvcF07XG4gIH0pO1xuXG4gIGlmIChpc0ZpcmVmb3gpIHtcbiAgICAvLyBGaXJlZm94IGxpZXMgYWJvdXQgdGhlIG92ZXJmbG93IHByb3BlcnR5IGZvciB0ZXh0YXJlYXM6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTk4NDI3NVxuICAgIGlmIChlbGVtZW50LnNjcm9sbEhlaWdodCA+IHBhcnNlSW50KGNvbXB1dGVkLmhlaWdodCkpXG4gICAgICBzdHlsZS5vdmVyZmxvd1kgPSAnc2Nyb2xsJztcbiAgfSBlbHNlIHtcbiAgICBzdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOyAgLy8gZm9yIENocm9tZSB0byBub3QgcmVuZGVyIGEgc2Nyb2xsYmFyOyBJRSBrZWVwcyBvdmVyZmxvd1kgPSAnc2Nyb2xsJ1xuICB9XG5cbiAgZGl2LnRleHRDb250ZW50ID0gZWxlbWVudC52YWx1ZS5zdWJzdHJpbmcoMCwgcG9zaXRpb24pO1xuICAvLyB0aGUgc2Vjb25kIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGlucHV0IHR5cGU9XCJ0ZXh0XCIgdnMgdGV4dGFyZWE6IHNwYWNlcyBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggbm9uLWJyZWFraW5nIHNwYWNlcyAtIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEzNDAyMDM1LzEyNjkwMzdcbiAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdJTlBVVCcpXG4gICAgZGl2LnRleHRDb250ZW50ID0gZGl2LnRleHRDb250ZW50LnJlcGxhY2UoL1xccy9nLCAnXFx1MDBhMCcpO1xuXG4gIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAvLyBXcmFwcGluZyBtdXN0IGJlIHJlcGxpY2F0ZWQgKmV4YWN0bHkqLCBpbmNsdWRpbmcgd2hlbiBhIGxvbmcgd29yZCBnZXRzXG4gIC8vIG9udG8gdGhlIG5leHQgbGluZSwgd2l0aCB3aGl0ZXNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgYmVmb3JlICgjNykuXG4gIC8vIFRoZSAgKm9ubHkqIHJlbGlhYmxlIHdheSB0byBkbyB0aGF0IGlzIHRvIGNvcHkgdGhlICplbnRpcmUqIHJlc3Qgb2YgdGhlXG4gIC8vIHRleHRhcmVhJ3MgY29udGVudCBpbnRvIHRoZSA8c3Bhbj4gY3JlYXRlZCBhdCB0aGUgY2FyZXQgcG9zaXRpb24uXG4gIC8vIGZvciBpbnB1dHMsIGp1c3QgJy4nIHdvdWxkIGJlIGVub3VnaCwgYnV0IHdoeSBib3RoZXI/XG4gIHNwYW4udGV4dENvbnRlbnQgPSBlbGVtZW50LnZhbHVlLnN1YnN0cmluZyhwb3NpdGlvbikgfHwgJy4nOyAgLy8gfHwgYmVjYXVzZSBhIGNvbXBsZXRlbHkgZW1wdHkgZmF1eCBzcGFuIGRvZXNuJ3QgcmVuZGVyIGF0IGFsbFxuICBkaXYuYXBwZW5kQ2hpbGQoc3Bhbik7XG5cbiAgdmFyIGNvb3JkaW5hdGVzID0ge1xuICAgIHRvcDogc3Bhbi5vZmZzZXRUb3AgKyBwYXJzZUludChjb21wdXRlZFsnYm9yZGVyVG9wV2lkdGgnXSksXG4gICAgbGVmdDogc3Bhbi5vZmZzZXRMZWZ0ICsgcGFyc2VJbnQoY29tcHV0ZWRbJ2JvcmRlckxlZnRXaWR0aCddKVxuICB9O1xuXG4gIGlmIChkZWJ1Zykge1xuICAgIHNwYW4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNhYWEnO1xuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGl2KTtcbiAgfVxuXG4gIHJldHVybiBjb29yZGluYXRlcztcbn1cblxuaWYgKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzICE9ICd1bmRlZmluZWQnKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gZ2V0Q2FyZXRDb29yZGluYXRlcztcbn0gZWxzZSBpZihpc0Jyb3dzZXIpe1xuICB3aW5kb3cuZ2V0Q2FyZXRDb29yZGluYXRlcyA9IGdldENhcmV0Q29vcmRpbmF0ZXM7XG59XG5cbn0oKSk7XG4iLCJcbnZhciBOYXRpdmVDdXN0b21FdmVudCA9IGdsb2JhbC5DdXN0b21FdmVudDtcblxuZnVuY3Rpb24gdXNlTmF0aXZlICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgcCA9IG5ldyBOYXRpdmVDdXN0b21FdmVudCgnY2F0JywgeyBkZXRhaWw6IHsgZm9vOiAnYmFyJyB9IH0pO1xuICAgIHJldHVybiAgJ2NhdCcgPT09IHAudHlwZSAmJiAnYmFyJyA9PT0gcC5kZXRhaWwuZm9vO1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENyb3NzLWJyb3dzZXIgYEN1c3RvbUV2ZW50YCBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ3VzdG9tRXZlbnQuQ3VzdG9tRXZlbnRcbiAqXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB1c2VOYXRpdmUoKSA/IE5hdGl2ZUN1c3RvbUV2ZW50IDpcblxuLy8gSUUgPj0gOVxuJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBkb2N1bWVudCAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQgPyBmdW5jdGlvbiBDdXN0b21FdmVudCAodHlwZSwgcGFyYW1zKSB7XG4gIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gIGlmIChwYXJhbXMpIHtcbiAgICBlLmluaXRDdXN0b21FdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHBhcmFtcy5kZXRhaWwpO1xuICB9IGVsc2Uge1xuICAgIGUuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSwgdm9pZCAwKTtcbiAgfVxuICByZXR1cm4gZTtcbn0gOlxuXG4vLyBJRSA8PSA4XG5mdW5jdGlvbiBDdXN0b21FdmVudCAodHlwZSwgcGFyYW1zKSB7XG4gIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKTtcbiAgZS50eXBlID0gdHlwZTtcbiAgaWYgKHBhcmFtcykge1xuICAgIGUuYnViYmxlcyA9IEJvb2xlYW4ocGFyYW1zLmJ1YmJsZXMpO1xuICAgIGUuY2FuY2VsYWJsZSA9IEJvb2xlYW4ocGFyYW1zLmNhbmNlbGFibGUpO1xuICAgIGUuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgfSBlbHNlIHtcbiAgICBlLmJ1YmJsZXMgPSBmYWxzZTtcbiAgICBlLmNhbmNlbGFibGUgPSBmYWxzZTtcbiAgICBlLmRldGFpbCA9IHZvaWQgMDtcbiAgfVxuICByZXR1cm4gZTtcbn1cbiIsIi8qKlxuICogVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IEpha3ViIEJlbmXFoSA8YmVuZXNAd2Vic2NvcGUuaW8+XG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAqIFRIRSBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBnZXRDYXJldENvb3JkaW5hdGVzIGZyb20gJ3RleHRhcmVhLWNhcmV0JztcbmltcG9ydCBDdXN0b21FdmVudCBmcm9tICdjdXN0b20tZXZlbnQnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgdmFyIG93bktleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXG4gICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIG93bktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuZnVuY3Rpb24gX3R5cGVvZjIob2JqKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIF90eXBlb2YyID0gZnVuY3Rpb24gX3R5cGVvZjIob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIF90eXBlb2YyID0gZnVuY3Rpb24gX3R5cGVvZjIob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2YyKG9iaik7XG59XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgX3R5cGVvZjIoU3ltYm9sLml0ZXJhdG9yKSA9PT0gXCJzeW1ib2xcIikge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiBfdHlwZW9mMihvYmopO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgaWYgKHNlbGYgPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBzZWxmO1xufVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH1cblxuICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO1xuICB9O1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xufVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbn1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIH1cblxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFycjJbaV0gPSBhcnJbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjI7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xufVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5cbnZhciBLRVlfQ09ERVMgPSB7XG4gIEVTQzogMjcsXG4gIFVQOiAzOCxcbiAgRE9XTjogNDAsXG4gIExFRlQ6IDM3LFxuICBSSUdIVDogMzksXG4gIEVOVEVSOiAxMyxcbiAgVEFCOiA5XG59OyAvLyBUaGlzIGlzIHNlbGYtbWFkZSBrZXkgc2hvcnRjdXRzIG1hbmFnZXIsIHVzZWQgZm9yIGNhY2hpbmcga2V5IHN0cm9rZXNcblxudmFyIExpc3RlbmVyID0gZnVuY3Rpb24gTGlzdGVuZXIoKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExpc3RlbmVyKTtcblxuICB0aGlzLnN0YXJ0TGlzdGVuID0gZnVuY3Rpb24gKHJlZikge1xuICAgIGlmICghcmVmKSByZXR1cm47XG4gICAgcmVmLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIF90aGlzLmYpO1xuICB9O1xuXG4gIHRoaXMuc3RvcExpc3RlbiA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICBpZiAoIXJlZikgcmV0dXJuO1xuICAgIHJlZi5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBfdGhpcy5mKTtcbiAgfTtcblxuICB0aGlzLmFkZCA9IGZ1bmN0aW9uIChrZXlDb2RlcywgZm4pIHtcbiAgICB2YXIga2V5Q29kZSA9IGtleUNvZGVzO1xuICAgIGlmICh0eXBlb2Yga2V5Q29kZSAhPT0gXCJvYmplY3RcIikga2V5Q29kZSA9IFtrZXlDb2RlXTtcbiAgICBfdGhpcy5saXN0ZW5lcnNbX3RoaXMuaW5kZXhdID0ge1xuICAgICAga2V5Q29kZToga2V5Q29kZSxcbiAgICAgIGZuOiBmblxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzLmluZGV4Kys7XG4gIH07XG5cbiAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBkZWxldGUgX3RoaXMubGlzdGVuZXJzW2lkXTtcbiAgfTtcblxuICB0aGlzLnJlbW92ZUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpcy5saXN0ZW5lcnMgPSB7fTtcbiAgICBfdGhpcy5pbmRleCA9IDE7XG4gIH07XG5cbiAgdGhpcy5pbmRleCA9IDE7XG4gIHRoaXMubGlzdGVuZXJzID0ge307XG5cbiAgdGhpcy5mID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIWUpIHJldHVybjtcbiAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndoaWNoO1xuICAgIE9iamVjdC52YWx1ZXMoX3RoaXMubGlzdGVuZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIga2V5Q29kZSA9IF9yZWYua2V5Q29kZSxcbiAgICAgICAgICBmbiA9IF9yZWYuZm47XG5cbiAgICAgIGlmIChrZXlDb2RlLmluY2x1ZGVzKGNvZGUpKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZm4oZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59O1xuXG52YXIgTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyKCk7XG5cbnZhciBJdGVtID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhJdGVtLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBJdGVtKCkge1xuICAgIHZhciBfZ2V0UHJvdG90eXBlT2YyO1xuXG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEl0ZW0pO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKF9nZXRQcm90b3R5cGVPZjIgPSBfZ2V0UHJvdG90eXBlT2YoSXRlbSkpLmNhbGwuYXBwbHkoX2dldFByb3RvdHlwZU9mMiwgW3RoaXNdLmNvbmNhdChhcmdzKSkpO1xuXG4gICAgX3RoaXMuc2VsZWN0SXRlbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGl0ZW0gPSBfdGhpcyRwcm9wcy5pdGVtLFxuICAgICAgICAgIG9uU2VsZWN0SGFuZGxlciA9IF90aGlzJHByb3BzLm9uU2VsZWN0SGFuZGxlcjtcbiAgICAgIG9uU2VsZWN0SGFuZGxlcihpdGVtKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEl0ZW0sIFt7XG4gICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzKSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5pdGVtICE9PSBuZXh0UHJvcHMuaXRlbSB8fCB0aGlzLnByb3BzLnNlbGVjdGVkICE9PSBuZXh0UHJvcHMuc2VsZWN0ZWQgfHwgdGhpcy5wcm9wcy5zdHlsZSAhPT0gbmV4dFByb3BzLnN0eWxlIHx8IHRoaXMucHJvcHMuY2xhc3NOYW1lICE9PSBuZXh0UHJvcHMuY2xhc3NOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgQ29tcG9uZW50ID0gX3RoaXMkcHJvcHMyLmNvbXBvbmVudCxcbiAgICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzMi5zdHlsZSxcbiAgICAgICAgICBvbkNsaWNrSGFuZGxlciA9IF90aGlzJHByb3BzMi5vbkNsaWNrSGFuZGxlcixcbiAgICAgICAgICBpdGVtID0gX3RoaXMkcHJvcHMyLml0ZW0sXG4gICAgICAgICAgc2VsZWN0ZWQgPSBfdGhpcyRwcm9wczIuc2VsZWN0ZWQsXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMyLmNsYXNzTmFtZSxcbiAgICAgICAgICBpbm5lclJlZiA9IF90aGlzJHByb3BzMi5pbm5lclJlZjtcbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwicnRhX19pdGVtICBcIi5jb25jYXQoc2VsZWN0ZWQgPT09IHRydWUgPyBcInJ0YV9faXRlbS0tc2VsZWN0ZWRcIiA6IFwiXCIsIFwiIFwiKS5jb25jYXQoY2xhc3NOYW1lIHx8IFwiXCIpLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwicnRhX19lbnRpdHkgXCIuY29uY2F0KHNlbGVjdGVkID09PSB0cnVlID8gXCJydGFfX2VudGl0eS0tc2VsZWN0ZWRcIiA6IFwiXCIpLFxuICAgICAgICByb2xlOiBcImJ1dHRvblwiLFxuICAgICAgICB0YWJJbmRleDogMCxcbiAgICAgICAgb25DbGljazogb25DbGlja0hhbmRsZXIsXG4gICAgICAgIG9uRm9jdXM6IHRoaXMuc2VsZWN0SXRlbSxcbiAgICAgICAgb25Nb3VzZUVudGVyOiB0aGlzLnNlbGVjdEl0ZW0sXG4gICAgICAgIG9uVG91Y2hTdGFydDogZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KCkge1xuICAgICAgICAgIF90aGlzMi5jbGlja2VkID0gdHJ1ZTtcblxuICAgICAgICAgIF90aGlzMi5zZWxlY3RJdGVtKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVG91Y2hFbmQ6IGZ1bmN0aW9uIG9uVG91Y2hFbmQoZSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIGlmIChfdGhpczIuY2xpY2tlZCkge1xuICAgICAgICAgICAgb25DbGlja0hhbmRsZXIoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvblRvdWNoTW92ZTogZnVuY3Rpb24gb25Ub3VjaE1vdmUoKSB7XG4gICAgICAgICAgX3RoaXMyLmNsaWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ub3VjaENhbmNlbDogZnVuY3Rpb24gb25Ub3VjaENhbmNlbCgpIHtcbiAgICAgICAgICBfdGhpczIuY2xpY2tlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8qICRGbG93Rml4TWUgKi9cbiAgICAgICAgLFxuICAgICAgICByZWY6IGlubmVyUmVmXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwge1xuICAgICAgICBzZWxlY3RlZDogc2VsZWN0ZWQsXG4gICAgICAgIGVudGl0eTogaXRlbVxuICAgICAgfSkpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSXRlbTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxudmFyIExpc3QgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKExpc3QsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIExpc3QoKSB7XG4gICAgdmFyIF9nZXRQcm90b3R5cGVPZjI7XG5cbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTGlzdCk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoX2dldFByb3RvdHlwZU9mMiA9IF9nZXRQcm90b3R5cGVPZihMaXN0KSkuY2FsbC5hcHBseShfZ2V0UHJvdG90eXBlT2YyLCBbdGhpc10uY29uY2F0KGFyZ3MpKSk7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBzZWxlY3RlZEl0ZW06IG51bGxcbiAgICB9O1xuICAgIF90aGlzLmNhY2hlZElkT2ZJdGVtcyA9IG5ldyBNYXAoKTtcblxuICAgIF90aGlzLm9uUHJlc3NFbnRlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAodHlwZW9mIGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWVzID0gX3RoaXMucHJvcHMudmFsdWVzO1xuXG4gICAgICBfdGhpcy5tb2RpZnlUZXh0KHZhbHVlc1tfdGhpcy5nZXRQb3NpdGlvbkluTGlzdCgpXSk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldFBvc2l0aW9uSW5MaXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IF90aGlzLnByb3BzLnZhbHVlcztcbiAgICAgIHZhciBzZWxlY3RlZEl0ZW0gPSBfdGhpcy5zdGF0ZS5zZWxlY3RlZEl0ZW07XG4gICAgICBpZiAoIXNlbGVjdGVkSXRlbSkgcmV0dXJuIDA7XG4gICAgICByZXR1cm4gdmFsdWVzLmZpbmRJbmRleChmdW5jdGlvbiAoYSkge1xuICAgICAgICByZXR1cm4gX3RoaXMuZ2V0SWQoYSkgPT09IF90aGlzLmdldElkKHNlbGVjdGVkSXRlbSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0SWQgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgaWYgKF90aGlzLmNhY2hlZElkT2ZJdGVtcy5oYXMoaXRlbSkpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgICByZXR1cm4gX3RoaXMuY2FjaGVkSWRPZkl0ZW1zLmdldChpdGVtKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHRleHRUb1JlcGxhY2UgPSBfdGhpcy5wcm9wcy5nZXRUZXh0VG9SZXBsYWNlKGl0ZW0pO1xuXG4gICAgICB2YXIgY29tcHV0ZUlkID0gZnVuY3Rpb24gY29tcHV0ZUlkKCkge1xuICAgICAgICBpZiAodGV4dFRvUmVwbGFjZSkge1xuICAgICAgICAgIGlmICh0ZXh0VG9SZXBsYWNlLmtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHRUb1JlcGxhY2Uua2V5O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIiB8fCAhaXRlbS5rZXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0VG9SZXBsYWNlLnRleHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpdGVtLmtleSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkl0ZW0gXCIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGl0ZW0pLCBcIiBoYXMgdG8gaGF2ZSBkZWZpbmVkIFxcXCJrZXlcXFwiIHByb3BlcnR5XCIpKTtcbiAgICAgICAgfSAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgICByZXR1cm4gaXRlbS5rZXk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgaWQgPSBjb21wdXRlSWQoKTtcblxuICAgICAgX3RoaXMuY2FjaGVkSWRPZkl0ZW1zLnNldChpdGVtLCBpZCk7XG5cbiAgICAgIHJldHVybiBpZDtcbiAgICB9O1xuXG4gICAgX3RoaXMubGlzdGVuZXJzID0gW107XG4gICAgX3RoaXMuaXRlbXNSZWYgPSB7fTtcblxuICAgIF90aGlzLm1vZGlmeVRleHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHJldHVybjtcbiAgICAgIHZhciBvblNlbGVjdCA9IF90aGlzLnByb3BzLm9uU2VsZWN0O1xuICAgICAgb25TZWxlY3QodmFsdWUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zZWxlY3RJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBrZXlib2FyZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgICB2YXIgb25JdGVtSGlnaGxpZ2h0ZWQgPSBfdGhpcy5wcm9wcy5vbkl0ZW1IaWdobGlnaHRlZDtcbiAgICAgIGlmIChfdGhpcy5zdGF0ZS5zZWxlY3RlZEl0ZW0gPT09IGl0ZW0pIHJldHVybjtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3RlZEl0ZW06IGl0ZW1cbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb25JdGVtSGlnaGxpZ2h0ZWQoaXRlbSk7XG5cbiAgICAgICAgaWYgKGtleWJvYXJkKSB7XG4gICAgICAgICAgX3RoaXMucHJvcHMuZHJvcGRvd25TY3JvbGwoX3RoaXMuaXRlbXNSZWZbX3RoaXMuZ2V0SWQoaXRlbSldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLnNjcm9sbCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2YXIgdmFsdWVzID0gX3RoaXMucHJvcHMudmFsdWVzO1xuICAgICAgdmFyIGNvZGUgPSBlLmtleUNvZGUgfHwgZS53aGljaDtcblxuICAgICAgdmFyIG9sZFBvc2l0aW9uID0gX3RoaXMuZ2V0UG9zaXRpb25Jbkxpc3QoKTtcblxuICAgICAgdmFyIG5ld1Bvc2l0aW9uO1xuXG4gICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgY2FzZSBLRVlfQ09ERVMuRE9XTjpcbiAgICAgICAgICBuZXdQb3NpdGlvbiA9IG9sZFBvc2l0aW9uICsgMTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIEtFWV9DT0RFUy5VUDpcbiAgICAgICAgICBuZXdQb3NpdGlvbiA9IG9sZFBvc2l0aW9uIC0gMTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIG5ld1Bvc2l0aW9uID0gb2xkUG9zaXRpb247XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIG5ld1Bvc2l0aW9uID0gKG5ld1Bvc2l0aW9uICUgdmFsdWVzLmxlbmd0aCArIHZhbHVlcy5sZW5ndGgpICUgdmFsdWVzLmxlbmd0aDsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gICAgICBfdGhpcy5zZWxlY3RJdGVtKHZhbHVlc1tuZXdQb3NpdGlvbl0sIFtLRVlfQ09ERVMuRE9XTiwgS0VZX0NPREVTLlVQXS5pbmNsdWRlcyhjb2RlKSk7XG4gICAgfTtcblxuICAgIF90aGlzLmlzU2VsZWN0ZWQgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIHNlbGVjdGVkSXRlbSA9IF90aGlzLnN0YXRlLnNlbGVjdGVkSXRlbTtcbiAgICAgIGlmICghc2VsZWN0ZWRJdGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gX3RoaXMuZ2V0SWQoc2VsZWN0ZWRJdGVtKSA9PT0gX3RoaXMuZ2V0SWQoaXRlbSk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhMaXN0LCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goTGlzdGVuZXJzLmFkZChbS0VZX0NPREVTLkRPV04sIEtFWV9DT0RFUy5VUF0sIHRoaXMuc2Nyb2xsKSwgTGlzdGVuZXJzLmFkZChbS0VZX0NPREVTLkVOVEVSLCBLRVlfQ09ERVMuVEFCXSwgdGhpcy5vblByZXNzRW50ZXIpKTtcbiAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLnByb3BzLnZhbHVlcztcbiAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzWzBdKSB0aGlzLnNlbGVjdEl0ZW0odmFsdWVzWzBdKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkVXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShfcmVmKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIG9sZFZhbHVlcyA9IF9yZWYudmFsdWVzO1xuICAgICAgdmFyIHZhbHVlcyA9IHRoaXMucHJvcHMudmFsdWVzO1xuICAgICAgdmFyIG9sZFZhbHVlc1NlcmlhbGl6ZWQgPSBvbGRWYWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5nZXRJZCh2YWwpO1xuICAgICAgfSkuam9pbihcIlwiKTtcbiAgICAgIHZhciBuZXdWYWx1ZXNTZXJpYWxpemVkID0gdmFsdWVzLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuZ2V0SWQodmFsKTtcbiAgICAgIH0pLmpvaW4oXCJcIik7XG5cbiAgICAgIGlmIChvbGRWYWx1ZXNTZXJpYWxpemVkICE9PSBuZXdWYWx1ZXNTZXJpYWxpemVkICYmIHZhbHVlcyAmJiB2YWx1ZXNbMF0pIHtcbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtKHZhbHVlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdmFyIGxpc3RlbmVyO1xuXG4gICAgICB3aGlsZSAodGhpcy5saXN0ZW5lcnMubGVuZ3RoKSB7XG4gICAgICAgIGxpc3RlbmVyID0gdGhpcy5saXN0ZW5lcnMucG9wKCk7XG4gICAgICAgIExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgdmFsdWVzID0gX3RoaXMkcHJvcHMudmFsdWVzLFxuICAgICAgICAgIGNvbXBvbmVudCA9IF90aGlzJHByb3BzLmNvbXBvbmVudCxcbiAgICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzLnN0eWxlLFxuICAgICAgICAgIGl0ZW1DbGFzc05hbWUgPSBfdGhpcyRwcm9wcy5pdGVtQ2xhc3NOYW1lLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgICBpdGVtU3R5bGUgPSBfdGhpcyRwcm9wcy5pdGVtU3R5bGU7XG4gICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcInVsXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInJ0YV9fbGlzdCBcIi5jb25jYXQoY2xhc3NOYW1lIHx8IFwiXCIpLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIHZhbHVlcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbSwge1xuICAgICAgICAgIGtleTogX3RoaXMzLmdldElkKGl0ZW0pLFxuICAgICAgICAgIGlubmVyUmVmOiBmdW5jdGlvbiBpbm5lclJlZihyZWYpIHtcbiAgICAgICAgICAgIF90aGlzMy5pdGVtc1JlZltfdGhpczMuZ2V0SWQoaXRlbSldID0gcmVmO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2VsZWN0ZWQ6IF90aGlzMy5pc1NlbGVjdGVkKGl0ZW0pLFxuICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgY2xhc3NOYW1lOiBpdGVtQ2xhc3NOYW1lLFxuICAgICAgICAgIHN0eWxlOiBpdGVtU3R5bGUsXG4gICAgICAgICAgb25DbGlja0hhbmRsZXI6IF90aGlzMy5vblByZXNzRW50ZXIsXG4gICAgICAgICAgb25TZWxlY3RIYW5kbGVyOiBfdGhpczMuc2VsZWN0SXRlbSxcbiAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudFxuICAgICAgICB9KTtcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTGlzdDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZnVuY3Rpb24gZGVmYXVsdFNjcm9sbFRvSXRlbShjb250YWluZXIsIGl0ZW0pIHtcbiAgdmFyIGl0ZW1IZWlnaHQgPSBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGl0ZW0pLmdldFByb3BlcnR5VmFsdWUoXCJoZWlnaHRcIiksIDEwKTtcbiAgdmFyIGNvbnRhaW5lckhpZ2h0ID0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpLmdldFByb3BlcnR5VmFsdWUoXCJoZWlnaHRcIiksIDEwKSAtIGl0ZW1IZWlnaHQ7XG4gIHZhciBpdGVtT2Zmc2V0VG9wID0gaXRlbS5vZmZzZXRUb3A7XG4gIHZhciBhY3R1YWxTY3JvbGxUb3AgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xuXG4gIGlmIChpdGVtT2Zmc2V0VG9wIDwgYWN0dWFsU2Nyb2xsVG9wICsgY29udGFpbmVySGlnaHQgJiYgYWN0dWFsU2Nyb2xsVG9wIDwgaXRlbU9mZnNldFRvcCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcblxuXG4gIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBpdGVtT2Zmc2V0VG9wO1xufVxuXG52YXIgREVGQVVMVF9DQVJFVF9QT1NJVElPTiA9IFwibmV4dFwiO1xudmFyIFBPU0lUSU9OX0NPTkZJR1VSQVRJT04gPSB7XG4gIFg6IHtcbiAgICBMRUZUOiBcInJ0YV9fYXV0b2NvbXBsZXRlLS1sZWZ0XCIsXG4gICAgUklHSFQ6IFwicnRhX19hdXRvY29tcGxldGUtLXJpZ2h0XCJcbiAgfSxcbiAgWToge1xuICAgIFRPUDogXCJydGFfX2F1dG9jb21wbGV0ZS0tdG9wXCIsXG4gICAgQk9UVE9NOiBcInJ0YV9fYXV0b2NvbXBsZXRlLS1ib3R0b21cIlxuICB9XG59O1xuXG52YXIgZXJyb3JNZXNzYWdlID0gZnVuY3Rpb24gZXJyb3JNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoXCJSVEE6IGRhdGFQcm92aWRlciBmYWlsczogXCIuY29uY2F0KG1lc3NhZ2UsIFwiXFxuICAgIFxcbkNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIG9yIGNyZWF0ZSBpc3N1ZSBpZiB5b3UgdGhpbmsgaXQncyBidWcuIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJzY29wZWlvL3JlYWN0LXRleHRhcmVhLWF1dG9jb21wbGV0ZS9pc3N1ZXNcIikpO1xufTtcblxudmFyIHJlc2VydmVkUmVnZXhDaGFycyA9IFtcIi5cIiwgXCJeXCIsIFwiJFwiLCBcIipcIiwgXCIrXCIsIFwiLVwiLCBcIj9cIiwgXCIoXCIsIFwiKVwiLCBcIltcIiwgXCJdXCIsIFwie1wiLCBcIn1cIiwgXCJcXFxcXCIsIFwifFwiXTtcblxudmFyIGVzY2FwZVJlZ2V4ID0gZnVuY3Rpb24gZXNjYXBlUmVnZXgodGV4dCkge1xuICByZXR1cm4gX3RvQ29uc3VtYWJsZUFycmF5KHRleHQpLm1hcChmdW5jdGlvbiAoY2hhcmFjdGVyKSB7XG4gICAgcmV0dXJuIHJlc2VydmVkUmVnZXhDaGFycy5pbmNsdWRlcyhjaGFyYWN0ZXIpID8gXCJcXFxcXCIuY29uY2F0KGNoYXJhY3RlcikgOiBjaGFyYWN0ZXI7XG4gIH0pLmpvaW4oXCJcIik7XG59OyAvLyBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgY29tcG9uZW50IGlzIHRvIGZpZ3VyZSBvdXQgdG8gd2hpY2ggc2lkZSB0aGUgYXV0b2NvbXBsZXRlIHNob3VsZCBiZSBvcGVuZWRcblxuXG52YXIgQXV0b2NvbXBsZXRlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhBdXRvY29tcGxldGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEF1dG9jb21wbGV0ZSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQXV0b2NvbXBsZXRlKTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfZ2V0UHJvdG90eXBlT2YoQXV0b2NvbXBsZXRlKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBdXRvY29tcGxldGUsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdmFyIGJvdW5kYXJpZXNFbGVtZW50ID0gdGhpcy5wcm9wcy5ib3VuZGFyaWVzRWxlbWVudDtcblxuICAgICAgaWYgKHR5cGVvZiBib3VuZGFyaWVzRWxlbWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB2YXIgZWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYm91bmRhcmllc0VsZW1lbnQpO1xuXG4gICAgICAgIGlmICghZWxlbSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJUQTogSW52YWxpZCBwcm9wIGJvdW5kYXJpZXNFbGVtZW50OiBpdCBoYXMgdG8gYmUgc3RyaW5nIG9yIEhUTUxFbGVtZW50LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWxlbSA9IGVsZW07XG4gICAgICB9IGVsc2UgaWYgKGJvdW5kYXJpZXNFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXJFbGVtID0gYm91bmRhcmllc0VsZW1lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSVEE6IEludmFsaWQgcHJvcCBib3VuZGFyaWVzRWxlbWVudDogaXQgaGFzIHRvIGJlIHN0cmluZyBvciBIVE1MRWxlbWVudC5cIik7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5jb250YWluZXJFbGVtIHx8ICF0aGlzLmNvbnRhaW5lckVsZW0uY29udGFpbnModGhpcy5yZWYpKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJ0ZXN0XCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSVEE6IEludmFsaWQgcHJvcCBib3VuZGFyaWVzRWxlbWVudDogaXQgaGFzIHRvIGJlIG9uZSBvZiB0aGUgcGFyZW50cyBvZiB0aGUgUlRBLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgdmFyIF90aGlzJHJlZiRjbGFzc0xpc3QsIF90aGlzJHJlZiRjbGFzc0xpc3QyO1xuXG4gICAgICB2YXIgdG9wID0gdGhpcy5wcm9wcy50b3AgfHwgMDtcbiAgICAgIHZhciBsZWZ0ID0gdGhpcy5wcm9wcy5sZWZ0IHx8IDA7XG4gICAgICB2YXIgdXNlZENsYXNzZXMgPSBbXTtcbiAgICAgIHZhciB1bnVzZWRDbGFzc2VzID0gW107XG4gICAgICB2YXIgdG9wUG9zaXRpb24gPSAwO1xuICAgICAgdmFyIGxlZnRQb3NpdGlvbiA9IDA7XG4gICAgICB2YXIgY29udGFpbmVyQm91bmRzID0gdGhpcy5jb250YWluZXJFbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIGRyb3Bkb3duQm91bmRzID0gdGhpcy5yZWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB2YXIgdGV4dGFyZWFCb3VuZHMgPSB0aGlzLnByb3BzLnRleHRhcmVhUmVmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnJlZik7XG4gICAgICB2YXIgbWFyZ2luVG9wID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwibWFyZ2luLXRvcFwiKSwgMTApO1xuICAgICAgdmFyIG1hcmdpbkJvdHRvbSA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIm1hcmdpbi1ib3R0b21cIiksIDEwKTtcbiAgICAgIHZhciBtYXJnaW5MZWZ0ID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwibWFyZ2luLWxlZnRcIiksIDEwKTtcbiAgICAgIHZhciBtYXJnaW5SaWdodCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIm1hcmdpbi1yaWdodFwiKSwgMTApO1xuICAgICAgdmFyIGRyb3Bkb3duQm90dG9tID0gbWFyZ2luVG9wICsgbWFyZ2luQm90dG9tICsgdGV4dGFyZWFCb3VuZHMudG9wICsgdG9wICsgZHJvcGRvd25Cb3VuZHMuaGVpZ2h0O1xuICAgICAgdmFyIGRyb3Bkb3duUmlnaHQgPSBtYXJnaW5MZWZ0ICsgbWFyZ2luUmlnaHQgKyB0ZXh0YXJlYUJvdW5kcy5sZWZ0ICsgbGVmdCArIGRyb3Bkb3duQm91bmRzLndpZHRoO1xuXG4gICAgICBpZiAoZHJvcGRvd25SaWdodCA+IGNvbnRhaW5lckJvdW5kcy5yaWdodCAmJiB0ZXh0YXJlYUJvdW5kcy5sZWZ0ICsgbGVmdCA+IGRyb3Bkb3duQm91bmRzLndpZHRoKSB7XG4gICAgICAgIGxlZnRQb3NpdGlvbiA9IGxlZnQgLSBkcm9wZG93bkJvdW5kcy53aWR0aDtcbiAgICAgICAgdXNlZENsYXNzZXMucHVzaChQT1NJVElPTl9DT05GSUdVUkFUSU9OLlguTEVGVCk7XG4gICAgICAgIHVudXNlZENsYXNzZXMucHVzaChQT1NJVElPTl9DT05GSUdVUkFUSU9OLlguUklHSFQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVmdFBvc2l0aW9uID0gbGVmdDtcbiAgICAgICAgdXNlZENsYXNzZXMucHVzaChQT1NJVElPTl9DT05GSUdVUkFUSU9OLlguUklHSFQpO1xuICAgICAgICB1bnVzZWRDbGFzc2VzLnB1c2goUE9TSVRJT05fQ09ORklHVVJBVElPTi5YLkxFRlQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZHJvcGRvd25Cb3R0b20gPiBjb250YWluZXJCb3VuZHMuYm90dG9tICYmIHRleHRhcmVhQm91bmRzLnRvcCArIHRvcCA+IGRyb3Bkb3duQm91bmRzLmhlaWdodCkge1xuICAgICAgICB0b3BQb3NpdGlvbiA9IHRvcCAtIGRyb3Bkb3duQm91bmRzLmhlaWdodDtcbiAgICAgICAgdXNlZENsYXNzZXMucHVzaChQT1NJVElPTl9DT05GSUdVUkFUSU9OLlkuVE9QKTtcbiAgICAgICAgdW51c2VkQ2xhc3Nlcy5wdXNoKFBPU0lUSU9OX0NPTkZJR1VSQVRJT04uWS5CT1RUT00pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9wUG9zaXRpb24gPSB0b3A7XG4gICAgICAgIHVzZWRDbGFzc2VzLnB1c2goUE9TSVRJT05fQ09ORklHVVJBVElPTi5ZLkJPVFRPTSk7XG4gICAgICAgIHVudXNlZENsYXNzZXMucHVzaChQT1NJVElPTl9DT05GSUdVUkFUSU9OLlkuVE9QKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucHJvcHMucmVuZGVyVG9Cb2R5KSB7XG4gICAgICAgIHRvcFBvc2l0aW9uICs9IHRleHRhcmVhQm91bmRzLnRvcDtcbiAgICAgICAgbGVmdFBvc2l0aW9uICs9IHRleHRhcmVhQm91bmRzLmxlZnQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVmLnN0eWxlLnRvcCA9IFwiXCIuY29uY2F0KHRvcFBvc2l0aW9uLCBcInB4XCIpO1xuICAgICAgdGhpcy5yZWYuc3R5bGUubGVmdCA9IFwiXCIuY29uY2F0KGxlZnRQb3NpdGlvbiwgXCJweFwiKTtcblxuICAgICAgKF90aGlzJHJlZiRjbGFzc0xpc3QgPSB0aGlzLnJlZi5jbGFzc0xpc3QpLnJlbW92ZS5hcHBseShfdGhpcyRyZWYkY2xhc3NMaXN0LCB1bnVzZWRDbGFzc2VzKTtcblxuICAgICAgKF90aGlzJHJlZiRjbGFzc0xpc3QyID0gdGhpcy5yZWYuY2xhc3NMaXN0KS5hZGQuYXBwbHkoX3RoaXMkcmVmJGNsYXNzTGlzdDIsIHVzZWRDbGFzc2VzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgc3R5bGUgPSBfdGhpcyRwcm9wcy5zdHlsZSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgaW5uZXJSZWYgPSBfdGhpcyRwcm9wcy5pbm5lclJlZixcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIHJlbmRlclRvQm9keSA9IF90aGlzJHByb3BzLnJlbmRlclRvQm9keTtcbiAgICAgIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgIHZhciBhdXRvY29tcGxldGVDb250YWluZXIgPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiBmdW5jdGlvbiByZWYoX3JlZikge1xuICAgICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgICBfdGhpcy5yZWYgPSBfcmVmOyAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBpbm5lclJlZihfcmVmKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xhc3NOYW1lOiBcInJ0YV9fYXV0b2NvbXBsZXRlIFwiLmNvbmNhdChjbGFzc05hbWUgfHwgXCJcIiksXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSwgY2hpbGRyZW4pO1xuICAgICAgcmV0dXJuIHJlbmRlclRvQm9keSAmJiBib2R5ICE9PSBudWxsID8gUmVhY3RET00uY3JlYXRlUG9ydGFsKGF1dG9jb21wbGV0ZUNvbnRhaW5lciwgYm9keSkgOiBhdXRvY29tcGxldGVDb250YWluZXI7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEF1dG9jb21wbGV0ZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxudmFyIFJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQyKSB7XG4gIF9pbmhlcml0cyhSZWFjdFRleHRhcmVhQXV0b2NvbXBsZXRlLCBfUmVhY3QkQ29tcG9uZW50Mik7XG5cbiAgZnVuY3Rpb24gUmVhY3RUZXh0YXJlYUF1dG9jb21wbGV0ZShfcHJvcHMpIHtcbiAgICB2YXIgX3RoaXMyO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGUpO1xuXG4gICAgX3RoaXMyID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX2dldFByb3RvdHlwZU9mKFJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGUpLmNhbGwodGhpcywgX3Byb3BzKSk7XG4gICAgX3RoaXMyLnN0YXRlID0ge1xuICAgICAgdG9wOiBudWxsLFxuICAgICAgbGVmdDogbnVsbCxcbiAgICAgIGN1cnJlbnRUcmlnZ2VyOiBudWxsLFxuICAgICAgYWN0dWFsVG9rZW46IFwiXCIsXG4gICAgICBkYXRhOiBudWxsLFxuICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICBkYXRhTG9hZGluZzogZmFsc2UsXG4gICAgICBzZWxlY3Rpb25FbmQ6IDAsXG4gICAgICBjb21wb25lbnQ6IG51bGwsXG4gICAgICB0ZXh0VG9SZXBsYWNlOiBudWxsXG4gICAgfTtcblxuICAgIF90aGlzMi5lc2NMaXN0ZW5lckluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzMi5lc2NMaXN0ZW5lcikge1xuICAgICAgICBfdGhpczIuZXNjTGlzdGVuZXIgPSBMaXN0ZW5lcnMuYWRkKEtFWV9DT0RFUy5FU0MsIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpczIuZXNjTGlzdGVuZXJEZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzMi5lc2NMaXN0ZW5lcikge1xuICAgICAgICBMaXN0ZW5lcnMucmVtb3ZlKF90aGlzMi5lc2NMaXN0ZW5lcik7XG4gICAgICAgIF90aGlzMi5lc2NMaXN0ZW5lciA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzMi5nZXRTZWxlY3Rpb25Qb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghX3RoaXMyLnRleHRhcmVhUmVmKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlbGVjdGlvblN0YXJ0OiBfdGhpczIudGV4dGFyZWFSZWYuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgIHNlbGVjdGlvbkVuZDogX3RoaXMyLnRleHRhcmVhUmVmLnNlbGVjdGlvbkVuZFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLmdldFNlbGVjdGVkVGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghX3RoaXMyLnRleHRhcmVhUmVmKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBfdGhpczIkdGV4dGFyZWFSZWYgPSBfdGhpczIudGV4dGFyZWFSZWYsXG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSBfdGhpczIkdGV4dGFyZWFSZWYuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgc2VsZWN0aW9uRW5kID0gX3RoaXMyJHRleHRhcmVhUmVmLnNlbGVjdGlvbkVuZDtcbiAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA9PT0gc2VsZWN0aW9uRW5kKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBfdGhpczIuc3RhdGUudmFsdWUuc3Vic3RyKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgLSBzZWxlY3Rpb25TdGFydCk7XG4gICAgfTtcblxuICAgIF90aGlzMi5zZXRDYXJldFBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAwO1xuICAgICAgaWYgKCFfdGhpczIudGV4dGFyZWFSZWYpIHJldHVybjtcblxuICAgICAgX3RoaXMyLnRleHRhcmVhUmVmLmZvY3VzKCk7XG5cbiAgICAgIF90aGlzMi50ZXh0YXJlYVJlZi5zZXRTZWxlY3Rpb25SYW5nZShwb3NpdGlvbiwgcG9zaXRpb24pO1xuICAgIH07XG5cbiAgICBfdGhpczIuZ2V0Q2FyZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghX3RoaXMyLnRleHRhcmVhUmVmKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICB2YXIgcG9zaXRpb24gPSBfdGhpczIudGV4dGFyZWFSZWYuc2VsZWN0aW9uRW5kO1xuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH07XG5cbiAgICBfdGhpczIuX2hhbmRsZUNhcmV0Q2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBjbGVhbkxhc3RUcmlnZ2VyID0gZnVuY3Rpb24gY2xlYW5MYXN0VHJpZ2dlcigpIHtcbiAgICAgICAgdmFyIGJlZm9yZUhhbmRsZSA9IF90aGlzMi5nZXRDYXJldFBvc2l0aW9uKCkgLSAxO1xuICAgICAgICBfdGhpczIubGFzdFRyaWdnZXIgPSBfdGhpczIubGFzdFRyaWdnZXIgPyBiZWZvcmVIYW5kbGUgOiAwO1xuICAgICAgfTtcblxuICAgICAgaWYgKGUudHlwZSA9PT0gXCJrZXlkb3duXCIpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSB8fCBlLndoaWNoO1xuXG4gICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgIGNhc2UgS0VZX0NPREVTLlVQOlxuICAgICAgICAgIGNhc2UgS0VZX0NPREVTLkRPV046XG4gICAgICAgICAgICBpZiAoIV90aGlzMi5faXNBdXRvY29tcGxldGVPcGVuKCkpIHtcbiAgICAgICAgICAgICAgY2xlYW5MYXN0VHJpZ2dlcigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgS0VZX0NPREVTLkxFRlQ6XG4gICAgICAgICAgY2FzZSBLRVlfQ09ERVMuUklHSFQ6XG4gICAgICAgICAgICBjbGVhbkxhc3RUcmlnZ2VyKCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNsZWFuTGFzdFRyaWdnZXIoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLl9vblNlbGVjdCA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgX3RoaXMyJHN0YXRlID0gX3RoaXMyLnN0YXRlLFxuICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IF90aGlzMiRzdGF0ZS5zZWxlY3Rpb25FbmQsXG4gICAgICAgICAgY3VycmVudFRyaWdnZXIgPSBfdGhpczIkc3RhdGUuY3VycmVudFRyaWdnZXIsXG4gICAgICAgICAgdGV4dGFyZWFWYWx1ZSA9IF90aGlzMiRzdGF0ZS52YWx1ZTtcbiAgICAgIHZhciBvbkl0ZW1TZWxlY3RlZCA9IF90aGlzMi5wcm9wcy5vbkl0ZW1TZWxlY3RlZDtcbiAgICAgIGlmICghY3VycmVudFRyaWdnZXIpIHJldHVybjtcblxuICAgICAgdmFyIGdldFRleHRUb1JlcGxhY2VGb3JDdXJyZW50VHJpZ2dlciA9IF90aGlzMi5fZ2V0VGV4dFRvUmVwbGFjZShjdXJyZW50VHJpZ2dlcik7XG5cbiAgICAgIGlmICghZ2V0VGV4dFRvUmVwbGFjZUZvckN1cnJlbnRUcmlnZ2VyKSB7XG4gICAgICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdUb2tlbiA9IGdldFRleHRUb1JlcGxhY2VGb3JDdXJyZW50VHJpZ2dlcihpdGVtKTtcblxuICAgICAgaWYgKCFuZXdUb2tlbikge1xuICAgICAgICBfdGhpczIuX2Nsb3NlQXV0b2NvbXBsZXRlKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAob25JdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgb25JdGVtU2VsZWN0ZWQoe1xuICAgICAgICAgIGN1cnJlbnRUcmlnZ2VyOiBjdXJyZW50VHJpZ2dlcixcbiAgICAgICAgICBpdGVtOiBpdGVtXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29tcHV0ZUNhcmV0UG9zaXRpb24gPSBmdW5jdGlvbiBjb21wdXRlQ2FyZXRQb3NpdGlvbihwb3NpdGlvbiwgdG9rZW4sIHN0YXJ0VG9rZW4pIHtcbiAgICAgICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgICAgIGNhc2UgXCJzdGFydFwiOlxuICAgICAgICAgICAgcmV0dXJuIHN0YXJ0VG9rZW47XG5cbiAgICAgICAgICBjYXNlIFwibmV4dFwiOlxuICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgIHJldHVybiBzdGFydFRva2VuICsgdG9rZW4ubGVuZ3RoO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSVEE6IGNhcmV0UG9zaXRpb24gc2hvdWxkIGJlIFwic3RhcnRcIiwgXCJuZXh0XCIsIFwiZW5kXCIgb3IgbnVtYmVyLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZhciB0ZXh0VG9Nb2RpZnkgPSB0ZXh0YXJlYVZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvbkVuZCk7XG4gICAgICAvKipcbiAgICAgICAqIEl0J3MgaW1wb3J0YW50IHRvIGVzY2FwZSB0aGUgY3VycmVudFRyaWdnZXIgY2hhciBmb3IgY2hhcnMgbGlrZSBbLCAoLC4uLlxuICAgICAgICogVGhpcyBpcyBhIHJpZGljdWxvdXMgZGFyayBtYWdpYywgYmFzaWNhbGx5IHdlIGZvdW5kIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGN1cnJlbnQgdG9rZW4gKGZyb20gY3VycmVudCB0cmlnZ2VyKSBhbmQgdGhlbiB3ZSByZXBsYWNlIHRoZSB0ZXh0IGZyb20gdGhhdCBwb3NpdGlvbiAoY2FsY3VsYXRpbmcgdGhlIG9mZnNldClcbiAgICAgICAqL1xuXG4gICAgICB2YXIgZXNjYXBlZEN1cnJlbnRUcmlnZ2VyID0gZXNjYXBlUmVnZXgoY3VycmVudFRyaWdnZXIpO1xuICAgICAgdmFyIHRyaWdnZXJPZmZzZXQgPSB0ZXh0VG9Nb2RpZnkubGVuZ3RoIC0gdGV4dFRvTW9kaWZ5Lmxhc3RJbmRleE9mKGN1cnJlbnRUcmlnZ2VyKTtcbiAgICAgIHZhciBzdGFydE9mVG9rZW5Qb3NpdGlvbiA9IHRleHRUb01vZGlmeS5zZWFyY2gobmV3IFJlZ0V4cChcIig/IVwiLmNvbmNhdChlc2NhcGVkQ3VycmVudFRyaWdnZXIsIFwiKSRcIikpKSAtIHRyaWdnZXJPZmZzZXQ7IC8vIHdlIGFkZCBzcGFjZSBhZnRlciBlbW9qaSBpcyBzZWxlY3RlZCBpZiBhIGNhcmV0IHBvc2l0aW9uIGlzIG5leHRcblxuICAgICAgdmFyIG5ld1Rva2VuU3RyaW5nID0gbmV3VG9rZW4uY2FyZXRQb3NpdGlvbiA9PT0gXCJuZXh0XCIgPyBcIlwiLmNvbmNhdChuZXdUb2tlbi50ZXh0LCBcIiBcIikgOiBuZXdUb2tlbi50ZXh0O1xuICAgICAgdmFyIG5ld0NhcmV0UG9zaXRpb24gPSBjb21wdXRlQ2FyZXRQb3NpdGlvbihuZXdUb2tlbi5jYXJldFBvc2l0aW9uLCBuZXdUb2tlblN0cmluZywgc3RhcnRPZlRva2VuUG9zaXRpb24pO1xuICAgICAgdmFyIG1vZGlmaWVkVGV4dCA9IHRleHRUb01vZGlmeS5zdWJzdHJpbmcoMCwgc3RhcnRPZlRva2VuUG9zaXRpb24pICsgbmV3VG9rZW5TdHJpbmc7XG4gICAgICB2YXIgbmV3VmFsdWUgPSB0ZXh0YXJlYVZhbHVlLnJlcGxhY2UodGV4dFRvTW9kaWZ5LCBtb2RpZmllZFRleHQpOyAvLyBzZXQgdGhlIG5ldyB0ZXh0YXJlYSB2YWx1ZSBhbmQgYWZ0ZXIgdGhhdCBzZXQgdGhlIGNhcmV0IGJhY2sgdG8gaXRzIHBvc2l0aW9uXG5cbiAgICAgIF90aGlzMi5zZXRTdGF0ZSh7XG4gICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgZGF0YUxvYWRpbmc6IGZhbHNlXG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnNlcnRlZFRyaWdnZXIgPSBfdGhpczIudG9rZW5SZWdFeHBFbmRpbmcuZXhlYyhuZXdUb2tlblN0cmluZyk7XG5cbiAgICAgICAgdmFyIGluc2VydGVkVHJpZ2dlck1vZGlmaWVyID0gaW5zZXJ0ZWRUcmlnZ2VyID8gaW5zZXJ0ZWRUcmlnZ2VyWzBdLmxlbmd0aCA6IDE7XG4gICAgICAgIF90aGlzMi5sYXN0VHJpZ2dlciA9IG5ld0NhcmV0UG9zaXRpb24gPyBuZXdDYXJldFBvc2l0aW9uIC0gaW5zZXJ0ZWRUcmlnZ2VyTW9kaWZpZXIgOiBuZXdDYXJldFBvc2l0aW9uO1xuICAgICAgICBfdGhpczIudGV4dGFyZWFSZWYudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgX3RoaXMyLnRleHRhcmVhUmVmLnNlbGVjdGlvbkVuZCA9IG5ld0NhcmV0UG9zaXRpb247XG5cbiAgICAgICAgX3RoaXMyLl9jaGFuZ2VIYW5kbGVyKCk7XG5cbiAgICAgICAgdmFyIHNjcm9sbFRvcCA9IF90aGlzMi50ZXh0YXJlYVJlZi5zY3JvbGxUb3A7XG5cbiAgICAgICAgX3RoaXMyLnNldENhcmV0UG9zaXRpb24obmV3Q2FyZXRQb3NpdGlvbik7XG4gICAgICAgIC8qXG4gICAgICAgICAgQ2hyb21lIGRvZXMgbm90IG1haW50YWluIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgIFJlbGV2YW50IGRpc2N1c3Npb24gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNjb3BlaW8vcmVhY3QtdGV4dGFyZWEtYXV0b2NvbXBsZXRlL3B1bGwvOTdcbiAgICAgICAgKi9cblxuXG4gICAgICAgIGlmICh3aW5kb3cuY2hyb21lKSB7XG4gICAgICAgICAgX3RoaXMyLnRleHRhcmVhUmVmLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzMi5fZ2V0VGV4dFRvUmVwbGFjZSA9IGZ1bmN0aW9uIChjdXJyZW50VHJpZ2dlcikge1xuICAgICAgdmFyIHRyaWdnZXJTZXR0aW5ncyA9IF90aGlzMi5wcm9wcy50cmlnZ2VyW2N1cnJlbnRUcmlnZ2VyXTtcbiAgICAgIGlmICghY3VycmVudFRyaWdnZXIgfHwgIXRyaWdnZXJTZXR0aW5ncykgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgb3V0cHV0ID0gdHJpZ2dlclNldHRpbmdzLm91dHB1dDtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiYgKCFvdXRwdXQgfHwgdHlwZW9mIG91dHB1dCAhPT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3V0cHV0IGZ1bmN0b3IgaXMgbm90IGRlZmluZWQhIElmIHlvdSBhcmUgdXNpbmcgaXRlbXMgYXMgb2JqZWN0IHlvdSBoYXZlIHRvIGRlZmluZSBcIm91dHB1dFwiIGZ1bmN0aW9uLiBodHRwczovL2dpdGh1Yi5jb20vd2Vic2NvcGVpby9yZWFjdC10ZXh0YXJlYS1hdXRvY29tcGxldGUjdHJpZ2dlci10eXBlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgICAgdmFyIHRleHRUb1JlcGxhY2UgPSBvdXRwdXQoaXRlbSwgY3VycmVudFRyaWdnZXIpO1xuXG4gICAgICAgICAgaWYgKHRleHRUb1JlcGxhY2UgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdGV4dFRvUmVwbGFjZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT3V0cHV0IGZ1bmN0b3Igc2hvdWxkIHJldHVybiBzdHJpbmcgb3Igb2JqZWN0IGluIHNoYXBlIHt0ZXh0OiBzdHJpbmcsIGNhcmV0UG9zaXRpb246IHN0cmluZyB8IG51bWJlcn0uXFxuR290IFxcXCJcIi5jb25jYXQoU3RyaW5nKHRleHRUb1JlcGxhY2UpLCBcIlxcXCIuIENoZWNrIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdHJpZ2dlciBcXFwiXCIpLmNvbmNhdChjdXJyZW50VHJpZ2dlciwgXCJcXFwiXFxuXFxuU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJzY29wZWlvL3JlYWN0LXRleHRhcmVhLWF1dG9jb21wbGV0ZSN0cmlnZ2VyLXR5cGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uXFxuXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGV4dFRvUmVwbGFjZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHRleHRUb1JlcGxhY2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHRleHQ6IHRleHRUb1JlcGxhY2UsXG4gICAgICAgICAgICAgIGNhcmV0UG9zaXRpb246IERFRkFVTFRfQ0FSRVRfUE9TSVRJT05cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCF0ZXh0VG9SZXBsYWNlLnRleHQgJiYgdHlwZW9mIHRleHRUb1JlcGxhY2UudGV4dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk91dHB1dCBcXFwidGV4dFxcXCIgaXMgbm90IGRlZmluZWQhIE9iamVjdCBzaG91bGQgaGFzIHNoYXBlIHt0ZXh0OiBzdHJpbmcsIGNhcmV0UG9zaXRpb246IHN0cmluZyB8IG51bWJlcn0uIENoZWNrIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdHJpZ2dlciBcXFwiXCIuY29uY2F0KGN1cnJlbnRUcmlnZ2VyLCBcIlxcXCJcXG5cIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdGV4dFRvUmVwbGFjZS5jYXJldFBvc2l0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPdXRwdXQgXFxcImNhcmV0UG9zaXRpb25cXFwiIGlzIG5vdCBkZWZpbmVkISBPYmplY3Qgc2hvdWxkIGhhcyBzaGFwZSB7dGV4dDogc3RyaW5nLCBjYXJldFBvc2l0aW9uOiBzdHJpbmcgfCBudW1iZXJ9LiBDaGVjayB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRyaWdnZXIgXFxcIlwiLmNvbmNhdChjdXJyZW50VHJpZ2dlciwgXCJcXFwiXFxuXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGV4dFRvUmVwbGFjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk91dHB1dCBpdGVtIHNob3VsZCBiZSBzdHJpbmdcXG5cIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRleHQ6IFwiXCIuY29uY2F0KGN1cnJlbnRUcmlnZ2VyKS5jb25jYXQoaXRlbSkuY29uY2F0KGN1cnJlbnRUcmlnZ2VyKSxcbiAgICAgICAgICBjYXJldFBvc2l0aW9uOiBERUZBVUxUX0NBUkVUX1BPU0lUSU9OXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH07XG5cbiAgICBfdGhpczIuX2dldEN1cnJlbnRUcmlnZ2VyU2V0dGluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY3VycmVudFRyaWdnZXIgPSBfdGhpczIuc3RhdGUuY3VycmVudFRyaWdnZXI7XG4gICAgICBpZiAoIWN1cnJlbnRUcmlnZ2VyKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBfdGhpczIucHJvcHMudHJpZ2dlcltjdXJyZW50VHJpZ2dlcl07XG4gICAgfTtcblxuICAgIF90aGlzMi5fZ2V0VmFsdWVzRnJvbVByb3ZpZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzMiRzdGF0ZTIgPSBfdGhpczIuc3RhdGUsXG4gICAgICAgICAgY3VycmVudFRyaWdnZXIgPSBfdGhpczIkc3RhdGUyLmN1cnJlbnRUcmlnZ2VyLFxuICAgICAgICAgIGFjdHVhbFRva2VuID0gX3RoaXMyJHN0YXRlMi5hY3R1YWxUb2tlbjtcblxuICAgICAgdmFyIHRyaWdnZXJTZXR0aW5ncyA9IF90aGlzMi5fZ2V0Q3VycmVudFRyaWdnZXJTZXR0aW5ncygpO1xuXG4gICAgICBpZiAoIWN1cnJlbnRUcmlnZ2VyIHx8ICF0cmlnZ2VyU2V0dGluZ3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGF0YVByb3ZpZGVyID0gdHJpZ2dlclNldHRpbmdzLmRhdGFQcm92aWRlcixcbiAgICAgICAgICBjb21wb25lbnQgPSB0cmlnZ2VyU2V0dGluZ3MuY29tcG9uZW50O1xuXG4gICAgICBpZiAodHlwZW9mIGRhdGFQcm92aWRlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRyaWdnZXIgcHJvdmlkZXIgaGFzIHRvIGJlIGEgZnVuY3Rpb24hXCIpO1xuICAgICAgfVxuXG4gICAgICBfdGhpczIuc2V0U3RhdGUoe1xuICAgICAgICBkYXRhTG9hZGluZzogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBwcm92aWRlZERhdGEgPSBkYXRhUHJvdmlkZXIoYWN0dWFsVG9rZW4pO1xuXG4gICAgICBpZiAoIShwcm92aWRlZERhdGEgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgICAgICBwcm92aWRlZERhdGEgPSBQcm9taXNlLnJlc29sdmUocHJvdmlkZWREYXRhKTtcbiAgICAgIH1cblxuICAgICAgcHJvdmlkZWREYXRhLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVHJpZ2dlciBwcm92aWRlciBoYXMgdG8gcHJvdmlkZSBhbiBhcnJheSFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tcG9uZW50IHNob3VsZCBiZSBkZWZpbmVkIVwiKTtcbiAgICAgICAgfSAvLyB0aHJvdyBhd2F5IGlmIHdlIHJlc29sdmVkIG9sZCB0cmlnZ2VyXG5cblxuICAgICAgICBpZiAoY3VycmVudFRyaWdnZXIgIT09IF90aGlzMi5zdGF0ZS5jdXJyZW50VHJpZ2dlcikgcmV0dXJuOyAvLyBpZiB3ZSBoYXZlbid0IHJlc29sdmVkIGFueSBkYXRhIGxldCdzIGNsb3NlIHRoZSBhdXRvY29tcGxldGVcblxuICAgICAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgX3RoaXMyLl9jbG9zZUF1dG9jb21wbGV0ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMyLnNldFN0YXRlKHtcbiAgICAgICAgICBkYXRhTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudFxuICAgICAgICB9KTtcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2UoZS5tZXNzYWdlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpczIuX2dldFN1Z2dlc3Rpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzMiRzdGF0ZTMgPSBfdGhpczIuc3RhdGUsXG4gICAgICAgICAgY3VycmVudFRyaWdnZXIgPSBfdGhpczIkc3RhdGUzLmN1cnJlbnRUcmlnZ2VyLFxuICAgICAgICAgIGRhdGEgPSBfdGhpczIkc3RhdGUzLmRhdGE7XG4gICAgICBpZiAoIWN1cnJlbnRUcmlnZ2VyIHx8ICFkYXRhIHx8IGRhdGEgJiYgIWRhdGEubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH07XG5cbiAgICBfdGhpczIuX2NyZWF0ZVJlZ0V4cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0cmlnZ2VyID0gX3RoaXMyLnByb3BzLnRyaWdnZXI7IC8vIG5lZ2F0aXZlIGxvb2thaGVhZCB0byBtYXRjaCBvbmx5IHRoZSB0cmlnZ2VyICsgdGhlIGFjdHVhbCB0b2tlbiA9IFwiYmxhZGh3ZDphZGF3ZDp3b3JkIHRlc3RcIiA9PiBcIjp3b3JkXCJcbiAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS84MDU3ODI3LzI3MTk5MTdcblxuICAgICAgX3RoaXMyLnRva2VuUmVnRXhwID0gbmV3IFJlZ0V4cChcIihcIi5jb25jYXQoT2JqZWN0LmtleXModHJpZ2dlcikgLy8gdGhlIHNvcnQgaXMgaW1wb3J0YW50IGZvciBtdWx0aS1jaGFyIGNvbWJvcyBhcyBcIi9raWNrXCIsIFwiL1wiXG4gICAgICAuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhID4gYikge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHJldHVybiBlc2NhcGVSZWdleChhKTtcbiAgICAgIH0pLmpvaW4oXCJ8XCIpLCBcIikoKD86KD8hXFxcXDEpW15cXFxcc10pKiQpXCIpKTtcbiAgICAgIF90aGlzMi50b2tlblJlZ0V4cEVuZGluZyA9IG5ldyBSZWdFeHAoXCIoXCIuY29uY2F0KE9iamVjdC5rZXlzKHRyaWdnZXIpIC8vIHRoZSBzb3J0IGlzIGltcG9ydGFudCBmb3IgbXVsdGktY2hhciBjb21ib3MgYXMgXCIva2lja1wiLCBcIi9cIlxuICAgICAgLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgaWYgKGEgPCBiKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYSA+IGIpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAoYSkge1xuICAgICAgICByZXR1cm4gZXNjYXBlUmVnZXgoYSk7XG4gICAgICB9KS5qb2luKFwifFwiKSwgXCIpJFwiKSk7XG4gICAgfTtcblxuICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY3VycmVudFRyaWdnZXIgPSBfdGhpczIuc3RhdGUuY3VycmVudFRyaWdnZXI7XG5cbiAgICAgIF90aGlzMi5lc2NMaXN0ZW5lckRlc3Ryb3koKTtcblxuICAgICAgX3RoaXMyLnNldFN0YXRlKHtcbiAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgZGF0YUxvYWRpbmc6IGZhbHNlLFxuICAgICAgICBjdXJyZW50VHJpZ2dlcjogbnVsbFxuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY3VycmVudFRyaWdnZXIpIF90aGlzMi5fb25JdGVtSGlnaGxpZ2h0ZWRIYW5kbGVyKG51bGwpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzMi5fY2xlYW5VcFByb3BzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb3BzID0gX29iamVjdFNwcmVhZCh7fSwgX3RoaXMyLnByb3BzKTtcblxuICAgICAgdmFyIG5vdFNhZmUgPSBbXCJsb2FkaW5nQ29tcG9uZW50XCIsIFwiYm91bmRhcmllc0VsZW1lbnRcIiwgXCJjb250YWluZXJTdHlsZVwiLCBcIm1pbkNoYXJcIiwgXCJzY3JvbGxUb0l0ZW1cIiwgXCJyZWZcIiwgXCJpbm5lclJlZlwiLCBcIm9uQ2hhbmdlXCIsIFwib25DYXJldFBvc2l0aW9uQ2hhbmdlXCIsIFwiY2xhc3NOYW1lXCIsIFwidmFsdWVcIiwgXCJ0cmlnZ2VyXCIsIFwibGlzdFN0eWxlXCIsIFwiaXRlbVN0eWxlXCIsIFwiY29udGFpbmVyU3R5bGVcIiwgXCJsb2FkZXJTdHlsZVwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRhaW5lckNsYXNzTmFtZVwiLCBcImxpc3RDbGFzc05hbWVcIiwgXCJpdGVtQ2xhc3NOYW1lXCIsIFwibG9hZGVyQ2xhc3NOYW1lXCIsIFwiZHJvcGRvd25TdHlsZVwiLCBcImRyb3Bkb3duQ2xhc3NOYW1lXCIsIFwibW92ZVBvcHVwQXNZb3VUeXBlXCIsIFwidGV4dEFyZWFDb21wb25lbnRcIiwgXCJyZW5kZXJUb0JvZHlcIiwgXCJvbkl0ZW1TZWxlY3RlZFwiLCBcIm9uSXRlbUhpZ2hsaWdodGVkXCJdOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcblxuICAgICAgZm9yICh2YXIgcHJvcCBpbiBwcm9wcykge1xuICAgICAgICBpZiAobm90U2FmZS5pbmNsdWRlcyhwcm9wKSkgZGVsZXRlIHByb3BzW3Byb3BdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvcHM7XG4gICAgfTtcblxuICAgIF90aGlzMi5fY2hhbmdlSGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMyJHByb3BzID0gX3RoaXMyLnByb3BzLFxuICAgICAgICAgIHRyaWdnZXIgPSBfdGhpczIkcHJvcHMudHJpZ2dlcixcbiAgICAgICAgICBvbkNoYW5nZSA9IF90aGlzMiRwcm9wcy5vbkNoYW5nZSxcbiAgICAgICAgICBtaW5DaGFyID0gX3RoaXMyJHByb3BzLm1pbkNoYXIsXG4gICAgICAgICAgb25DYXJldFBvc2l0aW9uQ2hhbmdlID0gX3RoaXMyJHByb3BzLm9uQ2FyZXRQb3NpdGlvbkNoYW5nZSxcbiAgICAgICAgICBtb3ZlUG9wdXBBc1lvdVR5cGUgPSBfdGhpczIkcHJvcHMubW92ZVBvcHVwQXNZb3VUeXBlO1xuICAgICAgdmFyIF90aGlzMiRzdGF0ZTQgPSBfdGhpczIuc3RhdGUsXG4gICAgICAgICAgdG9wID0gX3RoaXMyJHN0YXRlNC50b3AsXG4gICAgICAgICAgbGVmdCA9IF90aGlzMiRzdGF0ZTQubGVmdDtcbiAgICAgIHZhciBldmVudCA9IGU7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgLy8gZmlyZSBvbkNoYW5nZSBldmVudCBhZnRlciBzdWNjZXNzZnVsIHNlbGVjdGlvblxuICAgICAgICBldmVudCA9IG5ldyBDdXN0b21FdmVudChcImNoYW5nZVwiLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczIudGV4dGFyZWFSZWYuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICB9XG5cbiAgICAgIHZhciB0ZXh0YXJlYSA9IGV2ZW50LnRhcmdldCB8fCBfdGhpczIudGV4dGFyZWFSZWY7IC8vIGZhbGxiYWNrIHRvIHN1cHBvcnQgU2hhZG93IERPTVxuXG4gICAgICB2YXIgc2VsZWN0aW9uRW5kID0gdGV4dGFyZWEuc2VsZWN0aW9uRW5kO1xuICAgICAgdmFyIHZhbHVlID0gdGV4dGFyZWEudmFsdWU7XG4gICAgICBfdGhpczIubGFzdFZhbHVlQnViYmxlZEV2ZW50ID0gdmFsdWU7XG5cbiAgICAgIGlmIChvbkNoYW5nZSAmJiBldmVudCkge1xuICAgICAgICBldmVudC5wZXJzaXN0ICYmIGV2ZW50LnBlcnNpc3QoKTtcbiAgICAgICAgb25DaGFuZ2UobmV3IFByb3h5KGV2ZW50LCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQob3JpZ2luYWwsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJ0YXJnZXRcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdGV4dGFyZWE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldChvcmlnaW5hbCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAob25DYXJldFBvc2l0aW9uQ2hhbmdlKSB7XG4gICAgICAgIHZhciBjYXJldFBvc2l0aW9uID0gX3RoaXMyLmdldENhcmV0UG9zaXRpb24oKTtcblxuICAgICAgICBvbkNhcmV0UG9zaXRpb25DaGFuZ2UoY2FyZXRQb3NpdGlvbik7XG4gICAgICB9XG5cbiAgICAgIF90aGlzMi5zZXRTdGF0ZSh7XG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBzZXRUb3BMZWZ0ID0gZnVuY3Rpb24gc2V0VG9wTGVmdCgpIHtcbiAgICAgICAgdmFyIF9nZXRDYXJldENvb3JkaW5hdGVzID0gZ2V0Q2FyZXRDb29yZGluYXRlcyh0ZXh0YXJlYSwgc2VsZWN0aW9uRW5kKSxcbiAgICAgICAgICAgIG5ld1RvcCA9IF9nZXRDYXJldENvb3JkaW5hdGVzLnRvcCxcbiAgICAgICAgICAgIG5ld0xlZnQgPSBfZ2V0Q2FyZXRDb29yZGluYXRlcy5sZWZ0O1xuXG4gICAgICAgIF90aGlzMi5zZXRTdGF0ZSh7XG4gICAgICAgICAgLy8gbWFrZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0ZXh0YXJlYVxuICAgICAgICAgIHRvcDogbmV3VG9wIC0gX3RoaXMyLnRleHRhcmVhUmVmLnNjcm9sbFRvcCB8fCAwLFxuICAgICAgICAgIGxlZnQ6IG5ld0xlZnRcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgY2xlYW5MYXN0VHJpZ2dlciA9IGZ1bmN0aW9uIGNsZWFuTGFzdFRyaWdnZXIodHJpZ2dlckxlbmd0aCkge1xuICAgICAgICBfdGhpczIubGFzdFRyaWdnZXIgPSBzZWxlY3Rpb25FbmQgLSB0cmlnZ2VyTGVuZ3RoO1xuXG4gICAgICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUoKTtcblxuICAgICAgICBzZXRUb3BMZWZ0KCk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoc2VsZWN0aW9uRW5kIDw9IF90aGlzMi5sYXN0VHJpZ2dlcikge1xuICAgICAgICB2YXIgX2FmZmVjdGVkVGV4dGFyZWFWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvbkVuZCk7XG5cbiAgICAgICAgdmFyIF9uZXdUcmlnZ2VyID0gX3RoaXMyLnRva2VuUmVnRXhwLmV4ZWMoX2FmZmVjdGVkVGV4dGFyZWFWYWx1ZSk7XG5cbiAgICAgICAgY2xlYW5MYXN0VHJpZ2dlcihfbmV3VHJpZ2dlciA/IF9uZXdUcmlnZ2VyWzBdLmxlbmd0aCA6IDApO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWZmZWN0ZWRUZXh0YXJlYVZhbHVlID0gdmFsdWUuc2xpY2UoX3RoaXMyLmxhc3RUcmlnZ2VyLCBzZWxlY3Rpb25FbmQpO1xuXG4gICAgICB2YXIgdG9rZW5NYXRjaCA9IF90aGlzMi50b2tlblJlZ0V4cC5leGVjKGFmZmVjdGVkVGV4dGFyZWFWYWx1ZSk7XG5cbiAgICAgIHZhciBsYXN0VG9rZW4gPSB0b2tlbk1hdGNoICYmIHRva2VuTWF0Y2hbMF07XG4gICAgICB2YXIgY3VycmVudFRyaWdnZXIgPSB0b2tlbk1hdGNoICYmIHRva2VuTWF0Y2hbMV0gfHwgbnVsbDtcbiAgICAgIHZhciBjdXJyZW50VHJpZ2dlckxlbmd0aCA9IGN1cnJlbnRUcmlnZ2VyID8gY3VycmVudFRyaWdnZXIubGVuZ3RoIC0gMSA6IDA7IC8vIHdpdGggdGhpcyBhcHByb2FjaCB3ZSB3YW50IHRvIGtub3cgaWYgdGhlIHVzZXIganVzdCBpbnNlcnRlZCBhIG5ldyB0cmlnZ2VyIHNlcXVlbmNlXG5cbiAgICAgIHZhciBuZXdUcmlnZ2VyID0gX3RoaXMyLnRva2VuUmVnRXhwRW5kaW5nLmV4ZWMoYWZmZWN0ZWRUZXh0YXJlYVZhbHVlKTtcblxuICAgICAgaWYgKG5ld1RyaWdnZXIpIHtcbiAgICAgICAgY2xlYW5MYXN0VHJpZ2dlcihuZXdUcmlnZ2VyWzBdLmxlbmd0aCk7XG4gICAgICB9IGVsc2UgaWYgKCFfdGhpczIuX2lzQXV0b2NvbXBsZXRlT3BlbigpKSB7XG4gICAgICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUoKTtcbiAgICAgIH1cbiAgICAgIC8qXG4gICAgICAgaWYgd2UgbG9zdCB0aGUgdHJpZ2dlciB0b2tlbiBvciB0aGVyZSBpcyBubyBmb2xsb3dpbmcgY2hhcmFjdGVyIHdlIHdhbnQgdG8gY2xvc2VcbiAgICAgICB0aGUgYXV0b2NvbXBsZXRlXG4gICAgICAqL1xuXG5cbiAgICAgIGlmICgoIWxhc3RUb2tlbiB8fCBsYXN0VG9rZW4ubGVuZ3RoIDw9IG1pbkNoYXIgKyBjdXJyZW50VHJpZ2dlckxlbmd0aCkgJiYgKCAvLyBjaGVjayBpZiBvdXIgY3VycmVudCB0cmlnZ2VyIGRpc2FsbG93cyB3aGl0ZXNwYWNlXG4gICAgICBfdGhpczIuc3RhdGUuY3VycmVudFRyaWdnZXIgJiYgIXRyaWdnZXJbX3RoaXMyLnN0YXRlLmN1cnJlbnRUcmlnZ2VyXS5hbGxvd1doaXRlc3BhY2UgfHwgIV90aGlzMi5zdGF0ZS5jdXJyZW50VHJpZ2dlcikpIHtcbiAgICAgICAgX3RoaXMyLl9jbG9zZUF1dG9jb21wbGV0ZSgpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogVGhpcyBjb2RlIGhhcyB0byBiZSBzeW5jIHRoYXQgaXMgdGhlIHJlYXNvbiB3aHkgd2Ugb2J0YWluIHRoZSBjdXJyZW50VHJpZ2dlclxuICAgICAgICogZnJvbSBjdXJyZW50VHJpZ2dlciBub3QgdGhpcy5zdGF0ZS5jdXJyZW50VHJpZ2dlclxuICAgICAgICpcbiAgICAgICAqIENoZWNrIGlmIHRoZSBjdXJyZW50bHkgdHlwZWQgdG9rZW4gaGFzIHRvIGJlIGFmdGVyV2hpdGVzcGFjZSwgb3Igbm90LlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgc2V0dGluZyBtZWFucyB0aGF0IHRoZXJlIGhhcyB0byBiZSB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgdG9rZW4gKG9uIGl0IGhhcyB0byBiZSB0aGUgdGhlIGZpcnN0IGNoYXJhY3RlciB0eXBlZCBpbnRvIHRleHRhcmVhKVxuICAgICAgICovXG5cblxuICAgICAgaWYgKGN1cnJlbnRUcmlnZ2VyICYmIHRyaWdnZXJbY3VycmVudFRyaWdnZXJdLmFmdGVyV2hpdGVzcGFjZSAmJiAhL1xccy8udGVzdCh2YWx1ZVtzZWxlY3Rpb25FbmQgLSBsYXN0VG9rZW4ubGVuZ3RoIC0gMV0pICYmIHZhbHVlW3NlbGVjdGlvbkVuZCAtIGxhc3RUb2tlbi5sZW5ndGggLSAxXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvKipcbiAgICAgICAgSWYgb3VyIGN1cnJlbnQgdHJpZ2dlciBhbGxvd3Mgd2hpdGVzcGFjZVxuICAgICAgICBnZXQgdGhlIGNvcnJlY3QgdG9rZW4gZm9yIERhdGFQcm92aWRlciwgc28gd2UgbmVlZCB0byBjb25zdHJ1Y3QgbmV3IFJlZ0V4cFxuICAgICAgICovXG5cblxuICAgICAgaWYgKF90aGlzMi5zdGF0ZS5jdXJyZW50VHJpZ2dlciAmJiB0cmlnZ2VyW190aGlzMi5zdGF0ZS5jdXJyZW50VHJpZ2dlcl0uYWxsb3dXaGl0ZXNwYWNlKSB7XG4gICAgICAgIHRva2VuTWF0Y2ggPSBuZXcgUmVnRXhwKFwiXCIuY29uY2F0KGVzY2FwZVJlZ2V4KF90aGlzMi5zdGF0ZS5jdXJyZW50VHJpZ2dlciksIFwiLiokXCIpKS5leGVjKHZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvbkVuZCkpO1xuICAgICAgICBsYXN0VG9rZW4gPSB0b2tlbk1hdGNoICYmIHRva2VuTWF0Y2hbMF07XG5cbiAgICAgICAgaWYgKCFsYXN0VG9rZW4pIHtcbiAgICAgICAgICBfdGhpczIuX2Nsb3NlQXV0b2NvbXBsZXRlKCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VHJpZ2dlciA9IE9iamVjdC5rZXlzKHRyaWdnZXIpLmZpbmQoZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgICByZXR1cm4gYS5zbGljZSgwLCBjdXJyZW50VHJpZ2dlckxlbmd0aCArIDEpID09PSBsYXN0VG9rZW4uc2xpY2UoMCwgY3VycmVudFRyaWdnZXJMZW5ndGggKyAxKTtcbiAgICAgICAgfSkgfHwgbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGFjdHVhbFRva2VuID0gbGFzdFRva2VuLnNsaWNlKDEpOyAvLyBpZiB0cmlnZ2VyIGlzIG5vdCBjb25maWd1cmVkIHN0ZXAgb3V0IGZyb20gdGhlIGZ1bmN0aW9uLCBvdGhlcndpc2UgcHJvY2VlZFxuXG4gICAgICBpZiAoIWN1cnJlbnRUcmlnZ2VyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vdmVQb3B1cEFzWW91VHlwZSB8fCB0b3AgPT09IG51bGwgJiYgbGVmdCA9PT0gbnVsbCB8fCAvLyBpZiB0aGUgdHJpZ2dlciBnb3QgY2hhbmdlZCwgbGV0J3MgcmVwb3NpdGlvbiB0aGUgYXV0b2NvbXBsZXRlXG4gICAgICBfdGhpczIuc3RhdGUuY3VycmVudFRyaWdnZXIgIT09IGN1cnJlbnRUcmlnZ2VyKSB7XG4gICAgICAgIHNldFRvcExlZnQoKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMyLmVzY0xpc3RlbmVySW5pdCgpO1xuXG4gICAgICB2YXIgdGV4dFRvUmVwbGFjZSA9IF90aGlzMi5fZ2V0VGV4dFRvUmVwbGFjZShjdXJyZW50VHJpZ2dlcik7XG5cbiAgICAgIF90aGlzMi5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGlvbkVuZDogc2VsZWN0aW9uRW5kLFxuICAgICAgICBjdXJyZW50VHJpZ2dlcjogY3VycmVudFRyaWdnZXIsXG4gICAgICAgIHRleHRUb1JlcGxhY2U6IHRleHRUb1JlcGxhY2UsXG4gICAgICAgIGFjdHVhbFRva2VuOiBhY3R1YWxUb2tlblxuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIF90aGlzMi5fZ2V0VmFsdWVzRnJvbVByb3ZpZGVyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGVycm9yTWVzc2FnZShlcnIubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpczIuX3NlbGVjdEhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzMiRwcm9wczIgPSBfdGhpczIucHJvcHMsXG4gICAgICAgICAgb25DYXJldFBvc2l0aW9uQ2hhbmdlID0gX3RoaXMyJHByb3BzMi5vbkNhcmV0UG9zaXRpb25DaGFuZ2UsXG4gICAgICAgICAgb25TZWxlY3QgPSBfdGhpczIkcHJvcHMyLm9uU2VsZWN0O1xuXG4gICAgICBpZiAob25DYXJldFBvc2l0aW9uQ2hhbmdlKSB7XG4gICAgICAgIHZhciBjYXJldFBvc2l0aW9uID0gX3RoaXMyLmdldENhcmV0UG9zaXRpb24oKTtcblxuICAgICAgICBvbkNhcmV0UG9zaXRpb25DaGFuZ2UoY2FyZXRQb3NpdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChvblNlbGVjdCkge1xuICAgICAgICBlLnBlcnNpc3QoKTtcbiAgICAgICAgb25TZWxlY3QoZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzMi5fc2hvdWxkU3RheU9wZW4gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGVsID0gZS5yZWxhdGVkVGFyZ2V0OyAvLyBJRTExIGRvZXNuJ3Qga25vdyBhYm91dCBgcmVsYXRlZFRhcmdldGAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ5MzI1MTk2LzI3MTk5MTdcblxuICAgICAgaWYgKGVsID09PSBudWxsKSB7XG4gICAgICAgIGVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMi5kcm9wZG93blJlZiAmJiBlbCBpbnN0YW5jZW9mIE5vZGUgJiYgX3RoaXMyLmRyb3Bkb3duUmVmLmNvbnRhaW5zKGVsKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICBfdGhpczIuX29uQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIG9uQ2xpY2sgPSBfdGhpczIucHJvcHMub25DbGljaztcblxuICAgICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgICAgZS5wZXJzaXN0KCk7XG4gICAgICAgIG9uQ2xpY2soZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczIuX3Nob3VsZFN0YXlPcGVuKGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMyLl9jbG9zZUF1dG9jb21wbGV0ZSgpO1xuICAgIH07XG5cbiAgICBfdGhpczIuX29uQmx1ciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25CbHVyID0gX3RoaXMyLnByb3BzLm9uQmx1cjtcblxuICAgICAgaWYgKG9uQmx1cikge1xuICAgICAgICBlLnBlcnNpc3QoKTtcbiAgICAgICAgb25CbHVyKGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMyLl9zaG91bGRTdGF5T3BlbihlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzMi5fY2xvc2VBdXRvY29tcGxldGUoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMyLl9vblNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczIuX2Nsb3NlQXV0b2NvbXBsZXRlKCk7XG4gICAgfTtcblxuICAgIF90aGlzMi5fb25JdGVtSGlnaGxpZ2h0ZWRIYW5kbGVyID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBvbkl0ZW1IaWdobGlnaHRlZCA9IF90aGlzMi5wcm9wcy5vbkl0ZW1IaWdobGlnaHRlZDtcbiAgICAgIHZhciBjdXJyZW50VHJpZ2dlciA9IF90aGlzMi5zdGF0ZS5jdXJyZW50VHJpZ2dlcjtcblxuICAgICAgaWYgKG9uSXRlbUhpZ2hsaWdodGVkKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb25JdGVtSGlnaGxpZ2h0ZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG9uSXRlbUhpZ2hsaWdodGVkKHtcbiAgICAgICAgICAgIGN1cnJlbnRUcmlnZ2VyOiBjdXJyZW50VHJpZ2dlcixcbiAgICAgICAgICAgIGl0ZW06IGl0ZW1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJgb25JdGVtSGlnaGxpZ2h0ZWRgIGhhcyB0byBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzMi5fZHJvcGRvd25TY3JvbGwgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIHNjcm9sbFRvSXRlbSA9IF90aGlzMi5wcm9wcy5zY3JvbGxUb0l0ZW07XG4gICAgICBpZiAoIXNjcm9sbFRvSXRlbSkgcmV0dXJuO1xuXG4gICAgICBpZiAoc2Nyb2xsVG9JdGVtID09PSB0cnVlKSB7XG4gICAgICAgIGRlZmF1bHRTY3JvbGxUb0l0ZW0oX3RoaXMyLmRyb3Bkb3duUmVmLCBpdGVtKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNjcm9sbFRvSXRlbSAhPT0gXCJmdW5jdGlvblwiIHx8IHNjcm9sbFRvSXRlbS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYHNjcm9sbFRvSXRlbWAgaGFzIHRvIGJlIGJvb2xlYW4gKHRydWUgZm9yIGRlZmF1bHQgaW1wbGVtZW50YXRpb24pIG9yIGZ1bmN0aW9uIHdpdGggdHdvIHBhcmFtZXRlcnM6IGNvbnRhaW5lciwgaXRlbS5cIik7XG4gICAgICB9XG5cbiAgICAgIHNjcm9sbFRvSXRlbShfdGhpczIuZHJvcGRvd25SZWYsIGl0ZW0pO1xuICAgIH07XG5cbiAgICBfdGhpczIuX2lzQXV0b2NvbXBsZXRlT3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpczIkc3RhdGU1ID0gX3RoaXMyLnN0YXRlLFxuICAgICAgICAgIGRhdGFMb2FkaW5nID0gX3RoaXMyJHN0YXRlNS5kYXRhTG9hZGluZyxcbiAgICAgICAgICBjdXJyZW50VHJpZ2dlciA9IF90aGlzMiRzdGF0ZTUuY3VycmVudFRyaWdnZXI7XG5cbiAgICAgIHZhciBzdWdnZXN0aW9uRGF0YSA9IF90aGlzMi5fZ2V0U3VnZ2VzdGlvbnMoKTtcblxuICAgICAgcmV0dXJuICEhKChkYXRhTG9hZGluZyB8fCBzdWdnZXN0aW9uRGF0YSkgJiYgY3VycmVudFRyaWdnZXIpO1xuICAgIH07XG5cbiAgICBfdGhpczIuX3RleHRhcmVhUmVmID0gZnVuY3Rpb24gKHJlZikge1xuICAgICAgLy8gJEZsb3dGaXhNZSAtIHJlZiBpcyBhY3R1YWxseSBhIGA/SFRNTFRleHRBcmVhRWxlbWVudGBcbiAgICAgIF90aGlzMi5wcm9wcy5pbm5lclJlZiAmJiBfdGhpczIucHJvcHMuaW5uZXJSZWYocmVmKTtcbiAgICAgIF90aGlzMi50ZXh0YXJlYVJlZiA9IHJlZjtcbiAgICB9O1xuXG4gICAgX3RoaXMyLmxhc3RUcmlnZ2VyID0gMDtcbiAgICBfdGhpczIuZXNjTGlzdGVuZXIgPSBudWxsO1xuICAgIHZhciBfdGhpczIkcHJvcHMzID0gX3RoaXMyLnByb3BzLFxuICAgICAgICBsb2FkaW5nQ29tcG9uZW50ID0gX3RoaXMyJHByb3BzMy5sb2FkaW5nQ29tcG9uZW50LFxuICAgICAgICBfdHJpZ2dlciA9IF90aGlzMiRwcm9wczMudHJpZ2dlcixcbiAgICAgICAgX3ZhbHVlID0gX3RoaXMyJHByb3BzMy52YWx1ZTtcbiAgICBpZiAoX3ZhbHVlKSBfdGhpczIuc3RhdGUudmFsdWUgPSBfdmFsdWU7XG5cbiAgICBfdGhpczIuX2NyZWF0ZVJlZ0V4cCgpO1xuXG4gICAgaWYgKCFsb2FkaW5nQ29tcG9uZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSVEE6IGxvYWRpbmdDb21wb25lbnQgaXMgbm90IGRlZmluZWRcIik7XG4gICAgfVxuXG4gICAgaWYgKCFfdHJpZ2dlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUlRBOiB0cmlnZ2VyIGlzIG5vdCBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpczI7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUmVhY3RUZXh0YXJlYUF1dG9jb21wbGV0ZSwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICBMaXN0ZW5lcnMuc3RhcnRMaXN0ZW4odGhpcy50ZXh0YXJlYVJlZik7IC8vIGhhbmRsZSBjYXJldCBjaGFuZ2VcblxuICAgICAgdGhpcy50ZXh0YXJlYVJlZiAmJiB0aGlzLnRleHRhcmVhUmVmLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLl9oYW5kbGVDYXJldENoYW5nZSk7XG4gICAgICB0aGlzLnRleHRhcmVhUmVmICYmIHRoaXMudGV4dGFyZWFSZWYuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX2hhbmRsZUNhcmV0Q2hhbmdlKTtcbiAgICAgIHRoaXMudGV4dGFyZWFSZWYgJiYgdGhpcy50ZXh0YXJlYVJlZi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLl9oYW5kbGVDYXJldENoYW5nZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoX3JlZjIpIHtcbiAgICAgIHZhciBvbGRUcmlnZ2VyID0gX3JlZjIudHJpZ2dlcixcbiAgICAgICAgICBvbGRWYWx1ZSA9IF9yZWYyLnZhbHVlO1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgdHJpZ2dlciA9IF90aGlzJHByb3BzMi50cmlnZ2VyLFxuICAgICAgICAgIHZhbHVlID0gX3RoaXMkcHJvcHMyLnZhbHVlO1xuXG4gICAgICBpZiAoT2JqZWN0LmtleXModHJpZ2dlcikuam9pbihcIlwiKSAhPT0gT2JqZWN0LmtleXMob2xkVHJpZ2dlcikuam9pbihcIlwiKSkge1xuICAgICAgICB0aGlzLl9jcmVhdGVSZWdFeHAoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZFZhbHVlICE9PSB2YWx1ZSAmJiB0aGlzLmxhc3RWYWx1ZUJ1YmJsZWRFdmVudCAhPT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5sYXN0VHJpZ2dlciA9IDA7XG5cbiAgICAgICAgdGhpcy5fY2hhbmdlSGFuZGxlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMuZXNjTGlzdGVuZXJEZXN0cm95KCk7XG4gICAgICBMaXN0ZW5lcnMuc3RvcExpc3Rlbih0aGlzLnRleHRhcmVhUmVmKTsgLy8gaGFuZGxlIGNhcmV0IGNoYW5nZVxuXG4gICAgICB0aGlzLnRleHRhcmVhUmVmICYmIHRoaXMudGV4dGFyZWFSZWYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuX2hhbmRsZUNhcmV0Q2hhbmdlKTtcbiAgICAgIHRoaXMudGV4dGFyZWFSZWYgJiYgdGhpcy50ZXh0YXJlYVJlZi5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5faGFuZGxlQ2FyZXRDaGFuZ2UpO1xuICAgICAgdGhpcy50ZXh0YXJlYVJlZiAmJiB0aGlzLnRleHRhcmVhUmVmLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuX2hhbmRsZUNhcmV0Q2hhbmdlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBMb2FkZXIgPSBfdGhpcyRwcm9wczMubG9hZGluZ0NvbXBvbmVudCxcbiAgICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzMy5zdHlsZSxcbiAgICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczMuY2xhc3NOYW1lLFxuICAgICAgICAgIGxpc3RTdHlsZSA9IF90aGlzJHByb3BzMy5saXN0U3R5bGUsXG4gICAgICAgICAgaXRlbVN0eWxlID0gX3RoaXMkcHJvcHMzLml0ZW1TdHlsZSxcbiAgICAgICAgICBib3VuZGFyaWVzRWxlbWVudCA9IF90aGlzJHByb3BzMy5ib3VuZGFyaWVzRWxlbWVudCxcbiAgICAgICAgICBtb3ZlUG9wdXBBc1lvdVR5cGUgPSBfdGhpcyRwcm9wczMubW92ZVBvcHVwQXNZb3VUeXBlLFxuICAgICAgICAgIGxpc3RDbGFzc05hbWUgPSBfdGhpcyRwcm9wczMubGlzdENsYXNzTmFtZSxcbiAgICAgICAgICBpdGVtQ2xhc3NOYW1lID0gX3RoaXMkcHJvcHMzLml0ZW1DbGFzc05hbWUsXG4gICAgICAgICAgZHJvcGRvd25DbGFzc05hbWUgPSBfdGhpcyRwcm9wczMuZHJvcGRvd25DbGFzc05hbWUsXG4gICAgICAgICAgZHJvcGRvd25TdHlsZSA9IF90aGlzJHByb3BzMy5kcm9wZG93blN0eWxlLFxuICAgICAgICAgIGNvbnRhaW5lclN0eWxlID0gX3RoaXMkcHJvcHMzLmNvbnRhaW5lclN0eWxlLFxuICAgICAgICAgIGNvbnRhaW5lckNsYXNzTmFtZSA9IF90aGlzJHByb3BzMy5jb250YWluZXJDbGFzc05hbWUsXG4gICAgICAgICAgbG9hZGVyU3R5bGUgPSBfdGhpcyRwcm9wczMubG9hZGVyU3R5bGUsXG4gICAgICAgICAgbG9hZGVyQ2xhc3NOYW1lID0gX3RoaXMkcHJvcHMzLmxvYWRlckNsYXNzTmFtZSxcbiAgICAgICAgICB0ZXh0QXJlYUNvbXBvbmVudCA9IF90aGlzJHByb3BzMy50ZXh0QXJlYUNvbXBvbmVudCxcbiAgICAgICAgICByZW5kZXJUb0JvZHkgPSBfdGhpcyRwcm9wczMucmVuZGVyVG9Cb2R5O1xuICAgICAgdmFyIF90aGlzJHN0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICBsZWZ0ID0gX3RoaXMkc3RhdGUubGVmdCxcbiAgICAgICAgICB0b3AgPSBfdGhpcyRzdGF0ZS50b3AsXG4gICAgICAgICAgZGF0YUxvYWRpbmcgPSBfdGhpcyRzdGF0ZS5kYXRhTG9hZGluZyxcbiAgICAgICAgICBjb21wb25lbnQgPSBfdGhpcyRzdGF0ZS5jb21wb25lbnQsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRzdGF0ZS52YWx1ZSxcbiAgICAgICAgICB0ZXh0VG9SZXBsYWNlID0gX3RoaXMkc3RhdGUudGV4dFRvUmVwbGFjZTtcblxuICAgICAgdmFyIGlzQXV0b2NvbXBsZXRlT3BlbiA9IHRoaXMuX2lzQXV0b2NvbXBsZXRlT3BlbigpO1xuXG4gICAgICB2YXIgc3VnZ2VzdGlvbkRhdGEgPSB0aGlzLl9nZXRTdWdnZXN0aW9ucygpO1xuXG4gICAgICB2YXIgZXh0cmFBdHRycyA9IHt9O1xuICAgICAgdmFyIFRleHRBcmVhQ29tcG9uZW50O1xuXG4gICAgICBpZiAodGV4dEFyZWFDb21wb25lbnQuY29tcG9uZW50KSB7XG4gICAgICAgIFRleHRBcmVhQ29tcG9uZW50ID0gdGV4dEFyZWFDb21wb25lbnQuY29tcG9uZW50O1xuICAgICAgICBleHRyYUF0dHJzW3RleHRBcmVhQ29tcG9uZW50LnJlZl0gPSB0aGlzLl90ZXh0YXJlYVJlZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFRleHRBcmVhQ29tcG9uZW50ID0gdGV4dEFyZWFDb21wb25lbnQ7XG4gICAgICAgIGV4dHJhQXR0cnMucmVmID0gdGhpcy5fdGV4dGFyZWFSZWY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInJ0YSBcIi5jb25jYXQoZGF0YUxvYWRpbmcgPT09IHRydWUgPyBcInJ0YS0tbG9hZGluZ1wiIDogXCJcIiwgXCIgXCIpLmNvbmNhdChjb250YWluZXJDbGFzc05hbWUgfHwgXCJcIiksXG4gICAgICAgIHN0eWxlOiBjb250YWluZXJTdHlsZVxuICAgICAgfSwgUmVhY3QuY3JlYXRlRWxlbWVudChUZXh0QXJlYUNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY2xlYW5VcFByb3BzKCksIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInJ0YV9fdGV4dGFyZWEgXCIuY29uY2F0KGNsYXNzTmFtZSB8fCBcIlwiKSxcbiAgICAgICAgb25DaGFuZ2U6IHRoaXMuX2NoYW5nZUhhbmRsZXIsXG4gICAgICAgIG9uU2VsZWN0OiB0aGlzLl9zZWxlY3RIYW5kbGVyLFxuICAgICAgICBvblNjcm9sbDogdGhpcy5fb25TY3JvbGxIYW5kbGVyLFxuICAgICAgICBvbkNsaWNrOiAvLyBUaGUgdGV4dGFyZWEgaXRzZWxmIGlzIG91dHNpZGUgdGhlIGF1dG9zZWxlY3QgZHJvcGRvd24uXG4gICAgICAgIHRoaXMuX29uQ2xpY2ssXG4gICAgICAgIG9uQmx1cjogdGhpcy5fb25CbHVyLFxuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSwgZXh0cmFBdHRycykpLCBpc0F1dG9jb21wbGV0ZU9wZW4gJiYgUmVhY3QuY3JlYXRlRWxlbWVudChBdXRvY29tcGxldGUsIHtcbiAgICAgICAgaW5uZXJSZWY6IGZ1bmN0aW9uIGlubmVyUmVmKHJlZikge1xuICAgICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgICBfdGhpczMuZHJvcGRvd25SZWYgPSByZWY7XG4gICAgICAgIH0sXG4gICAgICAgIHRvcDogdG9wLFxuICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICBzdHlsZTogZHJvcGRvd25TdHlsZSxcbiAgICAgICAgY2xhc3NOYW1lOiBkcm9wZG93bkNsYXNzTmFtZSxcbiAgICAgICAgbW92ZVBvcHVwQXNZb3VUeXBlOiBtb3ZlUG9wdXBBc1lvdVR5cGUsXG4gICAgICAgIGJvdW5kYXJpZXNFbGVtZW50OiBib3VuZGFyaWVzRWxlbWVudCxcbiAgICAgICAgdGV4dGFyZWFSZWY6IHRoaXMudGV4dGFyZWFSZWYsXG4gICAgICAgIHJlbmRlclRvQm9keTogcmVuZGVyVG9Cb2R5XG4gICAgICB9LCBzdWdnZXN0aW9uRGF0YSAmJiBjb21wb25lbnQgJiYgdGV4dFRvUmVwbGFjZSAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KExpc3QsIHtcbiAgICAgICAgdmFsdWVzOiBzdWdnZXN0aW9uRGF0YSxcbiAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQsXG4gICAgICAgIHN0eWxlOiBsaXN0U3R5bGUsXG4gICAgICAgIGNsYXNzTmFtZTogbGlzdENsYXNzTmFtZSxcbiAgICAgICAgaXRlbUNsYXNzTmFtZTogaXRlbUNsYXNzTmFtZSxcbiAgICAgICAgaXRlbVN0eWxlOiBpdGVtU3R5bGUsXG4gICAgICAgIGdldFRleHRUb1JlcGxhY2U6IHRleHRUb1JlcGxhY2UsXG4gICAgICAgIG9uSXRlbUhpZ2hsaWdodGVkOiB0aGlzLl9vbkl0ZW1IaWdobGlnaHRlZEhhbmRsZXIsXG4gICAgICAgIG9uU2VsZWN0OiB0aGlzLl9vblNlbGVjdCxcbiAgICAgICAgZHJvcGRvd25TY3JvbGw6IHRoaXMuX2Ryb3Bkb3duU2Nyb2xsXG4gICAgICB9KSwgZGF0YUxvYWRpbmcgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJydGFfX2xvYWRlciBcIi5jb25jYXQoc3VnZ2VzdGlvbkRhdGEgIT09IG51bGwgPyBcInJ0YV9fbG9hZGVyLS1zdWdnZXN0aW9uLWRhdGFcIiA6IFwicnRhX19sb2FkZXItLWVtcHR5LXN1Z2dlc3Rpb24tZGF0YVwiLCBcIiBcIikuY29uY2F0KGxvYWRlckNsYXNzTmFtZSB8fCBcIlwiKSxcbiAgICAgICAgc3R5bGU6IGxvYWRlclN0eWxlXG4gICAgICB9LCBSZWFjdC5jcmVhdGVFbGVtZW50KExvYWRlciwge1xuICAgICAgICBkYXRhOiBzdWdnZXN0aW9uRGF0YVxuICAgICAgfSkpKSk7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhfcmVmMykge1xuICAgICAgdmFyIHZhbHVlID0gX3JlZjMudmFsdWU7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cblJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGUuZGVmYXVsdFByb3BzID0ge1xuICBtb3ZlUG9wdXBBc1lvdVR5cGU6IGZhbHNlLFxuICB2YWx1ZTogbnVsbCxcbiAgbWluQ2hhcjogMSxcbiAgYm91bmRhcmllc0VsZW1lbnQ6IFwiYm9keVwiLFxuICBzY3JvbGxUb0l0ZW06IHRydWUsXG4gIHRleHRBcmVhQ29tcG9uZW50OiBcInRleHRhcmVhXCIsXG4gIHJlbmRlclRvQm9keTogZmFsc2Vcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGU7XG4iLCIvLyBDcmVkaXRzIGdvIHRvIExpYW0ncyBQZXJpb2RpYyBOb3RlcyBQbHVnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9saWFtY2Fpbi9vYnNpZGlhbi1wZXJpb2RpYy1ub3Rlc1xyXG4vLyBpbXBvcnQgeyBUZXh0SW5wdXRTdWdnZXN0IH0gZnJvbSBcIi4vb2JTdWdnZXN0XCI7XHJcbmltcG9ydCBtZW1vU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9tZW1vU2VydmljZSc7XHJcbmltcG9ydCBkYWlseU5vdGVzU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9kYWlseU5vdGVzU2VydmljZSc7XHJcbmltcG9ydCB7VXNlVmF1bHRUYWdzfSBmcm9tICcuLi9tZW1vcyc7XHJcblxyXG5jb25zdCBldFRhZ3MgPSAoKTogc3RyaW5nW10gPT4ge1xyXG4gIGNvbnN0IHthcHB9ID0gZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKTtcclxuICAvL0B0cy1leHBlY3QtZXJyb3IsIHByaXZhdGUgbWV0aG9kXHJcbiAgY29uc3QgdGFnczogYW55ID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0VGFncygpO1xyXG4gIHJldHVybiBbLi4uT2JqZWN0LmtleXModGFncyldLm1hcCgocCkgPT4gcC5zcGxpdCgnIycpLnBvcCgpKTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCB1c2VkVGFncyA9IChzZWxldGVjVGV4dDogc3RyaW5nKSA9PiB7XHJcbiAgbGV0IGFsbFRhZ3M7XHJcblxyXG4gIGlmIChVc2VWYXVsdFRhZ3MpIHtcclxuICAgIGFsbFRhZ3MgPSBldFRhZ3MoKTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3Qge3RhZ3N9ID0gbWVtb1NlcnZpY2UuZ2V0U3RhdGUoKTtcclxuICAgIGFsbFRhZ3MgPSB0YWdzO1xyXG4gIH1cclxuICBjb25zdCBsb3dlckNhc2VJbnB1dFN0ciA9IHNlbGV0ZWNUZXh0LnRvTG93ZXJDYXNlKCk7XHJcbiAgY29uc3QgdXNlZFRhZ3MgPSBbXSBhcyBhbnk7XHJcblxyXG4gIGFsbFRhZ3MuZm9yRWFjaCgodGFnOiBzdHJpbmcpID0+IHtcclxuICAgIGlmICh0YWcgJiYgdGFnLnRvTG93ZXJDYXNlKCkuY29udGFpbnMobG93ZXJDYXNlSW5wdXRTdHIpKSB7XHJcbiAgICAgIHVzZWRUYWdzLnB1c2goe1xyXG4gICAgICAgIG5hbWU6IHRhZyBhcyBzdHJpbmcsXHJcbiAgICAgICAgY2hhcjogdGFnIGFzIHN0cmluZyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiB1c2VkVGFncztcclxufTtcclxuIiwiLy8gQ3JlZGl0cyBnbyB0byBMaWFtJ3MgUGVyaW9kaWMgTm90ZXMgUGx1Z2luOiBodHRwczovL2dpdGh1Yi5jb20vbGlhbWNhaW4vb2JzaWRpYW4tcGVyaW9kaWMtbm90ZXNcbmltcG9ydCB7VEFic3RyYWN0RmlsZSwgVEZpbGV9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBkYWlseU5vdGVzU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9kYWlseU5vdGVzU2VydmljZSc7XG5cbmV4cG9ydCBjb25zdCBnZXRTdWdnZXN0aW9ucyA9IChpbnB1dFN0cjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHthcHB9ID0gZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKTtcblxuICBjb25zdCBhYnN0cmFjdEZpbGVzID0gYXBwLnZhdWx0LmdldEFsbExvYWRlZEZpbGVzKCk7XG4gIC8vIGNvbnN0IGZpbGVzOiBURmlsZVtdID0gW107XG4gIGNvbnN0IGZpbGVzID0gW10gYXMgYW55O1xuXG4gIGxldCBhY3R1YWxJbnB1dDogc3RyaW5nO1xuXG4gIGFic3RyYWN0RmlsZXMuZm9yRWFjaCgoZmlsZTogVEFic3RyYWN0RmlsZSkgPT4ge1xuICAgIGlmIChpbnB1dFN0ciA9PT0gJ1snKSB7XG4gICAgICBhY3R1YWxJbnB1dCA9ICcnO1xuICAgICAgY29uc3QgbG93ZXJDYXNlSW5wdXRTdHIgPSBhY3R1YWxJbnB1dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlIGluc3RhbmNlb2YgVEZpbGUgJiZcbiAgICAgICAgKGZpbGUuZXh0ZW5zaW9uID09PSAnbWQnIHx8XG4gICAgICAgICAgZmlsZS5leHRlbnNpb24gPT09ICdwbmcnIHx8XG4gICAgICAgICAgZmlsZS5leHRlbnNpb24gPT09ICdqcGcnIHx8XG4gICAgICAgICAgZmlsZS5leHRlbnNpb24gPT09ICdqcGVnJyB8fFxuICAgICAgICAgIGZpbGUuZXh0ZW5zaW9uID09PSAnZ2lmJykgJiZcbiAgICAgICAgZmlsZS5wYXRoLnRvTG93ZXJDYXNlKCkuY29udGFpbnMobG93ZXJDYXNlSW5wdXRTdHIpXG4gICAgICApIHtcbiAgICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZmlsZS5iYXNlbmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgY2hhcjogZmlsZS5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBmaWxlOiBmaWxlIGFzIFRGaWxlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlucHV0U3RyLmNvbnRhaW5zKCdbJykpIHtcbiAgICAgIGFjdHVhbElucHV0ID0gaW5wdXRTdHIuc2xpY2UoMSk7XG4gICAgICBjb25zdCBsb3dlckNhc2VJbnB1dFN0ciA9IGFjdHVhbElucHV0LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoXG4gICAgICAgIGZpbGUgaW5zdGFuY2VvZiBURmlsZSAmJlxuICAgICAgICAoZmlsZS5leHRlbnNpb24gPT09ICdtZCcgfHxcbiAgICAgICAgICBmaWxlLmV4dGVuc2lvbiA9PT0gJ3BuZycgfHxcbiAgICAgICAgICBmaWxlLmV4dGVuc2lvbiA9PT0gJ2pwZycgfHxcbiAgICAgICAgICBmaWxlLmV4dGVuc2lvbiA9PT0gJ2pwZWcnIHx8XG4gICAgICAgICAgZmlsZS5leHRlbnNpb24gPT09ICdnaWYnKSAmJlxuICAgICAgICBmaWxlLnBhdGgudG9Mb3dlckNhc2UoKS5jb250YWlucyhsb3dlckNhc2VJbnB1dFN0cilcbiAgICAgICkge1xuICAgICAgICBmaWxlcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBmaWxlLmJhc2VuYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBjaGFyOiBmaWxlLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGZpbGU6IGZpbGUgYXMgVEZpbGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZpbGVzO1xufTtcbiIsIi8vINin2YTYudix2KjZitipXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gxI1lxaF0aW5hXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gRGFuc2tcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHt9O1xyXG4iLCIvLyBEZXV0c2NoXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gRW5nbGlzaFxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIC8vIHNldHRpbmcudHNcclxuICB3ZWxjb21lOiAnV2VsY29tZSB0byB0aGUgTWVtb3MnLFxyXG4gIHJpYmJvbkljb25UaXRsZTogJ01lbW9zJyxcclxuICB0bzogJ3RvJyxcclxuICBtb250aHM6IFtcclxuICAgICdKYW51YXJ5JyxcclxuICAgICdGZWJydWFyeScsXHJcbiAgICAnTWFyY2gnLFxyXG4gICAgJ0FwcmlsJyxcclxuICAgICdNYXknLFxyXG4gICAgJ0p1bmUnLFxyXG4gICAgJ0p1bHknLFxyXG4gICAgJ0F1Z3VzdCcsXHJcbiAgICAnU2VwdGVtYmVyJyxcclxuICAgICdPY3RvYmVyJyxcclxuICAgICdOb3ZlbWJlcicsXHJcbiAgICAnRGVjZW1iZXInLFxyXG4gIF0sXHJcbiAgbW9udGhzU2hvcnQ6IFsnSmFuLicsICdGZWIuJywgJ01hci4nLCAnQXByLicsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Zy4nLCAnU2VwdC4nLCAnT2N0LicsICdOb3YuJywgJ0RlYy4nXSxcclxuICB3ZWVrRGF5czogWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddLFxyXG4gIHdlZWtEYXlzU2hvcnQ6IFsnU3VuJywgJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0J10sXHJcbiAgeWVhcjogbnVsbCxcclxuICBtb250aDogbnVsbCxcclxuICAnQmFzaWMgT3B0aW9ucyc6ICdCYXNpYyBPcHRpb25zJyxcclxuICAnVXNlciBuYW1lIGluIE1lbW9zJzogJ1VzZXIgbmFtZSBpbiBNZW1vcycsXHJcbiAgXCJTZXQgeW91ciB1c2VyIG5hbWUgaGVyZS4gJ01lbW9zIPCfmI8nIEJ5IGRlZmF1bHRcIjogXCJTZXQgeW91ciB1c2VyIG5hbWUgaGVyZS4gJ01lbW9zIPCfmI8nIEJ5IGRlZmF1bHRcIixcclxuICAnSW5zZXJ0IGFmdGVyIGhlYWRpbmcnOiAnSW5zZXJ0IGFmdGVyIGhlYWRpbmcnLFxyXG4gICdZb3Ugc2hvdWxkIHNldCB0aGUgc2FtZSBoZWFkaW5nIGJlbG93IGlmIHlvdSB3YW50IHRvIGluc2VydCBhbmQgcHJvY2VzcyBtZW1vcyBiZWxvdyB0aGUgc2FtZSBoZWFkaW5nLic6XHJcbiAgICAnWW91IHNob3VsZCBzZXQgdGhlIHNhbWUgaGVhZGluZyBiZWxvdyBpZiB5b3Ugd2FudCB0byBpbnNlcnQgYW5kIHByb2Nlc3MgbWVtb3MgYmVsb3cgdGhlIHNhbWUgaGVhZGluZy4nLFxyXG4gICdBbGxvd3MgYWRtb25pdGlvbnMgdG8gYmUgY3JlYXRlZCB1c2luZyAnOiAnQWxsb3dzIGFkbW9uaXRpb25zIHRvIGJlIGNyZWF0ZWQgdXNpbmcgJyxcclxuICAnUHJvY2VzcyBNZW1vcyBiZWxvdyc6ICdQcm9jZXNzIE1lbW9zIGJlbG93JyxcclxuICAnT25seSBlbnRyaWVzIGJlbG93IHRoaXMgc3RyaW5nL3NlY3Rpb24gaW4geW91ciBub3RlcyB3aWxsIGJlIHByb2Nlc3NlZC4gSWYgaXQgZG9lcyBub3QgZXhpc3Qgbm8gbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQgZm9yIHRoYXQgZmlsZS4nOlxyXG4gICAgJ09ubHkgZW50cmllcyBiZWxvdyB0aGlzIHN0cmluZy9zZWN0aW9uIGluIHlvdXIgbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQuIElmIGl0IGRvZXMgbm90IGV4aXN0IG5vIG5vdGVzIHdpbGwgYmUgcHJvY2Vzc2VkIGZvciB0aGF0IGZpbGUuJyxcclxuICAnU2F2ZSBNZW1vIGJ1dHRvbiBsYWJlbCc6ICdTYXZlIE1lbW8gYnV0dG9uIGxhYmVsJyxcclxuICBcIlRoZSB0ZXh0IHNob3duIG9uIHRoZSBzYXZlIE1lbW8gYnV0dG9uIGluIHRoZSBVSS4gJ05PVEVJVCcgYnkgZGVmYXVsdC5cIjpcclxuICAgIFwiVGhlIHRleHQgc2hvd24gb24gdGhlIHNhdmUgTWVtbyBidXR0b24gaW4gdGhlIFVJLiAnTk9URUlUJyBieSBkZWZhdWx0LlwiLFxyXG4gICdGb2N1cyBvbiBlZGl0b3Igd2hlbiBvcGVuIG1lbW9zJzogJ0ZvY3VzIG9uIGVkaXRvciB3aGVuIG9wZW4gbWVtb3MnLFxyXG4gICdGb2N1cyBvbiBlZGl0b3Igd2hlbiBvcGVuIG1lbW9zLiBGb2N1cyBieSBkZWZhdWx0Lic6ICdGb2N1cyBvbiBlZGl0b3Igd2hlbiBvcGVuIG1lbW9zLiBGb2N1cyBieSBkZWZhdWx0LicsXHJcbiAgJ09wZW4gZGFpbHkgbWVtb3Mgd2l0aCBvcGVuIG1lbW9zJzogJ09wZW4gZGFpbHkgbWVtb3Mgd2l0aCBvcGVuIG1lbW9zJyxcclxuICAnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MuIE9wZW4gYnkgZGVmYXVsdC4nOiAnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MuIE9wZW4gYnkgZGVmYXVsdC4nLFxyXG4gICdPcGVuIE1lbW9zIHdoZW4gb2JzaWRpYW4gb3BlbnMnOiAnT3BlbiBNZW1vcyB3aGVuIG9ic2lkaWFuIG9wZW5zJyxcclxuICAnV2hlbiBlbmFibGUgdGhpcywgTWVtb3Mgd2lsbCBvcGVuIHdoZW4gT2JzaWRpYW4gb3BlbnMuIEZhbHNlIGJ5IGRlZmF1bHQuJzpcclxuICAgICdXaGVuIGVuYWJsZSB0aGlzLCBNZW1vcyB3aWxsIG9wZW4gd2hlbiBPYnNpZGlhbiBvcGVucy4gRmFsc2UgYnkgZGVmYXVsdC4nLFxyXG4gICdIaWRlIGRvbmUgdGFza3MgaW4gTWVtbyBsaXN0JzogJ0hpZGUgZG9uZSB0YXNrcyBpbiBNZW1vIGxpc3QnLFxyXG4gICdIaWRlIGFsbCBkb25lIHRhc2tzIGluIE1lbW8gbGlzdC4gU2hvdyBkb25lIHRhc2tzIGJ5IGRlZmF1bHQuJzpcclxuICAgICdIaWRlIGFsbCBkb25lIHRhc2tzIGluIE1lbW8gbGlzdC4gU2hvdyBkb25lIHRhc2tzIGJ5IGRlZmF1bHQuJyxcclxuICAnQWR2YW5jZWQgT3B0aW9ucyc6ICdBZHZhbmNlZCBPcHRpb25zJyxcclxuICAnVUkgbGFuZ3VhZ2UgZm9yIGRhdGUnOiAnVUkgbGFuZ3VhZ2UgZm9yIGRhdGUnLFxyXG4gIFwiVHJhbnNsYXRlcyB0aGUgZGF0ZSBVSSBsYW5ndWFnZS4gT25seSAnZW4nIGFuZCAnemgnIGFyZSBhdmFpbGFibGUuXCI6XHJcbiAgICBcIlRyYW5zbGF0ZXMgdGhlIGRhdGUgVUkgbGFuZ3VhZ2UuIE9ubHkgJ2VuJyBhbmQgJ3poJyBhcmUgYXZhaWxhYmxlLlwiLFxyXG4gICdEZWZhdWx0IHByZWZpeCc6ICdEZWZhdWx0IHByZWZpeCcsXHJcbiAgXCJTZXQgdGhlIGRlZmF1bHQgcHJlZml4IHdoZW4gY3JlYXRlIG1lbW8sICdMaXN0JyBieSBkZWZhdWx0LlwiOlxyXG4gICAgXCJTZXQgdGhlIGRlZmF1bHQgcHJlZml4IHdoZW4gY3JlYXRlIG1lbW8sICdMaXN0JyBieSBkZWZhdWx0LlwiLFxyXG4gICdEZWZhdWx0IGluc2VydCBkYXRlIGZvcm1hdCc6ICdEZWZhdWx0IGluc2VydCBkYXRlIGZvcm1hdCcsXHJcbiAgXCJTZXQgdGhlIGRlZmF1bHQgZGF0ZSBmb3JtYXQgd2hlbiBpbnNlcnQgZGF0ZSBieSBALCAnVGFza3MnIGJ5IGRlZmF1bHQuXCI6XHJcbiAgICBcIlNldCB0aGUgZGVmYXVsdCBkYXRlIGZvcm1hdCB3aGVuIGluc2VydCBkYXRlIGJ5IEAsICdUYXNrcycgYnkgZGVmYXVsdC5cIixcclxuICAnRGVmYXVsdCBlZGl0b3IgcG9zaXRpb24gb24gbW9iaWxlJzogJ0RlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIG1vYmlsZScsXHJcbiAgXCJTZXQgdGhlIGRlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIE1vYmlsZSwgJ1RvcCcgYnkgZGVmYXVsdC5cIjpcclxuICAgIFwiU2V0IHRoZSBkZWZhdWx0IGVkaXRvciBwb3NpdGlvbiBvbiBNb2JpbGUsICdUb3AnIGJ5IGRlZmF1bHQuXCIsXHJcbiAgJ1VzZSBidXR0b24gdG8gc2hvdyBlZGl0b3Igb24gbW9iaWxlJzogJ1VzZSBidXR0b24gdG8gc2hvdyBlZGl0b3Igb24gbW9iaWxlJyxcclxuICAnU2V0IGEgZmxvYXQgYnV0dG9uIHRvIGNhbGwgZWRpdG9yIG9uIG1vYmlsZS4gT25seSB3aGVuIGVkaXRvciBsb2NhdGVkIGF0IHRoZSBib3R0b20gd29ya3MuJzpcclxuICAgICdTZXQgYSBmbG9hdCBidXR0b24gdG8gY2FsbCBlZGl0b3Igb24gbW9iaWxlLiBPbmx5IHdoZW4gZWRpdG9yIGxvY2F0ZWQgYXQgdGhlIGJvdHRvbSB3b3Jrcy4nLFxyXG4gICdTaG93IFRpbWUgV2hlbiBDb3B5IFJlc3VsdHMnOiAnU2hvdyBUaW1lIFdoZW4gQ29weSBSZXN1bHRzJyxcclxuICAnU2hvdyB0aW1lIHdoZW4geW91IGNvcHkgcmVzdWx0cywgbGlrZSAxMjowMC4gQ29weSB0aW1lIGJ5IGRlZmF1bHQuJzpcclxuICAgICdTaG93IHRpbWUgd2hlbiB5b3UgY29weSByZXN1bHRzLCBsaWtlIDEyOjAwLiBDb3B5IHRpbWUgYnkgZGVmYXVsdC4nLFxyXG4gICdTaG93IERhdGUgV2hlbiBDb3B5IFJlc3VsdHMnOiAnU2hvdyBEYXRlIFdoZW4gQ29weSBSZXN1bHRzJyxcclxuICAnU2hvdyBkYXRlIHdoZW4geW91IGNvcHkgcmVzdWx0cywgbGlrZSBbWzIwMjItMDEtMDFdXS4gQ29weSBkYXRlIGJ5IGRlZmF1bHQuJzpcclxuICAgICdTaG93IGRhdGUgd2hlbiB5b3UgY29weSByZXN1bHRzLCBsaWtlIFtbMjAyMi0wMS0wMV1dLiBDb3B5IGRhdGUgYnkgZGVmYXVsdC4nLFxyXG4gICdBZGQgQmxhbmsgTGluZSBCZXR3ZWVuIERpZmZlcmVudCBEYXRlJzogJ0FkZCBCbGFuayBMaW5lIEJldHdlZW4gRGlmZmVyZW50IERhdGUnLFxyXG4gICdBZGQgYmxhbmsgbGluZSB3aGVuIGNvcHkgcmVzdWx0IHdpdGggZGF0ZS4gTm8gYmxhbmsgbGluZSBieSBkZWZhdWx0Lic6XHJcbiAgICAnQWRkIGJsYW5rIGxpbmUgd2hlbiBjb3B5IHJlc3VsdCB3aXRoIGRhdGUuIE5vIGJsYW5rIGxpbmUgYnkgZGVmYXVsdC4nLFxyXG4gICdTaGFyZSBPcHRpb25zJzogJ1NoYXJlIE9wdGlvbnMnLFxyXG4gICdTaGFyZSBNZW1vcyBJbWFnZSBGb290ZXIgU3RhcnQnOiAnU2hhcmUgTWVtb3MgSW1hZ2UgRm9vdGVyIFN0YXJ0JyxcclxuICBcIlNldCBhbnl0aGluZyB5b3Ugd2FudCBoZXJlLCB1c2Uge01lbW9zTnVtfSB0byBkaXNwbGF5IE51bWJlciBvZiBtZW1vcywge1VzZWREYXl9IGZvciBkYXlzLiAne01lbW9zTnVtfSBNZW1vcyB7VXNlZERheX0gRGF5cycgQnkgZGVmYXVsdFwiOlxyXG4gICAgXCJTZXQgYW55dGhpbmcgeW91IHdhbnQgaGVyZSwgdXNlIHtNZW1vc051bX0gdG8gZGlzcGxheSBOdW1iZXIgb2YgbWVtb3MsIHtVc2VkRGF5fSBmb3IgZGF5cy4gJ3tNZW1vc051bX0gTWVtb3Mge1VzZWREYXl9IERheXMnIEJ5IGRlZmF1bHRcIixcclxuICAnU2hhcmUgTWVtb3MgSW1hZ2UgRm9vdGVyIEVuZCc6ICdTaGFyZSBNZW1vcyBJbWFnZSBGb290ZXIgRW5kJyxcclxuICBcIlNldCBhbnl0aGluZyB5b3Ugd2FudCBoZXJlLCB1c2Uge1VzZXJOYW1lfSBhcyB5b3VyIHVzZXJuYW1lLiAn4pyN77iPIEJ5IHtVc2VyTmFtZX0nIEJ5IGRlZmF1bHRcIjpcclxuICAgIFwiU2V0IGFueXRoaW5nIHlvdSB3YW50IGhlcmUsIHVzZSB7VXNlck5hbWV9IGFzIHlvdXIgdXNlcm5hbWUuICfinI3vuI8gQnkge1VzZXJOYW1lfScgQnkgZGVmYXVsdFwiLFxyXG4gICdTYXZlIFNoYXJlZCBJbWFnZSBUbyBGb2xkZXIgRm9yIE1vYmlsZSc6ICdTYXZlIFNoYXJlZCBJbWFnZSBUbyBGb2xkZXIgRm9yIE1vYmlsZScsXHJcbiAgJ1NhdmUgaW1hZ2UgdG8gZm9sZGVyIGZvciBtb2JpbGUuIEZhbHNlIGJ5IERlZmF1bHQnOiAnU2F2ZSBpbWFnZSB0byBmb2xkZXIgZm9yIG1vYmlsZS4gRmFsc2UgYnkgRGVmYXVsdCcsXHJcbiAgJ1NheSBUaGFuayBZb3UnOiAnU2F5IFRoYW5rIFlvdScsXHJcbiAgRG9uYXRlOiAnRG9uYXRlJyxcclxuICAnSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4sIGNvbnNpZGVyIGRvbmF0aW5nIHRvIHN1cHBvcnQgY29udGludWVkIGRldmVsb3BtZW50Oic6XHJcbiAgICAnSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4sIGNvbnNpZGVyIGRvbmF0aW5nIHRvIHN1cHBvcnQgY29udGludWVkIGRldmVsb3BtZW50OicsXHJcbiAgJ0ZpbGUgTmFtZSBvZiBSZWN5Y2xlIEJpbic6ICdGaWxlIE5hbWUgb2YgUmVjeWNsZSBCaW4nLFxyXG4gIFwiU2V0IHRoZSBmaWxlbmFtZSBmb3IgcmVjeWNsZSBiaW4uICdkZWxldGUnIEJ5IGRlZmF1bHRcIjogXCJTZXQgdGhlIGZpbGVuYW1lIGZvciByZWN5Y2xlIGJpbi4gJ2RlbGV0ZScgQnkgZGVmYXVsdFwiLFxyXG4gICdGaWxlIE5hbWUgb2YgUXVlcnkgRmlsZSc6ICdGaWxlIE5hbWUgb2YgUXVlcnkgRmlsZScsXHJcbiAgXCJTZXQgdGhlIGZpbGVuYW1lIGZvciBxdWVyeSBmaWxlLiAncXVlcnknIEJ5IGRlZmF1bHRcIjogXCJTZXQgdGhlIGZpbGVuYW1lIGZvciBxdWVyeSBmaWxlLiAncXVlcnknIEJ5IGRlZmF1bHRcIixcclxuICAnVXNlIFRhZ3MgSW4gVmF1bHQnOiAnVXNlIFRhZ3MgSW4gVmF1bHQnLFxyXG4gICdVc2UgdGFncyBpbiB2YXVsdCByYXRoZXIgdGhhbiBvbmx5IGluIE1lbW9zLiBGYWxzZSBieSBkZWZhdWx0Lic6XHJcbiAgICAnVXNlIHRhZ3MgaW4gdmF1bHQgcmF0aGVyIHRoYW4gb25seSBpbiBNZW1vcy4gRmFsc2UgYnkgZGVmYXVsdC4nLFxyXG4gICdSZWFkeSB0byBjb252ZXJ0IGltYWdlIGludG8gYmFja2dyb3VuZCc6ICdSZWFkeSB0byBjb252ZXJ0IGltYWdlIGludG8gYmFja2dyb3VuZCcsXHJcbiAgTGlzdDogJ0xpc3QnLFxyXG4gIFRhc2s6ICdUYXNrJyxcclxuICBUb3A6ICdUb3AnLFxyXG4gIEJvdHRvbTogJ0JvdHRvbScsXHJcbiAgVEFHOiAnVEFHJyxcclxuICBEQVk6ICdEQVknLFxyXG4gIFFVRVJZOiAnUVVFUlknLFxyXG4gIEVESVQ6ICdFRElUJyxcclxuICBQSU46ICdQSU4nLFxyXG4gIFVOUElOOiAnVU5QSU4nLFxyXG4gIERFTEVURTogJ0RFTEVURScsXHJcbiAgJ0NPTkZJUk3vvIEnOiAnQ09ORklSTe+8gScsXHJcbiAgJ0NSRUFURSBGSUxURVInOiAnQ1JFQVRFIEZJTFRFUicsXHJcbiAgU2V0dGluZ3M6ICdTZXR0aW5ncycsXHJcbiAgJ1JlY3ljbGUgYmluJzogJ1JlY3ljbGUgYmluJyxcclxuICAnQWJvdXQgTWUnOiAnQWJvdXQgTWUnLFxyXG4gICdGZXRjaGluZyBkYXRhLi4uJzogJ0ZldGNoaW5nIGRhdGEuLi4nLFxyXG4gICdIZXJlIGlzIE5vIFpldHRlbHMuJzogJ0hlcmUgaXMgTm8gWmV0dGVscy4nLFxyXG4gICdGcmVxdWVudGx5IFVzZWQgVGFncyc6ICdGcmVxdWVudGx5IFVzZWQgVGFncycsXHJcbiAgJ1doYXQgZG8geW91IHRoaW5rIG5vdy4uLic6ICdXaGF0IGRvIHlvdSB0aGluayBub3cuLi4nLFxyXG4gIFJFQUQ6ICdSRUFEJyxcclxuICBNQVJLOiAnTUFSSycsXHJcbiAgU0hBUkU6ICdTSEFSRScsXHJcbiAgU09VUkNFOiAnU09VUkNFJyxcclxuICBSRVNUT1JFOiAnUkVTVE9SRScsXHJcbiAgJ0RFTEVURSBBVCc6ICdERUxFVEUgQVQnLFxyXG4gICdOb29vb3AhJzogJ05vb29vcCEnLFxyXG4gICdBbGwgRGF0YSBpcyBMb2FkZWQg8J+OiSc6ICdBbGwgRGF0YSBpcyBMb2FkZWQg8J+OiScsXHJcbiAgJ1F1aWNrIGZpbHRlcic6ICdRdWljayBmaWx0ZXInLFxyXG4gIFRZUEU6ICdUWVBFJyxcclxuICBMSU5LRUQ6ICdMSU5LRUQnLFxyXG4gICdOTyBUQUdTJzogJ05PIFRBR1MnLFxyXG4gICdIQVMgTElOS1MnOiAnSEFTIExJTktTJyxcclxuICAnSEFTIElNQUdFUyc6ICdIQVMgSU1BR0VTJyxcclxuICBJTkNMVURFOiAnSU5DTFVERScsXHJcbiAgRVhDTFVERTogJ0VYQ0xVREUnLFxyXG4gIFRFWFQ6ICdURVhUJyxcclxuICBJUzogJ0lTJyxcclxuICBJU05PVDogJ0lTTk9UJyxcclxuICBTRUxFQ1Q6ICdTRUxFQ1QnLFxyXG4gICdBREQgRklMVEVSIFRFUk1TJzogJ0FERCBGSUxURVIgVEVSTVMnLFxyXG4gIEZJTFRFUjogJ0ZJTFRFUicsXHJcbiAgVElUTEU6ICdUSVRMRScsXHJcbiAgJ0NSRUFURSBRVUVSWSc6ICdDUkVBVEUgUVVFUlknLFxyXG4gICdFRElUIFFVRVJZJzogJ0VESVQgUVVFUlknLFxyXG4gIE1BVENIOiAnTUFUQ0gnLFxyXG4gIFRJTUVTOiAnVElNRVMnLFxyXG4gICdTaGFyZSBNZW1vIEltYWdlJzogJ1NoYXJlIE1lbW8gSW1hZ2UnLFxyXG4gICfihpdDbGljayB0aGUgYnV0dG9uIHRvIHNhdmUnOiAn4oaXQ2xpY2sgdGhlIGJ1dHRvbiB0byBzYXZlJyxcclxuICAnSW1hZ2UgaXMgZ2VuZXJhdGluZy4uLic6ICdJbWFnZSBpcyBnZW5lcmF0aW5nLi4uJyxcclxuICAnSW1hZ2UgaXMgbG9hZGluZy4uLic6ICdJbWFnZSBpcyBsb2FkaW5nLi4uJyxcclxuICAnTG9hZGluZy4uLic6ICdMb2FkaW5nLi4uJyxcclxuICAn8J+YnyBDYW5ub3QgbG9hZCBpbWFnZSwgaW1hZ2UgbGluayBtYXliZSBicm9rZW4nOiAn8J+YnyBDYW5ub3QgbG9hZCBpbWFnZSwgaW1hZ2UgbGluayBtYXliZSBicm9rZW4nLFxyXG4gICdEYWlseSBNZW1vcyc6ICdEYWlseSBNZW1vcycsXHJcbiAgJ0NBTkNFTCBFRElUJzogJ0NBTkNFTCBFRElUJyxcclxuICAnTElOSyBUTyBUSEUnOiAnTElOSyBUTyBUSEUnLFxyXG4gICdNb2JpbGUgT3B0aW9ucyc6ICdNb2JpbGUgT3B0aW9ucycsXHJcbiAgJ0V4cGVyaW1lbnRhbCBPcHRpb25zJzogJ0V4cGVyaW1lbnRhbCBPcHRpb25zJyxcclxuICBcIkRvbid0IHN1cHBvcnQgd2ViIGltYWdlIHlldCwgcGxlYXNlIGlucHV0IGltYWdlIHBhdGggaW4gdmF1bHRcIjpcclxuICAgIFwiRG9uJ3Qgc3VwcG9ydCB3ZWIgaW1hZ2UgeWV0LCBwbGVhc2UgaW5wdXQgaW1hZ2UgcGF0aCBpbiB2YXVsdFwiLFxyXG4gICdCYWNrZ3JvdW5kIEltYWdlIGluIERhcmsgVGhlbWUnOiAnQmFja2dyb3VuZCBJbWFnZSBpbiBEYXJrIFRoZW1lJyxcclxuICAnQmFja2dyb3VuZCBJbWFnZSBpbiBMaWdodCBUaGVtZSc6ICdCYWNrZ3JvdW5kIEltYWdlIGluIExpZ2h0IFRoZW1lJyxcclxuICAnU2V0IGJhY2tncm91bmQgaW1hZ2UgaW4gZGFyayB0aGVtZS4gU2V0IHNvbWV0aGluZyBsaWtlIFwiRGFpbHkvb25lLnBuZ1wiJzpcclxuICAgICdTZXQgYmFja2dyb3VuZCBpbWFnZSBpbiBkYXJrIHRoZW1lLiBTZXQgc29tZXRoaW5nIGxpa2UgXCJEYWlseS9vbmUucG5nXCInLFxyXG4gICdTZXQgYmFja2dyb3VuZCBpbWFnZSBpbiBsaWdodCB0aGVtZS4gU2V0IHNvbWV0aGluZyBsaWtlIFwiRGFpbHkvb25lLnBuZ1wiJzpcclxuICAgICdTZXQgYmFja2dyb3VuZCBpbWFnZSBpbiBsaWdodCB0aGVtZS4gU2V0IHNvbWV0aGluZyBsaWtlIFwiRGFpbHkvb25lLnBuZ1wiJyxcclxuICAnU2V0IGRlZmF1bHQgbWVtbyBjb21wb3NpdGlvbiwgeW91IHNob3VsZCB1c2Uge1RJTUV9IGFzIFwiSEg6bW1cIiBhbmQge0NPTlRFTlR9IGFzIGNvbnRlbnQuIFwie1RJTUV9IHtDT05URU5UfVwiIGJ5IGRlZmF1bHQnOlxyXG4gICAgJ1NldCBkZWZhdWx0IG1lbW8gY29tcG9zaXRpb24sIHlvdSBzaG91bGQgdXNlIHtUSU1FfSBhcyBcIkhIOm1tXCIgYW5kIHtDT05URU5UfSBhcyBjb250ZW50LiBcIntUSU1FfSB7Q09OVEVOVH1cIiBieSBkZWZhdWx0JyxcclxuICAnRGVmYXVsdCBNZW1vIENvbXBvc2l0aW9uJzogJ0RlZmF1bHQgTWVtbyBDb21wb3NpdGlvbicsXHJcbiAgJ1Nob3cgVGFza3MgTGFiZWwnOiAnU2hvdyBUYXNrcyBMYWJlbCcsXHJcbiAgJ1Nob3cgdGFza3MgbGFiZWwgbmVhciB0aGUgdGltZSB0ZXh0LiBGYWxzZSBieSBkZWZhdWx0JzogJ1Nob3cgdGFza3MgbGFiZWwgbmVhciB0aGUgdGltZSB0ZXh0LiBGYWxzZSBieSBkZWZhdWx0JyxcclxufTtcclxuIiwiLy8gQnJpdGlzaCBFbmdsaXNoXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gRXNwYcOxb2xcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHt9O1xyXG4iLCIvLyBmcmFuw6dhaXNcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAvLyBzZXR0aW5nLnRzXHJcbiAgd2VsY29tZTogJ0JpZW52ZW51ZSBkYW5zIE3DqW1vICEnLFxyXG4gIHJpYmJvbkljb25UaXRsZTogJ03DqW1vcycsXHJcbiAgbW9udGhzOiBbXHJcbiAgICAnSmFudmllcicsXHJcbiAgICAnRsOpdnJpZXInLFxyXG4gICAgJ01hcnMnLFxyXG4gICAgJ0F2cmlsJyxcclxuICAgICdNYWknLFxyXG4gICAgJ0p1aW4nLFxyXG4gICAgJ0p1aWxsZXQnLFxyXG4gICAgJ0FvdXQnLFxyXG4gICAgJ1NlcHRlbWJyZScsXHJcbiAgICAnT2N0b2JyZScsXHJcbiAgICAnTm92ZW1icmUnLFxyXG4gICAgJ0TDqWNlbWJyZScsXHJcbiAgXSxcclxuICBtb250aHNTaG9ydDogWydKYW4uJywgJ0ZlYi4nLCAnTWFyLicsICdBcHIuJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVnLicsICdTZXB0LicsICdPY3QuJywgJ05vdi4nLCAnRGVjLiddLFxyXG4gIHdlZWtEYXlzOiBbJ0RpbWFuY2hlJywgJ0x1bmRpJywgJ01hcmRpJywgJ01lcmNyZWRpJywgJ0pldWRpJywgJ1ZlbmRyZWRpJywgJ1NhbWVkaSddLFxyXG4gIHdlZWtEYXlzU2hvcnQ6IFsnRGltJywgJ0x1bicsICdNYXInLCAnTWVyJywgJ0pldScsICdWZW4nLCAnU2FtJ10sXHJcbiAgdG86ICfDoCcsXHJcbiAgeWVhcjogbnVsbCxcclxuICBtb250aDogbnVsbCxcclxuICAnQmFzaWMgT3B0aW9ucyc6ICdPcHRpb25zIGJhc2lxdWUnLFxyXG4gICdVc2VyIG5hbWUgaW4gTWVtb3MnOiAnVXNlcm5hbWUgZGFucyBNw6ltb3MnLFxyXG4gIFwiU2V0IHlvdXIgdXNlciBuYW1lIGhlcmUuICdNZW1vcyDwn5iPJyBCeSBkZWZhdWx0XCI6IFwiRMOpZmluaXNzZXogdm90cmUgdXNlcm5hbWUgaWNpLiBEw6lmYXV0IDogJ01lbW8g8J+YjydcIixcclxuICAnSW5zZXJ0IGFmdGVyIGhlYWRpbmcnOiAnSW5zw6lyZXIgYXByw6hzIGxlIHRpdHJlJyxcclxuICAnWW91IHNob3VsZCBzZXQgdGhlIHNhbWUgaGVhZGluZyBiZWxvdyBpZiB5b3Ugd2FudCB0byBpbnNlcnQgYW5kIHByb2Nlc3MgbWVtb3MgYmVsb3cgdGhlIHNhbWUgaGVhZGluZy4nOlxyXG4gICAgJ1ZvdXMgZGV2ZXogZMOpZmluaXIgbGUgbcOqbWUgdGl0cmUgZW4tZGVzc291cyBzaSB2b3VzIHZvdWxleiBpbnPDqXJlciBldCB0cmFpdGVyIGRlcyBtw6ltb3Mgc291cyBsZSBtw6ptZSB0aXRyZS4nLFxyXG4gICdBbGxvd3MgYWRtb25pdGlvbnMgdG8gYmUgY3JlYXRlZCB1c2luZyAnOiAnUGVybWV0IGRlIGNyw6llciBkZXMgYWRtb25pdGlvbnMgZW4gdXRpbGlzYW50JyxcclxuICAnUHJvY2VzcyBNZW1vcyBiZWxvdyc6ICdJbnPDqXJlciBNw6ltbyBzb3VzJyxcclxuICAnT25seSBlbnRyaWVzIGJlbG93IHRoaXMgc3RyaW5nL3NlY3Rpb24gaW4geW91ciBub3RlcyB3aWxsIGJlIHByb2Nlc3NlZC4gSWYgaXQgZG9lcyBub3QgZXhpc3Qgbm8gbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQgZm9yIHRoYXQgZmlsZS4nOlxyXG4gICAgXCJTZXVsZW1lbnQgbGVzIGVudHLDqWUgc291cyBjZXR0ZSBzZWN0aW9uL3BocmFzZSBkYW5zIHZvcyBub3RlcyBzZXJvbnQgY29uc2lkw6lyw6lzLiBTJ2lsIG4nZXhpc3RlIHBhcywgYXVjdW5lIG5vdGVzIG5lIHNlcmEgdHJhaXTDqSBwb3VyIGNlIGZpY2hpZXIuXCIsXHJcbiAgJ1NhdmUgTWVtbyBidXR0b24gbGFiZWwnOiAnVGl0cmUgZHUgYm91dG9uIGRlIHNhdXZlZ2FyZGUnLFxyXG4gIFwiVGhlIHRleHQgc2hvd24gb24gdGhlIHNhdmUgTWVtbyBidXR0b24gaW4gdGhlIFVJLiAnTk9URUlUJyBieSBkZWZhdWx0LlwiOlxyXG4gICAgXCJMZSB0ZXh0ZSBhZmZpY2jDqSBzdXIgbGUgYm91dG9uIGRlIHNhdXZlZ2FyZGUgZGFucyBsJ1VJLiBEw6lmYXV0IDogJ05PVEVJVCdcIixcclxuICAnRm9jdXMgb24gZWRpdG9yIHdoZW4gb3BlbiBtZW1vcyc6IFwiRm9jdXMgc3VyIGwnw6lkaXRldXIgbG9ycyBkZSBsJ291dmVydHVyZSBkdSBtw6ltby5cIixcclxuICAnRm9jdXMgb24gZWRpdG9yIHdoZW4gb3BlbiBtZW1vcy4gRm9jdXMgYnkgZGVmYXVsdC4nOlxyXG4gICAgXCJGb2N1cyBzdXIgbCfDqWRpdGV1ciBsb3JzIGRlIGwnb3V2ZXJ0dXJlIGR1IG3DqW1vLiBGb2N1cyBwYXIgZMOpZmF1dC5cIixcclxuICAnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MnOiAnT3V2cmlyIGxlcyBtw6ltb3MgcXVvdGlkaWVucyBxdWFuZCBtw6ltbyBlc3Qgb3V2ZXJ0LicsXHJcbiAgJ09wZW4gZGFpbHkgbWVtb3Mgd2l0aCBvcGVuIG1lbW9zLiBPcGVuIGJ5IGRlZmF1bHQuJzogJ091dnJpciBsZXMgbcOpbW9zIHF1b3RpZGllbnMgcXVhbmQgbcOpbW8gZXN0IG91dmVydC4nLFxyXG4gICdPcGVuIE1lbW9zIHdoZW4gb2JzaWRpYW4gb3BlbnMnOiAnT3V2cmlyIE3DqW1vIHF1YW5kIE9ic2lkaWFuIGVzdCBvdXZlcnQuJyxcclxuICAnV2hlbiBlbmFibGUgdGhpcywgTWVtb3Mgd2lsbCBvcGVuIHdoZW4gT2JzaWRpYW4gb3BlbnMuIEZhbHNlIGJ5IGRlZmF1bHQuJzpcclxuICAgIFwiUXVhbmQgYWN0aXbDqSwgTWVtbyBzZXJhIG91dmVydCBxdWFuZCBPYnNpZGlhbiDDoCBsJ291dmVydHVyZSBkJ09ic2lkaWFuLiBEw6lzYWN0aXbDqSBwYXIgZMOpZmF1dC5cIixcclxuICAnSGlkZSBkb25lIHRhc2tzIGluIE1lbW8gbGlzdCc6ICdNYXNxdWVyIGxlcyB0w6JjaGVzIGFjY29tcGxpZXMgZGFucyBsYSBsaXN0ZSBkZXMgbcOpbW9zLicsXHJcbiAgJ0hpZGUgYWxsIGRvbmUgdGFza3MgaW4gTWVtbyBsaXN0LiBTaG93IGRvbmUgdGFza3MgYnkgZGVmYXVsdC4nOlxyXG4gICAgJ01hc3F1ZXIgbGVzIHTDomNoZXMgYWNjb21wbGllcyBkYW5zIGxlcyBtw6ltb3MuIEFmZmljaGUgbGVzIHTDomNoZXMgYWNjb21wbGllcyBwYXIgZMOpZmF1dC4nLFxyXG4gICdBZHZhbmNlZCBPcHRpb25zJzogJ09wdGlvbnMgYXZhbmPDqWVzJyxcclxuICAnVUkgbGFuZ3VhZ2UgZm9yIGRhdGUnOiBcIkxhbmd1ZSBkZSBsJ1VJIHBvdXIgbGEgZGF0ZVwiLFxyXG4gIFwiVHJhbnNsYXRlcyB0aGUgZGF0ZSBVSSBsYW5ndWFnZS4gT25seSAnZW4nIGFuZCAnemgnIGFyZSBhdmFpbGFibGUuXCI6XHJcbiAgICBcIlRyYWR1aXQgbGEgbGFuZ3VlIGRlcyBkYXRlcyBkYW5zIGwnVUkuIFNldWxzICdlbicsICdmcicgZXQgJ3poJyBzb250IGRpc3BvbmlibGVzLiBcIixcclxuICAnRGVmYXVsdCBwcmVmaXgnOiAnUHLDqWZpeCBwYXIgZMOpZmF1dC4nLFxyXG4gIFwiU2V0IHRoZSBkZWZhdWx0IHByZWZpeCB3aGVuIGNyZWF0ZSBtZW1vLCAnTGlzdCcgYnkgZGVmYXVsdC5cIjpcclxuICAgIFwiRMOpZmluaXQgbGUgcHLDqWZpeCBwYXIgZMOpZmF1dCBsb3JzIGRlIGxhIGNyw6lhdGlvbiBkJ3VuIG3DqW1vLiBEw6lmYXVsdCA6ICdMaXN0ZSdcIixcclxuICAnRGVmYXVsdCBpbnNlcnQgZGF0ZSBmb3JtYXQnOiAnRm9ybWF0IGRlIGxhIGRhdGUgaW5zw6lyw6llIHBhciBkw6lmYXV0LicsXHJcbiAgJ0RlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIG1vYmlsZSc6IFwiUG9zaXRpb24gcGFyIGTDqWZhdXQgZGUgbCfDqWRpdGV1ciBzdXIgbW9iaWxlLlwiLFxyXG4gIFwiU2V0IHRoZSBkZWZhdWx0IGRhdGUgZm9ybWF0IHdoZW4gaW5zZXJ0IGRhdGUgYnkgQCwgJ1Rhc2tzJyBieSBkZWZhdWx0LlwiOlxyXG4gICAgXCJEw6lmaW5pdCBsZSBmb3JtYXQgZGUgbGEgZGF0ZSBwYXIgZMOpZmF1dCBsb3JzIGRlIGwnaW5zZXJ0aW9uIGRlIGxhIGRhdGUgcGFyIEAuIETDqWZhdXQgOiAnVMOiY2hlcycuXCIsXHJcbiAgXCJTZXQgdGhlIGRlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIE1vYmlsZSwgJ1RvcCcgYnkgZGVmYXVsdC5cIjpcclxuICAgIFwiUG9zaXRpb24gcGFyIGTDqWZhdXQgZGUgbCfDqWRpdGV1ciBzdXIgbGUgbW9iaWxlLiBEw6lmYXV0IDogJ0hhdXQnLlwiLFxyXG4gICdVc2UgYnV0dG9uIHRvIHNob3cgZWRpdG9yIG9uIG1vYmlsZSc6IFwiVXRpbGlzYXRpb24gZHUgYm91dG9uIHBvdXIgYWZmaWNoZXIgbCfDqWRpdGV1ciBzdXIgbGUgbW9iaWxlLlwiLFxyXG4gICdTaG93IFRpbWUgV2hlbiBDb3B5IFJlc3VsdHMnOiBcIkFmaWNoZXIgbCdoZXVyZSBxdWFuZCBsZXMgcsOpc3VsdGF0cyBzb250IGNvcGnDqXNcIixcclxuICAnU2V0IGEgZmxvYXQgYnV0dG9uIHRvIGNhbGwgZWRpdG9yIG9uIG1vYmlsZS4gT25seSB3aGVuIGVkaXRvciBsb2NhdGVkIGF0IHRoZSBib3R0b20gd29ya3MuJzpcclxuICAgIFwiUGxhY2UgdW4gYm91dG9uIGZsb3R0YW50IHBvdXIgYXBwZWxlciBsJ8OpZGl0ZXVyIHN1ciBtb2JpbGUuIEZvbmN0aW9ubmUgdW5pcXVlbWVudCBxdWFuZCBsJ8OpZGl0ZXVyIGVzdCBwbGFjw6kgZW4gYmFzLlwiLFxyXG4gICdTaG93IHRpbWUgd2hlbiB5b3UgY29weSByZXN1bHRzLCBsaWtlIDEyOjAwLiBDb3B5IHRpbWUgYnkgZGVmYXVsdC4nOlxyXG4gICAgXCJBZmZpY2hlIGwnaGV1cmUgcXVhbmQgbGVzIHLDqXN1bHRhdHMgc29udCBjb3Bpw6lzLCBjb21tZSAnMTI6MDAnLiBDb3BpZSBsJ2hldXJlIHBhciBkw6lmYXV0XCIsXHJcbiAgJ1Nob3cgRGF0ZSBXaGVuIENvcHkgUmVzdWx0cyc6ICdBZmZpY2hlIGxhIGRhdGUgcXVhbmQgbGVzIHLDqXN1bHRhdHMgc29udCBjb3Bpw6lzJyxcclxuICAnU2hvdyBkYXRlIHdoZW4geW91IGNvcHkgcmVzdWx0cywgbGlrZSBbWzIwMjItMDEtMDFdXS4gQ29weSBkYXRlIGJ5IGRlZmF1bHQuJzpcclxuICAgICdBZmZpY2hlIGxhIGRhdGUgcXVhbmQgbGVzIHLDqXN1bHRhdHMgc29udCBjb3Bpw6lzLCBjb21tZSBbWzIwMjItMDEtMDFdXS4gUGFyIGTDqWZhdXQsIGNvcGllIGxhIGRhdGUuJyxcclxuICAnQWRkIEJsYW5rIExpbmUgQmV0d2VlbiBEaWZmZXJlbnQgRGF0ZSc6ICdBam91dGUgdW5lIGxpZ25lIGVudHJlIGxlcyBkaWZmw6lyZW50ZXMgZGF0ZXMuJyxcclxuICAnQWRkIGJsYW5rIGxpbmUgd2hlbiBjb3B5IHJlc3VsdCB3aXRoIGRhdGUuIE5vIGJsYW5rIGxpbmUgYnkgZGVmYXVsdC4nOlxyXG4gICAgJ0Fqb3V0ZSB1bmUgbGlnbmUgbG9ycyBkZSBsYSBjb3BpZSBkdSByw6lzdWx0YXQgYXZlYyBsYSBkYXRlLiBQYXMgZGUgbGlnbmUgcGFyIGTDqWZhdXQuJyxcclxuICAnU2hhcmUgT3B0aW9ucyc6ICdPcHRpb25zIGRlIHBhcnRhZ2UnLFxyXG4gICdTaGFyZSBNZW1vcyBJbWFnZSBGb290ZXIgU3RhcnQnOiAnRMOpYnV0IGR1IHBpZWQgZGUgcGFnZSDigJQgUGFydGFnZSBkZSBtw6ltbyBkZSBtw6ltb3MnLFxyXG4gIFwiU2V0IGFueXRoaW5nIHlvdSB3YW50IGhlcmUsIHVzZSB7TWVtb3NOdW19IHRvIGRpc3BsYXkgTnVtYmVyIG9mIG1lbW9zLCB7VXNlZERheX0gZm9yIGRheXMuICd7TWVtb3NOdW19IE1lbW9zIHtVc2VkRGF5fSBEYXlzJyBCeSBkZWZhdWx0XCI6XHJcbiAgICBcIkTDqWZpbmlzc2V6IGNlIHF1ZSB2b3VzIHZvdWxleiBpY2ksIHV0aWxpc2V6IHtNZW1vc051bX0gcG91ciBhZmZpY2hlciBsZSBub21icmUgZGUgbcOpbW9zLCB7VXNlZERheX0gcG91ciBsZXMgam91cnMuIFBhciBkw6lmYXV0IDogJ3tNZW1vc051bX0gTWVtb3Mge1VzZWREYXl9IERheXMuXCIsXHJcbiAgJ1NoYXJlIE1lbW9zIEltYWdlIEZvb3RlciBFbmQnOiAnRmluIGR1IHBpZWQgZGUgcGFnZSDigJQgUGFydGFnZSBkZSBtw6ltbycsXHJcbiAgXCJTZXQgYW55dGhpbmcgeW91IHdhbnQgaGVyZSwgdXNlIHtVc2VyTmFtZX0gYXMgeW91ciB1c2VybmFtZS4gJ+Kcje+4jyBCeSB7VXNlck5hbWV9JyBCeSBkZWZhdWx0XCI6XHJcbiAgICBcIkTDqWZpbmlzc2V6IGNlIHF1ZSB2b3VzIHZvdWxleiBpY2kuIFV0aWxpc2V6IHtVc2VyTmFtZX0gY29tbWUgdXNlcm5hbWUuIFBhciBkw6lmYXV0IDogJ+Kcje+4jyBCeSB7VXNlck5hbWV9J1wiLFxyXG4gICdTYXZlIFNoYXJlZCBJbWFnZSBUbyBGb2xkZXIgRm9yIE1vYmlsZSc6ICdTYXV2ZWdhcmRlIGRlcyBpbWFnZXMgcGFydGFnw6lzIGRhbnMgdW4gZG9zc2llciBzdXIgbW9iaWxlLicsXHJcbiAgJ1NhdmUgaW1hZ2UgdG8gZm9sZGVyIGZvciBtb2JpbGUuIEZhbHNlIGJ5IERlZmF1bHQnOlxyXG4gICAgJ1NhdXZlZ2FyZGVyIGxlcyBpbWFnZXMgZGFucyB1biBkb3NzaWVyIHN1ciBtb2JpbGUuIETDqXNhY3RpdsOpIHBhciBkw6lmYXV0LicsXHJcbiAgJ1NheSBUaGFuayBZb3UnOiAnRGl0ZXMgTWVyY2knLFxyXG4gIERvbmF0ZTogJ0ZhaXJlIHVuIGRvbicsXHJcbiAgJ0lmIHlvdSBsaWtlIHRoaXMgcGx1Z2luLCBjb25zaWRlciBkb25hdGluZyB0byBzdXBwb3J0IGNvbnRpbnVlZCBkZXZlbG9wbWVudDonOlxyXG4gICAgJ1NpIHZvdXMgYWltZXogY2UgcGx1Z2luLCBlbnZpc2FnZXogZGUgZmFpcmUgdW4gZG9uIHBvdXIgc291dGVuaXIgbGUgZMOpdmVsb3BwZW1lbnQgY29udGludSA6JyxcclxuICAnRmlsZSBOYW1lIG9mIFJlY3ljbGUgQmluJzogJ05vbSBkZSBsYSBjb3JiZWlsbGUnLFxyXG4gIFwiU2V0IHRoZSBmaWxlbmFtZSBmb3IgcmVjeWNsZSBiaW4uICdkZWxldGUnIEJ5IGRlZmF1bHRcIjogXCJEw6lmaW5pdGlvbiBkdSBub20gZGUgbGEgcG91YmVsbGUuIETDqWZhdXQgOiAnRGVsZXRlJ1wiLFxyXG4gIFwiU2V0IHRoZSBmaWxlbmFtZSBmb3IgcXVlcnkgZmlsZS4gJ3F1ZXJ5JyBCeSBkZWZhdWx0XCI6IFwiRMOpZmluaXQgbGUgbm9tIGRlIGZpY2hpZXIgcG91ciBsZXMgcmVxdcOqdGUuIETDqWZhdXQgOiAnUXVlcnknXCIsXHJcbiAgJ1VzZSBUYWdzIEluIFZhdWx0JzogJ1V0aWxpc2VyIGRlcyB0YWdzIGRhbnMgbGUgQ29mZnJlJyxcclxuICAnVXNlIHRhZ3MgaW4gdmF1bHQgcmF0aGVyIHRoYW4gb25seSBpbiBNZW1vcy4gRmFsc2UgYnkgZGVmYXVsdC4nOlxyXG4gICAgJ1V0aWxpc2VyIGRlcyB0YWdzIGR1IGNvZmZyZSBwbHV0w7R0IHF1ZSBjZXV4IHF1ZSBzZXVsZW1lbnQgZGFucyBNw6ltby4gRMOpc2FjdGl2w6kgcGFyIGTDqWZhdXQuJyxcclxuICAnUmVhZHkgdG8gY29udmVydCBpbWFnZSBpbnRvIGJhY2tncm91bmQnOiAnUHLDqnQgcG91ciBjb252ZXJ0aXIgZGVzIGltYWdlIGVuIGFycmnDqHJlLXBsYW4uJyxcclxuICBMaXN0OiAnTGlzdGUnLFxyXG4gIFRhc2s6ICdUw6JjaGUnLFxyXG4gIFRvcDogJ0hhdXQnLFxyXG4gIEJvdHRvbTogJ0JhcycsXHJcbiAgVEFHOiAnVEFHJyxcclxuICBEQVk6ICdKT1VSJyxcclxuICBRVUVSWTogJ1JFQ0hFUkNIRScsXHJcbiAgRURJVDogJ0VESVRFUicsXHJcbiAgUElOOiAnUElOJyxcclxuICBVTlBJTjogJ8OJUElOR0xFUicsXHJcbiAgREVMRVRFOiAnREVTw4lQSU5HTEVSJyxcclxuICAnQ09ORklSTe+8gSc6ICdDT05GSVJNRVIg77yBJyxcclxuICAnQ1JFQVRFIEZJTFRFUic6ICdDUsOJRVIgRklMVFJFJyxcclxuICBTZXR0aW5nczogJ1BhcmFtw6h0cmVzJyxcclxuICAnUmVjeWNsZSBiaW4nOiAnQ29yYmVpbGxlJyxcclxuICAnQWJvdXQgTWUnOiAnw4AgcHJvcG9zIGRlIG1vaScsXHJcbiAgJ0ZldGNoaW5nIGRhdGEuLi4nOiAnUsOpY3Vww6lyYXRpb24gZGVzIGRvbm7DqWVzLi4uJyxcclxuICAnSGVyZSBpcyBObyBaZXR0ZWxzLic6IFwiSWwgbid5IGEgcGFzIGRlIFpldHRlbHMuXCIsXHJcbiAgJ0ZyZXF1ZW50bHkgVXNlZCBUYWdzJzogJ1RhZ3MgZnLDqXF1ZW1tZW50IHV0aWxpc8OpcycsXHJcbiAgJ1doYXQgZG8geW91IHRoaW5rIG5vdy4uLic6ICdRdWUgcGVuc2V6LXZvdXMgbWFpbnRlbmFudC4uLicsXHJcbiAgUkVBRDogJ0xVJyxcclxuICBNQVJLOiAnTUFSUVVFUicsXHJcbiAgU0hBUkU6ICdQQVJUQUdFUicsXHJcbiAgU09VUkNFOiAnU09VUkNFJyxcclxuICBSRVNUT1JFOiAnUkVTVEFVUkVSJyxcclxuICAnREVMRVRFIEFUJzogJ1NVUFBSSU1FUicsXHJcbiAgJ05vb29vcCEnOiAnTm9vb29wIScsXHJcbiAgJ0FsbCBEYXRhIGlzIExvYWRlZCDwn46JJzogJ1RvdXRlcyBsZXMgZG9ubsOpZXMgc29udCBjaGFyZ8OpZXMg8J+OiScsXHJcbiAgJ1F1aWNrIGZpbHRlcic6ICdGaWx0cmUgcmFwaWRlJyxcclxuICBUWVBFOiAnVFlQRScsXHJcbiAgTElOS0VEOiAnTElFTicsXHJcbiAgJ05PIFRBR1MnOiAnUEFTIERFIFRBR1MnLFxyXG4gICdIQVMgTElOS1MnOiAnQSBERVMgTElFTlMnLFxyXG4gICdIQVMgSU1BR0VTJzogJ0EgREVTIElNQUdFUycsXHJcbiAgSU5DTFVERTogJ0lOQ0xVUycsXHJcbiAgRVhDTFVERTogJ0VYQ0xVUycsXHJcbiAgVEVYVDogJ1RFWFRFJyxcclxuICBJUzogJ0VTVCcsXHJcbiAgSVNOT1Q6IFwiTidFU1QgUEFTXCIsXHJcbiAgU0VMRUNUOiAnU0VMRUNUSU9OJyxcclxuICAnQUREIEZJTFRFUiBURVJNUyc6ICdBSk9VVEVSIERFUyBURVJNRVMgRklMVFLDiScsXHJcbiAgRklMVEVSOiAnRklMVFJFJyxcclxuICBUSVRMRTogJ1RJVFJFJyxcclxuICAnQ1JFQVRFIFFVRVJZJzogJ0NSw4lFUiBVTkUgUkVDSEVSQ0hFJyxcclxuICAnRURJVCBRVUVSWSc6ICfDiURJVEVSIFVORSBSRUNIRVJDSEUnLFxyXG4gIE1BVENIOiAnTUFUQ0gnLFxyXG4gIFRJTUVTOiAnSEVVUkUnLFxyXG4gICdTaGFyZSBNZW1vIEltYWdlJzogJ1BhcnRhZ2VyIHVuIG3DqW1vIGltYWdlJyxcclxuICAn4oaXQ2xpY2sgdGhlIGJ1dHRvbiB0byBzYXZlJzogJ+KGl0NsaXF1ZSBwb3VyIHNhdXZlZ2FyZGVyJyxcclxuICAnSW1hZ2UgaXMgZ2VuZXJhdGluZy4uLic6IFwiR8OpbsOpcmF0aW9uIGRlIGwnaW1hZ2UuLi5cIixcclxuICAnSW1hZ2UgaXMgbG9hZGluZy4uLic6ICdJbWFnZSBlbiBjaGFyZ2VtZW50Li4uJyxcclxuICAnTG9hZGluZy4uLic6ICdDaGFyZ2VtZW50Li4uJyxcclxuICAn8J+YnyBDYW5ub3QgbG9hZCBpbWFnZSwgaW1hZ2UgbGluayBtYXliZSBicm9rZW4nOiBcIvCfmJ8gSW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGwnaW1hZ2UsIGxlIGxpZW4gcGV1dCDDqnRyZSBicmlzw6lcIixcclxuICAnRGFpbHkgTWVtb3MnOiAnTcOpbW8gcXVvdGlkaWVuJyxcclxuICAnQ0FOQ0VMIEVESVQnOiBcIkFOTlVMRVIgTCfDiURJVElPTlwiLFxyXG4gICdMSU5LIFRPIFRIRSc6ICdMSUVOUyDDgCcsXHJcbiAgJ01vYmlsZSBPcHRpb25zJzogJ09wdGlvbnMgbW9iaWxlJyxcclxuICBcIkRvbid0IHN1cHBvcnQgd2ViIGltYWdlIHlldCwgcGxlYXNlIGlucHV0IGltYWdlIHBhdGggaW4gdmF1bHRcIjpcclxuICAgIFwiTmUgc3VwcG9ydGUgcGFzIGxlcyBpbWFnZXMgd2Vicy4gTWVyY2kgZCdpbnPDqXJlciBsZSBjaGVtaW4gZGUgbCdpbWFnZSBkZXB1aXMgbGUgY29mZnJlLlwiLFxyXG4gICdCYWNrZ3JvdW5kIEltYWdlIGluIERhcmsgVGhlbWUnOiAnSW1hZ2UgZGUgZm9uZCBlbiB0aMOobWUgc29tYnJlJyxcclxuICAnQmFja2dyb3VuZCBJbWFnZSBpbiBMaWdodCBUaGVtZSc6ICdJbWFnZSBkZSBmb25kIGVuIHRow6htZSBjbGFpcicsXHJcbiAgJ1NldCBiYWNrZ3JvdW5kIGltYWdlIGluIGRhcmsgdGhlbWUuIFNldCBzb21ldGhpbmcgbGlrZSBcIkRhaWx5L29uZS5wbmdcIic6XHJcbiAgICBcIkTDqWZpbmlyIGwnaW1hZ2UgZGUgZm9uZCBlbiB0aMOobWUgc29tYnJlLiBEw6lmaW5pciAnRGFpbHkvb25lLnBuZycgcGFyIGV4ZW1wbGUuXCIsXHJcbiAgJ1NldCBiYWNrZ3JvdW5kIGltYWdlIGluIGxpZ2h0IHRoZW1lLiBTZXQgc29tZXRoaW5nIGxpa2UgXCJEYWlseS9vbmUucG5nXCInOlxyXG4gICAgXCJEw6lmaW5pciBsJ2ltYWdlIGRlIGZvbmQgZW4gdGjDqG1lIGNsYWlyLiBEw6lmaW5pciAnRGFpbHkvb25lLnBuZycgcGFyIGV4ZW1wbGUuXCIsXHJcbiAgJ1NldCBkZWZhdWx0IG1lbW8gY29tcG9zaXRpb24sIHlvdSBzaG91bGQgdXNlIHtUSU1FfSBhcyBcIkhIOm1tXCIgYW5kIHtDT05URU5UfSBhcyBjb250ZW50LiBcIntUSU1FfSB7Q09OVEVOVH1cIiBieSBkZWZhdWx0JzpcclxuICAgICdEw6lmaW5pciBsYSBjb21wb3NpdGlvbiBwYXIgZMOpZmF1dCBkdSBtw6ltbywgdm91cyBkZXZleiB1dGlsaXNlciB7VElNRX0gY29tbWUgXCJISDptbVwiIGV0IHtDT05URU5UfSBjb21tZSBjb250ZW51LiBcIntUSU1FfSB7Q09OVEVOVH1cIiBwYXIgZMOpZmF1dCcsXHJcbiAgJ0RlZmF1bHQgTWVtbyBDb21wb3NpdGlvbic6ICdDb21wb3NpdGlvbiBwYXIgZMOpZmF1dCBkdSBtw6ltbycsXHJcbiAgJ1Nob3cgVGFza3MgTGFiZWwnOiAnQWZmaWNoZXIgbGVzIMOpdGlxdWV0dGVzIGRlcyB0w6JjaGVzJyxcclxuICAnU2hvdyB0YXNrcyBsYWJlbCBuZWFyIHRoZSB0aW1lIHRleHQuIEZhbHNlIGJ5IGRlZmF1bHQnOlxyXG4gICAgJ0FmZmljaGVyIGxlcyDDqXRpcXVldHRlcyBkZXMgdMOiY2hlcyDDoCBjw7R0w6kgZHUgdGV4dGUgaG9yYWlyZS4gRMOpc2FjdGl2w6kgcGFyIGTDqWZhdXQuJyxcclxufTtcclxuIiwiLy8g4KS54KS/4KSo4KWN4KSm4KWAXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gQmFoYXNhIEluZG9uZXNpYVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge307XHJcbiIsIi8vIEl0YWxpYW5vXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8g5pel5pys6KqeXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8g7ZWc6rWt7Ja0XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gTmVkZXJsYW5kc1xyXG5cclxuZXhwb3J0IGRlZmF1bHQge307XHJcbiIsIi8vIE5vcnNrXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gasSZenlrIHBvbHNraVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge307XHJcbiIsIi8vIFBvcnR1Z3XDqnNcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAvLyBzZXR0aW5nLnRzXHJcbiAgd2VsY29tZTogJ0JlbS12aW5kbyBhbyBNZW1vcyEnLFxyXG4gIHJpYmJvbkljb25UaXRsZTogJ01lbW9zJyxcclxuICBtb250aHM6IFtcclxuICAgICdKYW5laXJvJyxcclxuICAgICdGZXZlcmVpcm8nLFxyXG4gICAgJ01hcsOnbycsXHJcbiAgICAnQWJyaWwnLFxyXG4gICAgJ01haW8nLFxyXG4gICAgJ0p1bmhvJyxcclxuICAgICdKdWxobycsXHJcbiAgICAnQWdvc3RvJyxcclxuICAgICdTZXRlbWJybycsXHJcbiAgICAnT3V0dWJybycsXHJcbiAgICAnTm92ZW1icm8nLFxyXG4gICAgJ0RlemVtYnJvJyxcclxuICBdLFxyXG4gIG1vbnRoc1Nob3J0OiBbJ0phbi4nLCAnRmViLicsICdNYXIuJywgJ0Fwci4nLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWcuJywgJ1NlcHQuJywgJ09jdC4nLCAnTm92LicsICdEZWMuJ10sXHJcbiAgd2Vla0RheXM6IFsnRG9taW5nbycsICdTZWd1bmRhJywgJ1RlcsOnYScsICdRdWFydGEnLCAnUXVpbnRhJywgJ1NleHRhJywgJ1PDoWJhZG8nXSxcclxuICB3ZWVrRGF5c1Nob3J0OiBbJ0RvbScsICdTZWcnLCAnVGVyJywgJ1F1YScsICdRdWknLCAnU2V4JywgJ1PDoWInXSxcclxuICB0bzogJ3BhcmEnLFxyXG4gIHllYXI6IG51bGwsXHJcbiAgbW9udGg6IG51bGwsXHJcbiAgJ0Jhc2ljIE9wdGlvbnMnOiAnT3DDp8O1ZXMgQsOhc2ljYXMnLFxyXG4gICdVc2VyIG5hbWUgaW4gTWVtb3MnOiAnTm9tZSBkZSBVc3XDoXJpbyBubyBNZW1vcycsXHJcbiAgXCJTZXQgeW91ciB1c2VyIG5hbWUgaGVyZS4gJ01lbW9zIPCfmI8nIEJ5IGRlZmF1bHRcIjogXCJEZWZpbmUgbyBub21lIGRlIHVzdcOhcmlvLiBQYWRyw6NvOiAnTWVtb3Mg8J+YjydcIixcclxuICAnSW5zZXJ0IGFmdGVyIGhlYWRpbmcnOiAnSW5zZXJpciBhcMOzcyBvIHTDrXR1bG8nLFxyXG4gICdZb3Ugc2hvdWxkIHNldCB0aGUgc2FtZSBoZWFkaW5nIGJlbG93IGlmIHlvdSB3YW50IHRvIGluc2VydCBhbmQgcHJvY2VzcyBtZW1vcyBiZWxvdyB0aGUgc2FtZSBoZWFkaW5nLic6XHJcbiAgICAnRGV2ZSBkZWZpbmlyIG8gbWVzbW8gdMOtdHVsbyBuYSBvcMOnw6NvIGFiYWl4byBzZSBwcmV0ZW5kZSBpbnNlcmlyIGUgcHJvY2Vzc2FyIE1lbW9zIGFiYWl4byBkbyB0w610dWxvIGFxdWkgZGVmaW5pZG8uJyxcclxuICAnQWxsb3dzIGFkbW9uaXRpb25zIHRvIGJlIGNyZWF0ZWQgdXNpbmcgJzogJ1Blcm1pdGUgcXVlIGFkbW9uaXRpb25zIHNlamFtIGNyaWFkYXMgdXNhbmRvICcsXHJcbiAgJ1Byb2Nlc3MgTWVtb3MgYmVsb3cnOiAnUHJvY2Vzc2FyIE1lbW9zIGFiYWl4bycsXHJcbiAgJ09ubHkgZW50cmllcyBiZWxvdyB0aGlzIHN0cmluZy9zZWN0aW9uIGluIHlvdXIgbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQuIElmIGl0IGRvZXMgbm90IGV4aXN0IG5vIG5vdGVzIHdpbGwgYmUgcHJvY2Vzc2VkIGZvciB0aGF0IGZpbGUuJzpcclxuICAgICdTb21lbnRlIGFzIGVudHJhZGFzIGFiYWl4byBkZXN0ZSBUw610dWxvL1NlY8Onw6NvIHNlcsOjbyBwcm9jZXNzYWRhcyBuYXMgc3VhcyBub3Rhcy4gU2UgZXN0YSBTZWPDp8OjbyBuw6NvIGVzdGl2ZXIgZGVmaW5pZGEsIG5lbmh1bWEgbm90YSBzZXLDoSBwcm9jZXNzYWRhIHBhcmEgZXNzZSBmaWNoZWlyby4nLFxyXG4gICdTYXZlIE1lbW8gYnV0dG9uIGxhYmVsJzogJ0xlZ2VuZGEgZG8gYm90w6NvIEd1YXJkYXIgTWVtbycsXHJcbiAgXCJUaGUgdGV4dCBzaG93biBvbiB0aGUgc2F2ZSBNZW1vIGJ1dHRvbiBpbiB0aGUgVUkuICdOT1RFSVQnIGJ5IGRlZmF1bHQuXCI6XHJcbiAgICAnRGVmaW5lIG8gdGV4dG8gYXByZXNlbnRhZG8gbm8gYm90w6NvIFwiR3VhcmRhciBNZW1vXCIgbmEgaW50ZXJmYWNlIGRlIHVzdcOhcmlvLiBQYWRyw6NvOiBcIk5PVEVJVFwiLicsXHJcbiAgJ0ZvY3VzIG9uIGVkaXRvciB3aGVuIG9wZW4gbWVtb3MnOiAnRm9jYXIgbm8gRWRpdG9yIGFvIGluaWNpYXIgbyBNZW1vcycsXHJcbiAgJ0ZvY3VzIG9uIEVkaXRvciB3aGVuIG9wZW4gbWVtb3MuIEZvY3VzIGJ5IGRlZmF1bHQuJzpcclxuICAgICdGb2NhciBubyBlZGl0b3IgYW8gaW5pY2lhciBvIE1lbW9zLiBGb2NhciBlc3TDoSBkZWZpbmlkbyBjb21vIHBhZHLDo28uJyxcclxuICAnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MnOiAnQWJyaXIgbWVtb3JhbmRvcyBkacOhcmlvcyBhbyBpbmljaWFyIG8gTWVtb3MnLFxyXG4gICdPcGVuIGRhaWx5IG1lbW9zIHdpdGggb3BlbiBtZW1vcy4gT3BlbiBieSBkZWZhdWx0Lic6XHJcbiAgICAnQWJyaXIgbWVtb3JhbmRvcyBkacOhcmlvcyBhbyBpbmljaWFyIG8gTWVtb3MuIEFicmlyIGVzdMOhIGRlZmluaWRvIGNvbW8gcGFkcsOjby4nLFxyXG4gICdPcGVuIE1lbW9zIHdoZW4gb2JzaWRpYW4gb3BlbnMnOiAnQWJyaXIgTWVtb3MgcXVhbmRvIG8gT2JzaWRpYW4gaW5pY2lhJyxcclxuICAnV2hlbiBlbmFibGUgdGhpcywgTWVtb3Mgd2lsbCBvcGVuIHdoZW4gT2JzaWRpYW4gb3BlbnMuIEZhbHNlIGJ5IGRlZmF1bHQuJzpcclxuICAgICdRdWFuZG8gZXN0YSBvcMOnw6NvIGVzdMOhIGFjdGl2YSwgbyBNZW1vcyBhYnJpcsOhIHF1YW5kbyBvIE9ic2lkaWFuIGluaWNpYS4gRGVzYWN0aXZhZG8gcG9yIHBhZHLDo28uJyxcclxuICAnSGlkZSBkb25lIHRhc2tzIGluIE1lbW8gbGlzdCc6ICdPY3VsdGFyIHRhcmVmYXMgY29uY2x1w61kYXMgbmEgbGlzdGEgZGUgTWVtb3MnLFxyXG4gICdIaWRlIGFsbCBkb25lIHRhc2tzIGluIE1lbW8gbGlzdC4gU2hvdyBkb25lIHRhc2tzIGJ5IGRlZmF1bHQuJzpcclxuICAgICdPY3VsdGFyIHRvZGFzIGFzIHRhcmVmYXMgY29uY2x1w61kYXMgbmEgbGlzdGEgZGUgTWVtb3MuIE1vc3RyYXIgYXMgdGFyZWZhcyBjb25jbHXDrWRhcyBlc3TDoSBkZWZpbmlkbyBjb21vIHBhZHLDo28uJyxcclxuICAnQWR2YW5jZWQgT3B0aW9ucyc6ICdPcMOnw7VlcyBBdmFuw6dhZGFzJyxcclxuICAnVUkgbGFuZ3VhZ2UgZm9yIGRhdGUnOiAnSWRpb21hIGRhIERhdGEgbmEgaW50ZXJmYWNlIGRvIHVzdcOhcmlvJyxcclxuICBcIlRyYW5zbGF0ZXMgdGhlIGRhdGUgVUkgbGFuZ3VhZ2UuIE9ubHkgJ2VuJyBhbmQgJ3poJyBhcmUgYXZhaWxhYmxlLlwiOlxyXG4gICAgXCJEZWZpbmUgbyBpZGlvbWEgZGEgRGF0YSBuYSBpbnRlcmZhY2UgZG8gdXN1w6FyaW8uIERlIG1vbWVudG8sIGFwZW5hcyAnZW4nLCAnZnInLCAncHQnIGUgJ3poJyBlc3TDo28gZGlzcG9uw612ZWlzLlwiLFxyXG4gICdEZWZhdWx0IHByZWZpeCc6ICdQcmVmaXhvIHBhZHLDo28nLFxyXG4gIFwiU2V0IHRoZSBkZWZhdWx0IHByZWZpeCB3aGVuIGNyZWF0ZSBtZW1vLCAnTGlzdCcgYnkgZGVmYXVsdC5cIjpcclxuICAgIFwiRGVmaW5lIG8gcHJlZml4byBwYWRyw6NvIHF1YW5kbyB1bSBtZW1vcmFuZG8gw6kgY3JpYWRvLiBQYWRyw6NvOiAnTGlzdGEnLlwiLFxyXG4gICdEZWZhdWx0IGluc2VydCBkYXRlIGZvcm1hdCc6ICdGb3JtYXRvIHBhZHLDo28gcGFyYSBpbnNlcsOnw6NvIGRlIERhdGEnLFxyXG4gIFwiU2V0IHRoZSBkZWZhdWx0IGRhdGUgZm9ybWF0IHdoZW4gaW5zZXJ0IGRhdGUgYnkgQCwgJ1Rhc2tzJyBieSBkZWZhdWx0LlwiOlxyXG4gICAgXCJEZWZpbmUgbyBmb3JtYXRvIGRlIERhdGEgcGFkcsOjbyBhbyBpbnNlcmlyIGEgZGF0YSB1c2FuZG8gQC4gUGFkcsOjbzogJ1RhcmVmYXMnLlwiLFxyXG4gICdEZWZhdWx0IGVkaXRvciBwb3NpdGlvbiBvbiBtb2JpbGUnOiAnUG9zacOnw6NvIHBhZHLDo28gZG8gZWRpdG9yIGRlIG1lbW9zIG5hIHZlcnPDo28gbcOzdmVsLicsXHJcbiAgXCJTZXQgdGhlIGRlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIE1vYmlsZSwgJ1RvcCcgYnkgZGVmYXVsdC5cIjpcclxuICAgIFwiRGVmaW5lIGEgcG9zacOnw6NvIHBhZHLDo28gZG8gZWRpdG9yIGRlIE1lbW9zIG5hIHZlcnPDo28gbcOzdmVsLiBQYWRyw6NvOiAnVG9wbycuXCIsXHJcbiAgJ1VzZSBidXR0b24gdG8gc2hvdyBlZGl0b3Igb24gbW9iaWxlJzogJ1VzYXIgdW0gYm90w6NvIHBhcmEgbW9zdHJhciBvIGVkaXRvciBuYSB2ZXJzw6NvIG3Ds3ZlbCcsXHJcbiAgJ1NldCBhIGZsb2F0IGJ1dHRvbiB0byBjYWxsIGVkaXRvciBvbiBtb2JpbGUuIE9ubHkgd2hlbiBlZGl0b3IgbG9jYXRlZCBhdCB0aGUgYm90dG9tIHdvcmtzLic6XHJcbiAgICBcIkRlZmluZSB1bSBib3TDo28gZmx1dHVhbnRlIHBhcmEgYWJyaXIgbyBlZGl0b3IgbmEgdmVyc8OjbyBtw7N2ZWwuIE9ww6fDo28gZGlzcG9uw612ZWwgc29tZW50ZSBxdWFuZG8gYSBwb3Npw6fDo28gZG8gZWRpdG9yIGVzdMOhIGRlZmluaWRhIHBhcmEgJ0Z1bmRvJ1wiLFxyXG4gICdTaG93IFRpbWUgV2hlbiBDb3B5IFJlc3VsdHMnOiAnTW9zdHJhciBhIEhvcmEgYW8gY29waWFyIG9zIHJlc3VsdGFkb3MnLFxyXG4gICdTaG93IHRpbWUgd2hlbiB5b3UgY29weSByZXN1bHRzLCBsaWtlIDEyOjAwLiBDb3B5IHRpbWUgYnkgZGVmYXVsdC4nOlxyXG4gICAgXCJNb3N0cmFyIGEgSG9yYSBhbyBjb3BpYXIgb3MgcmVzdWx0YWRvcywgY29tbyAnMTI6MDAnLiBDb3BpYXIgYSBIb3JhIGVzdMOhIGFjdGl2YWRvIHBvciBwYWRyw6NvLlwiLFxyXG4gICdTaG93IERhdGUgV2hlbiBDb3B5IFJlc3VsdHMnOiAnTW9zdHJhciBhIERhdGEgYW8gY29waWFyIG9zIHJlc3VsdGFkb3MnLFxyXG4gICdTaG93IGRhdGUgd2hlbiB5b3UgY29weSByZXN1bHRzLCBsaWtlIFtbMjAyMi0wMS0wMV1dLiBDb3B5IGRhdGUgYnkgZGVmYXVsdC4nOlxyXG4gICAgJ01vc3RyYXIgYSBEYXRhIGFvIGNvcGlhciBvcyByZXN1bHRhZG9zLCBjb21vIFtbMjAyMi0wMS0wMV1dLiBDb3BpYXIgYSBEYXRhIGVzdMOhIGFjdGl2YWRvIHBvciBwYWRyw6NvLicsXHJcbiAgJ0FkZCBCbGFuayBMaW5lIEJldHdlZW4gRGlmZmVyZW50IERhdGUnOiAnQWRpY2lvbmFyIGxpbmhhIGVtIGJyYW5jbyBlbnRyZSBEYXRhcyBkaWZlcmVudGVzLicsXHJcbiAgJ0FkZCBibGFuayBsaW5lIHdoZW4gY29weSByZXN1bHQgd2l0aCBkYXRlLiBObyBibGFuayBsaW5lIGJ5IGRlZmF1bHQuJzpcclxuICAgICdBZGljaW9uYXIgbGluaGEgZW0gYnJhbmNvIGFvIGNvcGlhciByZXN1bHRhZG9zIGNvbSBEYXRhLiBQb3IgcGFkcsOjbyBuZW5odW1hIGxpbmhhIMOpIGFkaWNpb25hZGEuJyxcclxuICAnU2hhcmUgT3B0aW9ucyc6ICdPcMOnw7VlcyBkZSBQYXJ0aWxoYScsXHJcbiAgJ1NoYXJlIE1lbW9zIEltYWdlIEZvb3RlciBTdGFydCc6ICdQYXJ0aWxoYXIgYSBJbWFnZW0gZGUgdW0gTWVtbyAtIEluw61jaW8gZG8gcm9kYXDDqScsXHJcbiAgXCJTZXQgYW55dGhpbmcgeW91IHdhbnQgaGVyZSwgdXNlIHtNZW1vc051bX0gdG8gZGlzcGxheSBOdW1iZXIgb2YgbWVtb3MsIHtVc2VkRGF5fSBmb3IgZGF5cy4gJ3tNZW1vc051bX0gTWVtb3Mge1VzZWREYXl9IERheXMnIEJ5IGRlZmF1bHRcIjpcclxuICAgIFwiRGVmaW5hIG8gcXVlIHF1aXNlciwgdXNlIHtNZW1vc051bX0gcGFyYSBtb3N0cmFyIG8gbsO6bWVybyBkZSBNZW1vcyBlIHVzZSB7VXNlZERheX0gcGFyYSBkaWFzLiAnUGFkcsOjbzoge01lbW9zTnVtfSBNZW1vcyB7VXNlZERheX0gRGF5cycuXCIsXHJcbiAgJ1NoYXJlIE1lbW9zIEltYWdlIEZvb3RlciBFbmQnOiAnUGFydGlsaGFyIGEgSW1hZ2VtIGRlIHVtIE1lbW8gLSBGaW0gZG8gcm9kYXDDqScsXHJcbiAgXCJTZXQgYW55dGhpbmcgeW91IHdhbnQgaGVyZSwgdXNlIHtVc2VyTmFtZX0gYXMgeW91ciB1c2VybmFtZS4gJ+Kcje+4jyBCeSB7VXNlck5hbWV9JyBCeSBkZWZhdWx0XCI6XHJcbiAgICBcIkRlZmluYSBvIHF1ZSBxdWlzZXIsIHVzZSB7VXNlck5hbWV9IGNvbW8gbyBzZXUgbm9tZSBkZSB1c3XDoXJpby4gUGFkcsOjbzogJ+Kcje+4jyBQb3Ige1VzZXJOYW1lfScuXCIsXHJcbiAgJ1NhdmUgU2hhcmVkIEltYWdlIFRvIEZvbGRlciBGb3IgTW9iaWxlJzogJ0d1YXJkYXIgYSBpbWFnZW0gcGFydGlsaGFkYSBwYXJhIHBhc3RhIG5hIHZlcnPDo28gbcOzdmVsJyxcclxuICAnU2F2ZSBpbWFnZSB0byBmb2xkZXIgZm9yIG1vYmlsZS4gRmFsc2UgYnkgRGVmYXVsdCc6XHJcbiAgICAnR3VhcmRhciBhIGltYWdlbSBwYXJ0aWxoYWRhIHBhcmEgcGFzdGEgbmEgdmVyc8OjbyBtw7N2ZWwuIERlc2FjdGl2YWRvIHBvciBwYWRyw6NvLicsXHJcbiAgJ1NheSBUaGFuayBZb3UnOiAnQWdyYWRlw6dhJyxcclxuICBEb25hdGU6ICdEb2FyJyxcclxuICAnSWYgeW91IGxpa2UgdGhpcyBwbHVnaW4sIGNvbnNpZGVyIGRvbmF0aW5nIHRvIHN1cHBvcnQgY29udGludWVkIGRldmVsb3BtZW50Oic6XHJcbiAgICAnU2UgZ29zdGEgZGVzdGUgcGx1Z2luLCBjb25zaWRlcmUgZG9hciBwYXJhIGFwb2lhciBvIHNldSBkZXNlbnZvbHZpbWVudG8gY29udMOtbnVvOicsXHJcbiAgJ0ZpbGUgTmFtZSBvZiBSZWN5Y2xlIEJpbic6ICdOb21lIGRhIFJlY2ljbGFnZW0nLFxyXG4gIFwiU2V0IHRoZSBmaWxlbmFtZSBmb3IgcmVjeWNsZSBiaW4uICdkZWxldGUnIEJ5IGRlZmF1bHRcIjpcclxuICAgIFwiRGVmaW5lIG8gbm9tZSBkbyBmaWNoZWlybyBwYXJhIGEgUmVjaWNsYWdlbS4gUGFkcsOjbzogJ2RlbGV0ZScuXCIsXHJcbiAgJ0ZpbGUgTmFtZSBvZiBRdWVyeSBGaWxlJzogJ05vbWUgZG8gYXJxdWl2byBkbyBmaWNoZWlybyBkZSBDb25zdWx0YScsXHJcbiAgXCJTZXQgdGhlIGZpbGVuYW1lIGZvciBxdWVyeSBmaWxlLiAncXVlcnknIEJ5IGRlZmF1bHRcIjogXCJEZWZpbmUgbyBub21lIGRvIGZpY2hlaXJvIHBhcmEgQ29uc3VsdGFzLiBQYWRyw6NvOiAnUXVlcnknLlwiLFxyXG4gICdVc2UgVGFncyBJbiBWYXVsdCc6ICdVc2FyIFRhZ3Mgbm8gVmF1bHQnLFxyXG4gICdVc2UgdGFncyBpbiB2YXVsdCByYXRoZXIgdGhhbiBvbmx5IGluIE1lbW9zLiBGYWxzZSBieSBkZWZhdWx0Lic6XHJcbiAgICAnVXNhciBhcyBUYWdzIGRvIFZhdWx0IGUgbsOjbyBzb21lbnRlIGRvIE1lbW9zLiBEZXNhY3RpdmFkbyBwb3IgcGFkcsOjby4nLFxyXG4gICdSZWFkeSB0byBjb252ZXJ0IGltYWdlIGludG8gYmFja2dyb3VuZCc6ICdQcm9udG8gcGFyYSBjb252ZXJ0ZXIgaW1hZ2VtIGVtIGZ1bmRvJyxcclxuICBMaXN0OiAnTGlzdGEnLFxyXG4gIFRhc2s6ICdUYXJlZmEnLFxyXG4gIFRvcDogJ1RvcG8nLFxyXG4gIEJvdHRvbTogJ0Z1bmRvJyxcclxuICBUQUc6ICdUQUcnLFxyXG4gIERBWTogJ0RJQScsXHJcbiAgUVVFUlk6ICdRVUVSWScsXHJcbiAgRURJVDogJ0VESVRBUicsXHJcbiAgUElOOiAnRklYQVInLFxyXG4gIFVOUElOOiAnREVTQUZJWEFSJyxcclxuICBERUxFVEU6ICdFTElNSU5BUicsXHJcbiAgJ0NPTkZJUk3vvIEnOiAnQ09ORklSTUFS77yBJyxcclxuICAnQ1JFQVRFIEZJTFRFUic6ICdDUklBUiBGSUxUUk8nLFxyXG4gIFNldHRpbmdzOiAnRGVmaW5pw6fDtWVzJyxcclxuICAnUmVjeWNsZSBiaW4nOiAnUmVjaWNsYWdlbScsXHJcbiAgJ0Fib3V0IE1lJzogJ0FjZXJjYSBkZSBtaW0nLFxyXG4gICdGZXRjaGluZyBkYXRhLi4uJzogJ0EgcHJvY3VyYXIgZGFkb3MuLi4nLFxyXG4gICdIZXJlIGlzIE5vIFpldHRlbHMuJzogJ07Do28gZXhpc3RlbSBaZXR0ZWxzLicsXHJcbiAgJ0ZyZXF1ZW50bHkgVXNlZCBUYWdzJzogJ1RhZ3MgVXNhZGFzIEZyZXF1ZW50ZW1lbnRlJyxcclxuICAnV2hhdCBkbyB5b3UgdGhpbmsgbm93Li4uJzogJ0VtIHF1ZSBlc3TDoSBhIHBlbnNhci4uLicsXHJcbiAgUkVBRDogJ0xFUicsXHJcbiAgTUFSSzogJ0FTU0lOQUxBUicsXHJcbiAgU0hBUkU6ICdQQVJUSUxIQVInLFxyXG4gIFNPVVJDRTogJ09SSUdFTScsXHJcbiAgUkVTVE9SRTogJ1JFU1RBVVJBUicsXHJcbiAgJ0RFTEVURSBBVCc6ICdFTElNSU5BRE8gRU0nLFxyXG4gICdOb29vb3AhJzogJ05vb29vcCEnLFxyXG4gICdBbGwgRGF0YSBpcyBMb2FkZWQg8J+OiSc6ICdUb2RvcyBvcyBkYWRvcyBmb3JhbSBjYXJyZWdhZG9zIPCfjoknLFxyXG4gICdRdWljayBmaWx0ZXInOiAnRmlsdHJvIHLDoXBpZG8nLFxyXG4gIFRZUEU6ICdUSVBPJyxcclxuICBMSU5LRUQ6ICdMSU5LRUQnLFxyXG4gICdOTyBUQUdTJzogJ1NFTSBUQUdTJyxcclxuICAnSEFTIExJTktTJzogJ1RFTSBMSU5LUycsXHJcbiAgJ0hBUyBJTUFHRVMnOiAnVEVNIElNQUdFTlMnLFxyXG4gIElOQ0xVREU6ICdJTkNMVUlSJyxcclxuICBFWENMVURFOiAnRVhDTFVJUicsXHJcbiAgVEVYVDogJ1RFWFRPJyxcclxuICBJUzogJ8OJJyxcclxuICBJU05PVDogJ07Dg08gw4knLFxyXG4gIFNFTEVDVDogJ1NFTEVDQ0lPTkFSJyxcclxuICAnQUREIEZJTFRFUiBURVJNUyc6ICdBRElDSU9OQVIgVEVSTU9TIERFIEZJTFRSQUdFTScsXHJcbiAgRklMVEVSOiAnRklMVFJBUicsXHJcbiAgVElUTEU6ICdUw41UVUxPJyxcclxuICAnQ1JFQVRFIFFVRVJZJzogJ0NSSUFSIFFVRVJZJyxcclxuICAnRURJVCBRVUVSWSc6ICdFRElUQVIgUVVFUlknLFxyXG4gIE1BVENIOiAnSUdVQUxBJyxcclxuICBUSU1FUzogJ1ZFWkVTJyxcclxuICAnU2hhcmUgTWVtbyBJbWFnZSc6ICdQYXJ0aWxoYXIgaW1hZ2VtIGRvIE1lbW8nLFxyXG4gICfihpdDbGljayB0aGUgYnV0dG9uIHRvIHNhdmUnOiAn4oaXQ2xpcXVlIG5vIGJvdMOjbyBwYXJhIGd1YXJkYXInLFxyXG4gICdJbWFnZSBpcyBnZW5lcmF0aW5nLi4uJzogJ0EgZ2VyYXIgSW1hZ2VtLi4nLFxyXG4gICdJbWFnZSBpcyBsb2FkaW5nLi4uJzogJ0EgY2FycmVnYXIgSW1hZ2VtLi4uJyxcclxuICAnTG9hZGluZy4uLic6ICdDYXJyZWdhbmRvLi4uJyxcclxuICAn8J+YnyBDYW5ub3QgbG9hZCBpbWFnZSwgaW1hZ2UgbGluayBtYXliZSBicm9rZW4nOlxyXG4gICAgJ/CfmJ8gTsOjbyDDqSBwb3Nzw612ZWwgY2FycmVnYXIgYSBpbWFnZW0sIG8gbGluayBkYSBpbWFnZW0gcGFyZWNlIGVzdGFyIHF1ZWJyYWRvJyxcclxuICAnRGFpbHkgTWVtb3MnOiAnTWVtb3MgRGnDoXJpb3MnLFxyXG4gICdDQU5DRUwgRURJVCc6ICdDQU5DRUxBUiBFREnDh8ODTycsXHJcbiAgJ0xJTksgVE8gVEhFJzogJ0xJTksgUEFSQSBPJyxcclxuICAnTW9iaWxlIE9wdGlvbnMnOiAnT3DDp8O1ZXMgTcOzdmVpcycsXHJcbiAgXCJEb24ndCBzdXBwb3J0IHdlYiBpbWFnZSB5ZXQsIHBsZWFzZSBpbnB1dCBpbWFnZSBwYXRoIGluIHZhdWx0XCI6XHJcbiAgICAnQWluZGEgbsOjbyBleGlzdGUgc3Vwb3J0ZSBwYXJhIGltYWdlbnMgZGUgd2ViLiBQb3IgZmF2b3IsIGluc2lyYSBvIGxpbmsgcGFyYSB1bWEgaW1hZ2VtIG5vIHZhdWx0JyxcclxuICAnRXhwZXJpbWVudGFsIE9wdGlvbnMnOiAnT3DDp8O1ZXMgRXhwZXJpbWVudGFpcycsXHJcbiAgJ0JhY2tncm91bmQgSW1hZ2UgaW4gRGFyayBUaGVtZSc6ICdJbWFnZW0gZGUgZnVuZG8gbm8gVGVtYSBFc2N1cm8nLFxyXG4gICdCYWNrZ3JvdW5kIEltYWdlIGluIExpZ2h0IFRoZW1lJzogJ0ltYWdlbSBkZSBmdW5kbyBubyBUZW1hIENsYXJvJyxcclxuICAnU2V0IGJhY2tncm91bmQgaW1hZ2UgaW4gZGFyayB0aGVtZS4gU2V0IHNvbWV0aGluZyBsaWtlIFwiRGFpbHkvb25lLnBuZ1wiJzpcclxuICAgICdEZWZpbmEgYSBpbWFnZW0gZGUgZnVuZG8gbm8gVGVtYSBFc2N1cm8uIERlZmluYSBhbGdvIGNvbW8gXCJEYWlseS9vbmUucG5nXCInLFxyXG4gICdTZXQgYmFja2dyb3VuZCBpbWFnZSBpbiBsaWdodCB0aGVtZS4gU2V0IHNvbWV0aGluZyBsaWtlIFwiRGFpbHkvb25lLnBuZ1wiJzpcclxuICAgICdEZWZpbmEgYSBpbWFnZW0gZGUgZnVuZG8gbm8gVGVtYSBDbGFyby4gRGVmaW5hIGFsZ28gY29tbyBcIkRhaWx5L29uZS5wbmdcIicsXHJcbiAgJ1NldCBkZWZhdWx0IG1lbW8gY29tcG9zaXRpb24sIHlvdSBzaG91bGQgdXNlIHtUSU1FfSBhcyBcIkhIOm1tXCIgYW5kIHtDT05URU5UfSBhcyBjb250ZW50LiBcIntUSU1FfSB7Q09OVEVOVH1cIiBieSBkZWZhdWx0JzpcclxuICAgICdEZWZpbmEgYSBjb21wb3Npw6fDo28gcGFkcsOjbyBkbyBNZW1vLCBkZXZlIHVzYXIge1RJTUV9IGNvbW8gXCJISDptbVwiIGUge0NPTlRFTlR9IGNvbW8gY29udGXDumRvLiBQYWRyw6NvOiBcIntUSU1FfSB7Q09OVEVOVH1cIicsXHJcbiAgJ0RlZmF1bHQgTWVtbyBDb21wb3NpdGlvbic6ICdDb21wb3Npw6fDo28gUGFkcsOjbyBkbyBNZW1vJyxcclxuICAnU2hvdyBUYXNrcyBMYWJlbCc6ICdNb3N0cmFyIEV0aXF1ZXRhcyBkZSBUYXJlZmFzJyxcclxuICAnU2hvdyB0YXNrcyBsYWJlbCBuZWFyIHRoZSB0aW1lIHRleHQuIEZhbHNlIGJ5IGRlZmF1bHQnOlxyXG4gICAgJ01vc3RyYXIgZXRpcXVldGFzIGRlIHRhcmVmYXMgcHLDs3hpbW8gYW8gdGV4dG8gZGUgdGVtcG8uIERlc2FjdGl2YWRvIHBvciBwYWRyw6NvJyxcclxufTtcclxuIiwiLy8gUG9ydHVndcOqcyBkbyBCcmFzaWxcclxuLy8gQnJhemlsaWFuIFBvcnR1Z3Vlc2VcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHt9O1xyXG4iLCIvLyBSb23Dom7Eg1xyXG5cclxuZXhwb3J0IGRlZmF1bHQge307XHJcbiIsIi8vINGA0YPRgdGB0LrQuNC5XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7fTtcclxuIiwiLy8gVMO8cmvDp2VcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHt9O1xyXG4iLCJleHBvcnQgZGVmYXVsdCB7XHJcbiAgLy8gc2V0dGluZy50c1xyXG4gIHdlbGNvbWU6ICfmrKLov47kvb/nlKggTWVtb3MgJyxcclxuICByaWJib25JY29uVGl0bGU6ICdNZW1vcycsXHJcbiAgbW9udGhzOiBbJ+S4gOaciCcsICfkuozmnIgnLCAn5LiJ5pyIJywgJ+Wbm+aciCcsICfkupTmnIgnLCAn5YWt5pyIJywgJ+S4g+aciCcsICflhavmnIgnLCAn5Lmd5pyIJywgJ+WNgeaciCcsICfljYHkuIDmnIgnLCAn5Y2B5LqM5pyIJ10sXHJcbiAgbW9udGhzU2hvcnQ6IFtudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsXSxcclxuICB3ZWVrRGF5czogWyflkajml6UnLCAn5ZGo5LiAJywgJ+WRqOS6jCcsICflkajkuIknLCAn5ZGo5ZubJywgJ+WRqOS6lCcsICflkajlha0nXSxcclxuICB3ZWVrRGF5c1Nob3J0OiBbJ+WRqOaXpScsICflkajkuIAnLCAn5ZGo5LqMJywgJ+WRqOS4iScsICflkajlm5snLCAn5ZGo5LqUJywgJ+WRqOWFrSddLFxyXG4gIHRvOiAn6IezJyxcclxuICB5ZWFyOiAn5bm0JyxcclxuICBtb250aDogJ+aciCcsXHJcbiAgJ0Jhc2ljIE9wdGlvbnMnOiAn5Z+656GA6YCJ6aG5JyxcclxuICAnVXNlciBuYW1lIGluIE1lbW9zJzogJ+WcqCBNZW1vcyDkuK3mmL7npLrnmoTnlKjmiLflkI0nLFxyXG4gIFwiU2V0IHlvdXIgdXNlciBuYW1lIGhlcmUuICdNZW1vcyDwn5iPJyBCeSBkZWZhdWx0XCI6IFwi5Zyo6L+Z6YeM6K6+572u5L2g5Zac5qyi55qE55So5oi35ZCN44CCIOm7mOiupOS4uiAnTWVtb3Mg8J+YjydcIixcclxuICAnSW5zZXJ0IGFmdGVyIGhlYWRpbmcnOiAn5Zyo5oyH5a6a5qCH6aKY5ZCO5o+S5YWlIE1lbW8nLFxyXG4gICdZb3Ugc2hvdWxkIHNldCB0aGUgc2FtZSBoZWFkaW5nIGJlbG93IGlmIHlvdSB3YW50IHRvIGluc2VydCBhbmQgcHJvY2VzcyBtZW1vcyBiZWxvdyB0aGUgc2FtZSBoZWFkaW5nLic6XHJcbiAgICAn5L2g5aaC5p6c5oOz6KaB5o+S5YWl5qCH6aKY55qE5ZCM5pe25pi+56S65a+55bqU5qCH6aKY5LiL55qEIE1lbW/vvIzkvaDlv4Xpobvkv53or4HlvZPliY3orr7nva7kuI7kuIvmlrnnmoTop6PmnpDorr7nva7mmK/kuIDoh7TnmoTjgILlvZPkuLrnqbrml7bmj5LlhaXliLDmlofmnKsnLFxyXG4gICdQcm9jZXNzIE1lbW9zIGJlbG93JzogJ+ino+aekOaMh+Wumuagh+mimOWQjueahCBNZW1vJyxcclxuICAnT25seSBlbnRyaWVzIGJlbG93IHRoaXMgc3RyaW5nL3NlY3Rpb24gaW4geW91ciBub3RlcyB3aWxsIGJlIHByb2Nlc3NlZC4gSWYgaXQgZG9lcyBub3QgZXhpc3Qgbm8gbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQgZm9yIHRoYXQgZmlsZS4nOlxyXG4gICAgJ+WPquacieWcqOiuvue9rueahOagh+mimOWQjueahCBNZW1vIOaJjeS8muiiq+ino+aekOOAguW9k+S4uuepuuaXtuino+aekOWFqOaWh+eahCBNZW1vJyxcclxuICAnU2F2ZSBNZW1vIGJ1dHRvbiBsYWJlbCc6ICfkv53lrZjmjInpkq7kuIrnmoTmlofmnKwnLFxyXG4gIFwiVGhlIHRleHQgc2hvd24gb24gdGhlIHNhdmUgTWVtbyBidXR0b24gaW4gdGhlIFVJLiAnTk9URUlUJyBieSBkZWZhdWx0LlwiOiBcIuWcqOS/neWtmOaMiemSruS4iuWxleekuueahOaWh+acrOOAgum7mOiupOS4uiAnTk9URUlUJ1wiLFxyXG4gICdGb2N1cyBvbiBlZGl0b3Igd2hlbiBvcGVuIG1lbW9zJzogJ+iHquWKqOiBmueEpuWIsCBNZW1vcyDovpPlhaXmoYYnLFxyXG4gICdGb2N1cyBvbiBlZGl0b3Igd2hlbiBvcGVuIG1lbW9zLiBGb2N1cyBieSBkZWZhdWx0Lic6ICflvZPmiZPlvIAgTWVtb3Mg55qE5pe25YCZ6Ieq5Yqo6IGa54Sm5YiwIE1lbW9zIOi+k+WFpeahhuOAgum7mOiupOW8gOWQrycsXHJcbiAgJ09wZW4gZGFpbHkgbWVtb3Mgd2l0aCBvcGVuIG1lbW9zJzogJ+aJk+W8gOavj+aXpSBNZW1vIOeahOaXtuWAmeaJk+W8gCBNZW1vcyDnlYzpnaInLFxyXG4gICdPcGVuIGRhaWx5IG1lbW9zIHdpdGggb3BlbiBtZW1vcy4gT3BlbiBieSBkZWZhdWx0Lic6ICfmiZPlvIDmr4/ml6UgTWVtbyDnmoTml7blgJnmiZPlvIAgTWVtb3Mg55WM6Z2i44CC6buY6K6k5byA5ZCvJyxcclxuICAnT3BlbiBNZW1vcyB3aGVuIG9ic2lkaWFuIG9wZW5zJzogJ+W9k+W8gOWQryBPYnNpZGlhbiDnmoTml7blgJnoh6rliqjmiZPlvIAgTWVtb3MnLFxyXG4gICdXaGVuIGVuYWJsZSB0aGlzLCBNZW1vcyB3aWxsIG9wZW4gd2hlbiBPYnNpZGlhbiBvcGVucy4gRmFsc2UgYnkgZGVmYXVsdC4nOlxyXG4gICAgJ+W9k+W8gOWQr+ivpemAiemhuSwgTWVtb3Mg5Lya5ZyoIE9ic2lkaWFuIOaJk+W8gOaXtuiHquWKqOaJk+W8gOOAgum7mOiupOS4jeW8gOWQr+OAgicsXHJcbiAgJ0hpZGUgZG9uZSB0YXNrcyBpbiBNZW1vIGxpc3QnOiAn5ZyoIG1lbW8g5YiX6KGo5Lit6ZqQ6JeP5bey5a6M5oiQIG1lbW8nLFxyXG4gICdIaWRlIGFsbCBkb25lIHRhc2tzIGluIE1lbW8gbGlzdC4gU2hvdyBkb25lIHRhc2tzIGJ5IGRlZmF1bHQuJzogJ+WcqCBtZW1vIOWIl+ihqOS4remakOiXj+W3suWujOaIkCBtZW1v44CC6buY6K6k5LiN5byA5ZCvJyxcclxuICAnQWR2YW5jZWQgT3B0aW9ucyc6ICfov5vpmLbpgInpobknLFxyXG4gICdVSSBsYW5ndWFnZSBmb3IgZGF0ZSc6ICfpkojlr7nml6XmnJ/lsZXnpLrnmoTor63oqIDnlYzpnaInLFxyXG4gIFwiVHJhbnNsYXRlcyB0aGUgZGF0ZSBVSSBsYW5ndWFnZS4gT25seSAnZW4nIGFuZCAnemgnIGFyZSBhdmFpbGFibGUuXCI6XHJcbiAgICBcIuWvueaXpeacn+eahOS4jeWQjOe/u+ivkeOAguebruWJjeWPquiDvemAieaLqSAnZW4nIOWSjCAnemgn77yI5pyq5p2l5Lya5bqf572u77yJXCIsXHJcbiAgJ0RlZmF1bHQgcHJlZml4JzogJ+m7mOiupOWJjee8gCcsXHJcbiAgXCJTZXQgdGhlIGRlZmF1bHQgcHJlZml4IHdoZW4gY3JlYXRlIG1lbW8sICdMaXN0JyBieSBkZWZhdWx0LlwiOiAn6K6+572u6buY6K6k55qE5YmN57yA5qC35byP44CC6buY6K6k5Li65YiX6KGoJyxcclxuICAnRGVmYXVsdCBpbnNlcnQgZGF0ZSBmb3JtYXQnOiAn5o+S5YWl5pel5pyf6ZmE5bim55qE5qC35byPJyxcclxuICBcIlNldCB0aGUgZGVmYXVsdCBkYXRlIGZvcm1hdCB3aGVuIGluc2VydCBkYXRlIGJ5IEAsICdUYXNrcycgYnkgZGVmYXVsdC5cIjpcclxuICAgIFwi5b2T5L2/55SoIEAg5p2l5b+r6YCf5o+S5YWl5pel5pyf5pe277yM5o+S5YWl5pel5pyf6ZmE5bim55qE5qC35byP77yM6buY6K6k5Li6ICdUYXNrcycg5qC35byPXCIsXHJcbiAgJ0RlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIG1vYmlsZSc6ICflnKjnp7vliqjnq6/kuIrnmoTpu5jorqTnvJbovpHlmajkvY3nva4nLFxyXG4gIFwiU2V0IHRoZSBkZWZhdWx0IGVkaXRvciBwb3NpdGlvbiBvbiBNb2JpbGUsICdUb3AnIGJ5IGRlZmF1bHQuXCI6ICforr7nva7lnKjnp7vliqjnq6/kuIrnmoTpu5jorqTnvJbovpHlmajkvY3nva7vvIzpu5jorqTlnKjpobbpg6jjgIInLFxyXG4gICdVc2UgYnV0dG9uIHRvIHNob3cgZWRpdG9yIG9uIG1vYmlsZSc6ICflvZPnvJbovpHlmajkvY3nva7lnKjlupXpg6jml7bvvIznlKjmjInpkq7mnaXllKTlh7rnvJbovpHlmagnLFxyXG4gICdTZXQgYSBmbG9hdCBidXR0b24gdG8gY2FsbCBlZGl0b3Igb24gbW9iaWxlLiBPbmx5IHdoZW4gZWRpdG9yIGxvY2F0ZWQgYXQgdGhlIGJvdHRvbSB3b3Jrcy4nOlxyXG4gICAgJ+iuvue9ruS4gOS4qua1ruWKqOaMiemSruadpeWUpOWHuue8lui+keWZqOOAguW9k+WcqOenu+WKqOerr+S4iuWQr+eUqOivpemAiemhueaJjeS8mueUn+aViCcsXHJcbiAgJ1Nob3cgVGltZSBXaGVuIENvcHkgUmVzdWx0cyc6ICflvZPlpI3liLbmo4DntKLnu5Pmnpzml7bpmYTluKbml7bpl7QnLFxyXG4gICdTaG93IHRpbWUgd2hlbiB5b3UgY29weSByZXN1bHRzLCBsaWtlIDEyOjAwLiBDb3B5IHRpbWUgYnkgZGVmYXVsdC4nOlxyXG4gICAgJ+WcqOWkjeWItuajgOe0oue7k+aenOaXtumZhOW4puWFtuaXtumXtO+8jOS+i+WmgiAxMjowMCDjgILpu5jorqTlvIDlkK8nLFxyXG4gICdTaG93IERhdGUgV2hlbiBDb3B5IFJlc3VsdHMnOiAn5b2T5aSN5Yi25qOA57Si57uT5p6c5pe26ZmE5bim5pel5pyfJyxcclxuICAnU2hvdyBkYXRlIHdoZW4geW91IGNvcHkgcmVzdWx0cywgbGlrZSBbWzIwMjItMDEtMDFdXS4gQ29weSBkYXRlIGJ5IGRlZmF1bHQuJzpcclxuICAgICflnKjlpI3liLbmo4DntKLnu5Pmnpzml7bpmYTluKblhbbml6XmnJ/vvIzkvovlpoIgW1syMDIyLTAxLTAxXV3jgILpu5jorqTlvIDlkK8nLFxyXG4gICdBZGQgQmxhbmsgTGluZSBCZXR3ZWVuIERpZmZlcmVudCBEYXRlJzogJ+WcqOWkjeWItuaXpeacn+eahOaXtuWAmeWKoOS4iuepuuihjCcsXHJcbiAgJ0FkZCBibGFuayBsaW5lIHdoZW4gY29weSByZXN1bHQgd2l0aCBkYXRlLiBObyBibGFuayBsaW5lIGJ5IGRlZmF1bHQuJzpcclxuICAgICflnKjlpI3liLbml6XmnJ/nmoTml7blgJnlnKjnm7jpgrvnmoTml6XmnJ/kuYvpl7TliqDkuIrnqbrooYzjgILpu5jorqTml6DnqbrooYwnLFxyXG4gICdTaGFyZSBPcHRpb25zJzogJ+WIhuS6q+mAiemhuScsXHJcbiAgJ1NoYXJlIE1lbW9zIEltYWdlIEZvb3RlciBTdGFydCc6ICfliIbkuqsgbWVtbyDlm77niYfnmoTlt6bovrnpobXohJonLFxyXG4gIFwiU2V0IGFueXRoaW5nIHlvdSB3YW50IGhlcmUsIHVzZSB7TWVtb3NOdW19IHRvIGRpc3BsYXkgTnVtYmVyIG9mIG1lbW9zLCB7VXNlZERheX0gZm9yIGRheXMuICd7TWVtb3NOdW19IE1lbW9zIHtVc2VkRGF5fSBEYXlzJyBCeSBkZWZhdWx0XCI6XHJcbiAgICBcIuS9oOWPr+S7peWcqOi/memHjOiuvue9ruS9oOaDs+imgeeahOS7u+aEj+aWh+acrO+8jOeUqCB7TWVtb3NOdW19IOadpeWxleekuuS9oOiusOW9leeahCBtZW1vIOaVsOmHj++8jHtVc2VkRGF5fSDmnaXlsZXnpLrkvb/nlKjml6XmnJ/jgILpu5jorqTkuLone01lbW9zTnVtfSBNZW1vcyB7VXNlZERheX0gRGF5cydcIixcclxuICAnU2hhcmUgTWVtb3MgSW1hZ2UgRm9vdGVyIEVuZCc6ICfliIbkuqsgbWVtbyDlm77niYfnmoTlj7PovrnpobXohJonLFxyXG4gIFwiU2V0IGFueXRoaW5nIHlvdSB3YW50IGhlcmUsIHVzZSB7VXNlck5hbWV9IGFzIHlvdXIgdXNlcm5hbWUuICfinI3vuI8gQnkge1VzZXJOYW1lfScgQnkgZGVmYXVsdFwiOlxyXG4gICAgXCLkvaDlj6/ku6XlnKjov5nph4zorr7nva7kvaDmg7PopoHnmoTku7vmhI/mlofmnKzvvIznlKgge1VzZXJOYW1lfSDmnaXlsZXnpLrkvaDnmoTnlKjmiLflkI3jgILpu5jorqTkuLogJ+Kcje+4jyBCeSB7VXNlck5hbWV9J1wiLFxyXG4gICdTYXZlIFNoYXJlZCBJbWFnZSBUbyBGb2xkZXIgRm9yIE1vYmlsZSc6ICflvZPlnKjnp7vliqjnq6/kuIrml7bkv53lrZjlm77niYfliLDmlofku7blpLknLFxyXG4gICdTYXZlIGltYWdlIHRvIGZvbGRlciBmb3IgbW9iaWxlLiBGYWxzZSBieSBEZWZhdWx0JzogJ+W9k+WcqOenu+WKqOerr+S4iuaXtu+8jOS/neWtmOeUn+aIkOeahOWbvueJh+WIsOaWh+S7tuWkuScsXHJcbiAgJ1NheSBUaGFuayBZb3UnOiAn5oSf6LCi5byA5Y+RJyxcclxuICBEb25hdGU6ICfmjZDotaAnLFxyXG4gICdJZiB5b3UgbGlrZSB0aGlzIHBsdWdpbiwgY29uc2lkZXIgZG9uYXRpbmcgdG8gc3VwcG9ydCBjb250aW51ZWQgZGV2ZWxvcG1lbnQ6JzpcclxuICAgICflpoLmnpzkvaDllpzmrKLov5nkuKrmj5Lku7bvvIzogIzkuJTkuZ/luIzmnJvnu5nmiJHkubDpuKHohb/vvIzpgqPkuYjlj6/ku6XogIPomZEgR2l0aHViIOmhtemdouWPs+i+ueeahCBTcG9uc29yficsXHJcbiAgJ0ZpbGUgTmFtZSBvZiBSZWN5Y2xlIEJpbic6ICflm57mlLbnq5nnmoTmlofku7blkI0nLFxyXG4gIFwiU2V0IHRoZSBmaWxlbmFtZSBmb3IgcmVjeWNsZSBiaW4uICdkZWxldGUnIEJ5IGRlZmF1bHRcIjogXCLnu5nlm57mlLbnq5norr7nva7kuIDkuKrmlofku7blkI3jgILpu5jorqTkuLonZGVsZXRlJ1wiLFxyXG4gICdGaWxlIE5hbWUgb2YgUXVlcnkgRmlsZSc6ICfmo4DntKLmlofku7bnmoTmlofku7blkI0nLFxyXG4gIFwiU2V0IHRoZSBmaWxlbmFtZSBmb3IgcXVlcnkgZmlsZS4gJ3F1ZXJ5JyBCeSBkZWZhdWx0XCI6IFwi6K6+572u5a2Y5pS+5qOA57Si5byP55qE5paH5Lu255qE5paH5Lu25ZCN44CC6buY6K6k5Li6J3F1ZXJ5J1wiLFxyXG4gICdVc2UgVGFncyBJbiBWYXVsdCc6ICfkvb/nlKjlnKjlupPlhoXnmoTmiYDmnInmoIfnrb4nLFxyXG4gICdVc2UgdGFncyBpbiB2YXVsdCByYXRoZXIgdGhhbiBvbmx5IGluIE1lbW9zLiBGYWxzZSBieSBkZWZhdWx0Lic6ICfkvb/nlKjlnKjlupPlhoXnmoTogIzkuI3mmK8gTWVtb3Mg5YaF55qE5qCH562+44CC6buY6K6k5YWz6ZetJyxcclxuICBcIkRvbid0IHN1cHBvcnQgd2ViIGltYWdlIHlldCwgcGxlYXNlIGlucHV0IGltYWdlIHBhdGggaW4gdmF1bHRcIjogJ+aaguS4jeaUr+aMgee9kee7nOWbvueJh++8jOivt+S9v+eUqOacrOWcsOWbvueJhycsXHJcbiAgJ1JlYWR5IHRvIGNvbnZlcnQgaW1hZ2UgaW50byBiYWNrZ3JvdW5kJzogJ+ato+WcqOWwhuWbvueJh+i9rOaNouS4uuiDjOaZr+WbvicsXHJcbiAgTGlzdDogJ+WIl+ihqCcsXHJcbiAgVGFzazogJ+S7u+WKoScsXHJcbiAgVG9wOiAn6aG26YOoJyxcclxuICBCb3R0b206ICflupXpg6gnLFxyXG4gIFRBRzogJ+agh+etvicsXHJcbiAgREFZOiAn5aSpJyxcclxuICBRVUVSWTogJ+ajgOe0ouW8jycsXHJcbiAgRURJVDogJ+e8lui+kScsXHJcbiAgUElOOiAn572u6aG2JyxcclxuICBVTlBJTjogJ+WPlua2iOe9rumhticsXHJcbiAgREVMRVRFOiAn5Yig6ZmkJyxcclxuICAnQ09ORklSTe+8gSc6ICfnoa7lrprliKDpmaQnLFxyXG4gICdDUkVBVEUgRklMVEVSJzogJ+WIm+W7uuajgOe0ouW8jycsXHJcbiAgU2V0dGluZ3M6ICforr7nva4nLFxyXG4gICdSZWN5Y2xlIGJpbic6ICflm57mlLbnq5knLFxyXG4gICdBYm91dCBNZSc6ICflhbPkuo4nLFxyXG4gICdGZXRjaGluZyBkYXRhLi4uJzogJ+iOt+WPluaVsOaNruS4rS4uLicsXHJcbiAgJ0hlcmUgaXMgTm8gWmV0dGVscy4nOiAn5rKh5pyJ5om+5YiwIG1lbW8nLFxyXG4gICdGcmVxdWVudGx5IFVzZWQgVGFncyc6ICfluLjnlKjmoIfnrb4nLFxyXG4gICdXaGF0IGRvIHlvdSB0aGluayBub3cuLi4nOiAn5L2g546w5Zyo5Zyo5oOz5LuA5LmI77yfJyxcclxuICBSRUFEOiAn6ZiF6K+7JyxcclxuICBNQVJLOiAn5byV55SoJyxcclxuICBTSEFSRTogJ+WIhuS6qycsXHJcbiAgU09VUkNFOiAn5p2l5rqQJyxcclxuICBSRVNUT1JFOiAn5oGi5aSNJyxcclxuICAnREVMRVRFIEFUJzogJ+WIoOmZpOS6jicsXHJcbiAgJ05vb29vcCEnOiAn5ZWl6YO95rKh5pyJ77yBJyxcclxuICAnQWxsIERhdGEgaXMgTG9hZGVkIPCfjoknOiAn5omA5pyJ5pWw5o2u6YO95Yqg6L295aW95ZWmIPCfjoknLFxyXG4gICdRdWljayBmaWx0ZXInOiAn5b+r6YCf562b6YCJJyxcclxuICBUWVBFOiAn57G75Z6LJyxcclxuICBMSU5LRUQ6ICfmnInpk77mjqUnLFxyXG4gICdOTyBUQUdTJzogJ+aXoOagh+etvicsXHJcbiAgJ0hBUyBMSU5LUyc6ICfmnInotoXpk77mjqUnLFxyXG4gICdIQVMgSU1BR0VTJzogJ+acieWbvueJhycsXHJcbiAgSU5DTFVERTogJ+WMheaLrCcsXHJcbiAgRVhDTFVERTogJ+aOkumZpCcsXHJcbiAgVEVYVDogJ+aWh+acrCcsXHJcbiAgSVM6ICfmmK8nLFxyXG4gIElTTk9UOiAn5LiN5pivJyxcclxuICBTRUxFQ1Q6ICfpgInmi6knLFxyXG4gICdBREQgRklMVEVSIFRFUk1TJzogJ+a3u+WKoOajgOe0ouadoeS7ticsXHJcbiAgRklMVEVSOiAn5qOA57Si5ZmoJyxcclxuICBUSVRMRTogJ+agh+mimCcsXHJcbiAgJ0NSRUFURSBRVUVSWSc6ICfliJvlu7rmo4DntKLlvI8nLFxyXG4gICdFRElUIFFVRVJZJzogJ+e8lui+keajgOe0ouW8jycsXHJcbiAgTUFUQ0g6ICfljLnphY0nLFxyXG4gIFRJTUVTOiAn5qyhJyxcclxuICAnU2hhcmUgTWVtbyBJbWFnZSc6ICfliIbkuqsgTWVtbyDlm77niYcnLFxyXG4gICfihpdDbGljayB0aGUgYnV0dG9uIHRvIHNhdmUnOiAn4oaX54K55Ye75Y+z5LiK6KeS55qE5oyJ6ZKu5p2l5L+d5a2YJyxcclxuICAnSW1hZ2UgaXMgZ2VuZXJhdGluZy4uLic6ICflm77niYfmraPlnKjnlJ/miJDkuK0uLi4nLFxyXG4gICdJbWFnZSBpcyBsb2FkaW5nLi4uJzogJ+WbvueJh+ato+WcqOWKoOi9veS4rS4uLicsXHJcbiAgJ/CfmJ8gQ2Fubm90IGxvYWQgaW1hZ2UsIGltYWdlIGxpbmsgbWF5YmUgYnJva2VuJzogJ/CfmJ8g5peg5rOV5Yqg6L295Zu+54mH77yM5Zu+54mH6ZO+5o6l5Lmf6K645LiN5a2Y5ZyoJyxcclxuICAnTG9hZGluZy4uLic6ICfliqrlipvliqDovb3kuK0uLi4nLFxyXG4gICdEYWlseSBNZW1vcyc6ICfmr4/ml6UgTWVtb3MnLFxyXG4gICdDQU5DRUwgRURJVCc6ICflj5bmtojnvJbovpEnLFxyXG4gICdMSU5LIFRPIFRIRSc6ICfpk77mjqXliLAnLFxyXG4gICdNb2JpbGUgT3B0aW9ucyc6ICfnp7vliqjnq6/pgInpobknLFxyXG4gICdFeHBlcmltZW50YWwgT3B0aW9ucyc6ICflrp7pqozmgKfpgInpobknLFxyXG4gICdCYWNrZ3JvdW5kIEltYWdlIGluIERhcmsgVGhlbWUnOiAn5rex6Imy5Li76aKY55qE6IOM5pmv5Zu+JyxcclxuICAnQmFja2dyb3VuZCBJbWFnZSBpbiBMaWdodCBUaGVtZSc6ICfmtYXoibLkuLvpopjnmoTog4zmma/lm74nLFxyXG4gICdTZXQgYmFja2dyb3VuZCBpbWFnZSBpbiBkYXJrIHRoZW1lLiBTZXQgc29tZXRoaW5nIGxpa2UgXCJEYWlseS9vbmUucG5nXCInOlxyXG4gICAgJ+iuvue9rua3seiJsuS4u+mimOeahOiDjOaZr+WbvuOAguivt+iuvue9ruexu+S8vFwiRGFpbHkvb25lLnBuZ1wi55qE6Lev5b6EJyxcclxuICAnU2V0IGJhY2tncm91bmQgaW1hZ2UgaW4gbGlnaHQgdGhlbWUuIFNldCBzb21ldGhpbmcgbGlrZSBcIkRhaWx5L29uZS5wbmdcIic6XHJcbiAgICAn6K6+572u5rWF6Imy5Li76aKY55qE6IOM5pmv5Zu+44CC6K+36K6+572u57G75Ly8XCJEYWlseS9vbmUucG5nXCLnmoTot6/lvoQnLFxyXG4gICdTZXQgZGVmYXVsdCBtZW1vIGNvbXBvc2l0aW9uLCB5b3Ugc2hvdWxkIHVzZSB7VElNRX0gYXMgXCJISDptbVwiIGFuZCB7Q09OVEVOVH0gYXMgY29udGVudC4gXCJ7VElNRX0ge0NPTlRFTlR9XCIgYnkgZGVmYXVsdCc6XHJcbiAgICAn6K6+572u6buY6K6kIE1lbW8g57uE5oiQ77yM5L2g5b+F6aG76KaB5L2/55SoIHtUSU1FfSDkvZzkuLogXCJISDptbVwiIOiAjOS4lOimgeiuvue9riB7Q09OVEVOVH0g5L2c5Li65YaF5a656K+G5Yir44CC6buY6K6k5oOF5Ya15LiL77yMIE1lbW8g5Z+65LqOIFwie1RJTUV9IHtDT05URU5UfVwiIOivhuWIqycsXHJcbiAgJ0RlZmF1bHQgTWVtbyBDb21wb3NpdGlvbic6ICfpu5jorqQgTWVtbyDnu4TmiJAnLFxyXG4gICdTaG93IFRhc2tzIExhYmVsJzogJ+WxleekuuS7u+WKoeagh+etvicsXHJcbiAgJ1Nob3cgdGFza3MgbGFiZWwgbmVhciB0aGUgdGltZSB0ZXh0LiBGYWxzZSBieSBkZWZhdWx0JzogJ+WcqCBNZW1vIOeahOaXtumXtOaXgeWxleekuuS7u+WKoeagh+etvuOAgum7mOiupOaDheWGteS4i+S4jeWxleekuicsXHJcbn07XHJcbiIsIi8vIOe5gemrlOS4reaWh1xyXG5cclxuZXhwb3J0IGRlZmF1bHQge307XHJcbiIsIi8vIENvZGUgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vdmFsZW50aW5lMTk1L29ic2lkaWFuLWFkbW9uaXRpb24vYmxvYi9tYXN0ZXIvc3JjL2xhbmcvaGVscGVycy50c1xyXG5cclxuaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmltcG9ydCBhciBmcm9tICcuL2xvY2FsZS9hcic7XHJcbmltcG9ydCBjeiBmcm9tICcuL2xvY2FsZS9jeic7XHJcbmltcG9ydCBkYSBmcm9tICcuL2xvY2FsZS9kYSc7XHJcbmltcG9ydCBkZSBmcm9tICcuL2xvY2FsZS9kZSc7XHJcbmltcG9ydCBlbiBmcm9tICcuL2xvY2FsZS9lbic7XHJcbmltcG9ydCBlbkdCIGZyb20gJy4vbG9jYWxlL2VuLWdiJztcclxuaW1wb3J0IGVzIGZyb20gJy4vbG9jYWxlL2VzJztcclxuaW1wb3J0IGZyIGZyb20gJy4vbG9jYWxlL2ZyJztcclxuaW1wb3J0IGhpIGZyb20gJy4vbG9jYWxlL2hpJztcclxuaW1wb3J0IGlkIGZyb20gJy4vbG9jYWxlL2lkJztcclxuaW1wb3J0IGl0IGZyb20gJy4vbG9jYWxlL2l0JztcclxuaW1wb3J0IGphIGZyb20gJy4vbG9jYWxlL2phJztcclxuaW1wb3J0IGtvIGZyb20gJy4vbG9jYWxlL2tvJztcclxuaW1wb3J0IG5sIGZyb20gJy4vbG9jYWxlL25sJztcclxuaW1wb3J0IG5vIGZyb20gJy4vbG9jYWxlL25vJztcclxuaW1wb3J0IHBsIGZyb20gJy4vbG9jYWxlL3BsJztcclxuaW1wb3J0IHB0IGZyb20gJy4vbG9jYWxlL3B0JztcclxuaW1wb3J0IHB0QlIgZnJvbSAnLi9sb2NhbGUvcHQtYnInO1xyXG5pbXBvcnQgcm8gZnJvbSAnLi9sb2NhbGUvcm8nO1xyXG5pbXBvcnQgcnUgZnJvbSAnLi9sb2NhbGUvcnUnO1xyXG5pbXBvcnQgdHIgZnJvbSAnLi9sb2NhbGUvdHInO1xyXG5pbXBvcnQgemhDTiBmcm9tICcuL2xvY2FsZS96aC1jbic7XHJcbmltcG9ydCB6aFRXIGZyb20gJy4vbG9jYWxlL3poLXR3JztcclxuXHJcbmNvbnN0IGxvY2FsZU1hcDoge1trOiBzdHJpbmddOiBQYXJ0aWFsPHR5cGVvZiBlbj59ID0ge1xyXG4gIGFyLFxyXG4gIGNzOiBjeixcclxuICBkYSxcclxuICBkZSxcclxuICBlbixcclxuICAnZW4tZ2InOiBlbkdCLFxyXG4gIGVzLFxyXG4gIGZyLFxyXG4gIGhpLFxyXG4gIGlkLFxyXG4gIGl0LFxyXG4gIGphLFxyXG4gIGtvLFxyXG4gIG5sLFxyXG4gIG5uOiBubyxcclxuICBwbCxcclxuICBwdCxcclxuICAncHQtYnInOiBwdEJSLFxyXG4gIHJvLFxyXG4gIHJ1LFxyXG4gIHRyLFxyXG4gICd6aC1jbic6IHpoQ04sXHJcbiAgJ3poLXR3JzogemhUVyxcclxufTtcclxuXHJcbmNvbnN0IGxvY2FsZSA9IGxvY2FsZU1hcFttb21lbnQubG9jYWxlKCldO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHQoc3RyOiBrZXlvZiB0eXBlb2YgZW4pOiBzdHJpbmcge1xyXG4gIHJldHVybiAobG9jYWxlICYmIGxvY2FsZVtzdHJdKSB8fCBlbltzdHJdO1xyXG59XHJcbiIsImltcG9ydCB7Zm9yd2FyZFJlZiwgUmVhY3ROb2RlLCB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VSZWYsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBUaW55VW5kbyBmcm9tICd0aW55LXVuZG8nO1xyXG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi8uLi9zdG9yZXMvYXBwQ29udGV4dCc7XHJcbmltcG9ydCB7c3RvcmFnZSwgcmVtb3ZlfSBmcm9tICcuLi8uLi9oZWxwZXJzL3N0b3JhZ2UnO1xyXG5pbXBvcnQgdXNlUmVmcmVzaCBmcm9tICcuLi8uLi9ob29rcy91c2VSZWZyZXNoJztcclxuaW1wb3J0IE9ubHkgZnJvbSAnLi4vY29tbW9uL09ubHlXaGVuJztcclxuaW1wb3J0ICcuLi8uLi9sZXNzL2VkaXRvci5sZXNzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IFJlYWN0VGV4dGFyZWFBdXRvY29tcGxldGUgZnJvbSAnQHdlYnNjb3BlaW8vcmVhY3QtdGV4dGFyZWEtYXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHt1c2VkVGFnc30gZnJvbSAnLi4vLi4vb2JDb21wb25lbnRzL29iVGFnU3VnZ2VzdGVyJztcclxuaW1wb3J0ICcuLi8uLi9sZXNzL3N1Z2dlc3QubGVzcyc7XHJcbmltcG9ydCB7Rm9jdXNPbkVkaXRvciwgU2F2ZU1lbW9CdXR0b25MYWJlbH0gZnJvbSAnLi4vLi4vbWVtb3MnO1xyXG5pbXBvcnQge2dldFN1Z2dlc3Rpb25zfSBmcm9tICcuLi8uLi9vYkNvbXBvbmVudHMvb2JGaWxlU3VnZ2VzdGVyJztcclxuaW1wb3J0IHtURmlsZX0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vLi4vc3RvcmVzL2FwcFN0b3JlJztcclxuaW1wb3J0IHt0fSBmcm9tICcuLi8uLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuXHJcbnR5cGUgSXRlbVByb3BzID0ge1xyXG4gIGVudGl0eToge1xyXG4gICAgY2hhcjogc3RyaW5nO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgZmlsZT86IFRGaWxlO1xyXG4gIH07XHJcbn07XHJcblxyXG50eXBlIExvYWRpbmdQcm9wcyA9IHtcclxuICBkYXRhOiBBcnJheTx7bmFtZTogc3RyaW5nOyBjaGFyOiBzdHJpbmd9PjtcclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRWRpdG9yUmVmQWN0aW9ucyB7XHJcbiAgZWxlbWVudDogSFRNTFRleHRBcmVhRWxlbWVudDtcclxuICBmb2N1czogRnVuY3Rpb25UeXBlO1xyXG4gIGluc2VydFRleHQ6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XHJcbiAgc2V0Q29udGVudDogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcclxuICBnZXRDb250ZW50OiAoKSA9PiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBFZGl0b3JQcm9wcyB7XHJcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XHJcbiAgaW5pdGlhbENvbnRlbnQ6IHN0cmluZztcclxuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gIHNob3dDb25maXJtQnRuOiBib29sZWFuO1xyXG4gIHNob3dDYW5jZWxCdG46IGJvb2xlYW47XHJcbiAgdG9vbHM/OiBSZWFjdE5vZGU7XHJcbiAgb25Db25maXJtQnRuQ2xpY2s6IChjb250ZW50OiBzdHJpbmcpID0+IHZvaWQ7XHJcbiAgb25DYW5jZWxCdG5DbGljazogKCkgPT4gdm9pZDtcclxuICBvbkNvbnRlbnRDaGFuZ2U6IChjb250ZW50OiBzdHJpbmcpID0+IHZvaWQ7XHJcbn1cclxuXHJcbi8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXHJcbmNvbnN0IFRJdGVtID0gKHtlbnRpdHk6IHtuYW1lLCBjaGFyLCBmaWxlfX06IEl0ZW1Qcm9wcykgPT4ge1xyXG4gIHJldHVybiA8ZGl2PntgJHtjaGFyfWB9PC9kaXY+O1xyXG59O1xyXG4vL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG5jb25zdCBMb2FkaW5nID0gKHtkYXRhfTogTG9hZGluZ1Byb3BzKSA9PiB7XHJcbiAgcmV0dXJuIDxkaXY+TG9hZGluZzwvZGl2PjtcclxufTtcclxuXHJcbmV4cG9ydCBsZXQgZWRpdG9ySW5wdXQ6IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XHJcbmxldCBhY3R1YWxUb2tlbjogc3RyaW5nO1xyXG5cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L2Rpc3BsYXktbmFtZVxyXG5jb25zdCBFZGl0b3IgPSBmb3J3YXJkUmVmKChwcm9wczogRWRpdG9yUHJvcHMsIHJlZjogUmVhY3QuRm9yd2FyZGVkUmVmPEVkaXRvclJlZkFjdGlvbnM+KSA9PiB7XHJcbiAgY29uc3Qge1xyXG4gICAgZ2xvYmFsU3RhdGU6IHt1c2VUaW55VW5kb0hpc3RvcnlDYWNoZX0sXHJcbiAgfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XHJcbiAgY29uc3Qge1xyXG4gICAgY2xhc3NOYW1lLFxyXG4gICAgaW5pdGlhbENvbnRlbnQsXHJcbiAgICBwbGFjZWhvbGRlcixcclxuICAgIHNob3dDb25maXJtQnRuLFxyXG4gICAgc2hvd0NhbmNlbEJ0bixcclxuICAgIG9uQ29uZmlybUJ0bkNsaWNrOiBoYW5kbGVDb25maXJtQnRuQ2xpY2tDYWxsYmFjayxcclxuICAgIG9uQ2FuY2VsQnRuQ2xpY2s6IGhhbmRsZUNhbmNlbEJ0bkNsaWNrQ2FsbGJhY2ssXHJcbiAgICBvbkNvbnRlbnRDaGFuZ2U6IGhhbmRsZUNvbnRlbnRDaGFuZ2VDYWxsYmFjayxcclxuICB9ID0gcHJvcHM7XHJcbiAgY29uc3QgZWRpdG9yUmVmID0gdXNlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KG51bGwpO1xyXG4gIGNvbnN0IHRpbnlVbmRvUmVmID0gdXNlUmVmPFRpbnlVbmRvIHwgbnVsbD4obnVsbCk7XHJcbiAgY29uc3QgcmVmcmVzaCA9IHVzZVJlZnJlc2goKTtcclxuICAvLyBjb25zdCBbdmFsdWUsIHNldFZhbHVlXSA9IHVzZVN0YXRlKFwiXCIpXHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaW5pdGlhbENvbnRlbnQpIHtcclxuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUgPSBpbml0aWFsQ29udGVudDtcclxuICAgICAgcmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmICh1c2VUaW55VW5kb0hpc3RvcnlDYWNoZSkge1xyXG4gICAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB7dGlueVVuZG9BY3Rpb25zQ2FjaGUsIHRpbnlVbmRvSW5kZXhDYWNoZX0gPSBzdG9yYWdlLmdldChbJ3RpbnlVbmRvQWN0aW9uc0NhY2hlJywgJ3RpbnlVbmRvSW5kZXhDYWNoZSddKTtcclxuXHJcbiAgICAgIHRpbnlVbmRvUmVmLmN1cnJlbnQgPSBuZXcgVGlueVVuZG8oZWRpdG9yUmVmLmN1cnJlbnQsIHtcclxuICAgICAgICBpbnRlcnZhbDogNTAwMCxcclxuICAgICAgICBpbml0aWFsQWN0aW9uczogdGlueVVuZG9BY3Rpb25zQ2FjaGUsXHJcbiAgICAgICAgaW5pdGlhbEluZGV4OiB0aW55VW5kb0luZGV4Q2FjaGUsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGlueVVuZG9SZWYuY3VycmVudC5zdWJzY3JpYmUoKGFjdGlvbnMsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgc3RvcmFnZS5zZXQoe1xyXG4gICAgICAgICAgdGlueVVuZG9BY3Rpb25zQ2FjaGU6IGFjdGlvbnMsXHJcbiAgICAgICAgICB0aW55VW5kb0luZGV4Q2FjaGU6IGluZGV4LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgdGlueVVuZG9SZWYuY3VycmVudD8uZGVzdHJveSgpO1xyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGlueVVuZG9SZWYuY3VycmVudD8uZGVzdHJveSgpO1xyXG4gICAgICB0aW55VW5kb1JlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgc3RvcmFnZS5yZW1vdmUoWyd0aW55VW5kb0FjdGlvbnNDYWNoZScsICd0aW55VW5kb0luZGV4Q2FjaGUnXSk7XHJcbiAgICB9XHJcbiAgfSwgW3VzZVRpbnlVbmRvSGlzdG9yeUNhY2hlXSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAoZWRpdG9yUmVmLmN1cnJlbnQpIHtcclxuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xyXG4gICAgICBlZGl0b3JSZWYuY3VycmVudC5zdHlsZS5oZWlnaHQgPSAoZWRpdG9yUmVmLmN1cnJlbnQuc2Nyb2xsSGVpZ2h0ID8/IDApICsgJ3B4JztcclxuICAgIH1cclxuICB9LCBbZWRpdG9yUmVmLmN1cnJlbnQ/LnZhbHVlXSk7XHJcblxyXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUoXHJcbiAgICByZWYsXHJcbiAgICAoKSA9PiAoe1xyXG4gICAgICBlbGVtZW50OiBlZGl0b3JSZWYuY3VycmVudCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50LFxyXG4gICAgICBmb2N1czogKCkgPT4ge1xyXG4gICAgICAgIGlmIChGb2N1c09uRWRpdG9yKSB7XHJcbiAgICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGluc2VydFRleHQ6IChyYXdUZXh0OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwcmV2VmFsdWUgPSBlZGl0b3JSZWYuY3VycmVudC52YWx1ZTtcclxuICAgICAgICBlZGl0b3JSZWYuY3VycmVudC52YWx1ZSA9XHJcbiAgICAgICAgICBwcmV2VmFsdWUuc2xpY2UoMCwgZWRpdG9yUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQpICtcclxuICAgICAgICAgIHJhd1RleHQgK1xyXG4gICAgICAgICAgcHJldlZhbHVlLnNsaWNlKGVkaXRvclJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0KTtcclxuICAgICAgICBoYW5kbGVDb250ZW50Q2hhbmdlQ2FsbGJhY2soZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUpO1xyXG4gICAgICAgIHJlZnJlc2goKTtcclxuICAgICAgfSxcclxuICAgICAgc2V0Q29udGVudDogKHRleHQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmIChlZGl0b3JSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUgPSB0ZXh0O1xyXG4gICAgICAgICAgaGFuZGxlQ29udGVudENoYW5nZUNhbGxiYWNrKGVkaXRvclJlZi5jdXJyZW50LnZhbHVlKTtcclxuICAgICAgICAgIHJlZnJlc2goKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGdldENvbnRlbnQ6ICgpOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIHJldHVybiBlZGl0b3JSZWYuY3VycmVudD8udmFsdWUgPz8gJyc7XHJcbiAgICAgIH0sXHJcbiAgICB9KSxcclxuICAgIFtdLFxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUluc2VydFRyaWdnZXIgPSAoZXZlbnQ6IHtjdXJyZW50VHJpZ2dlcjogc3RyaW5nOyBpdGVtOiBhbnl9KSA9PiB7XHJcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7ZmlsZU1hbmFnZXJ9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG5cclxuICAgIGlmIChldmVudC5jdXJyZW50VHJpZ2dlciA9PT0gJyMnKSB7XHJcbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IGVkaXRvclJlZi5jdXJyZW50LnZhbHVlO1xyXG4gICAgICBsZXQgcmVtb3ZlQ2hhck51bTtcclxuICAgICAgaWYgKGFjdHVhbFRva2VuICE9PSBudWxsICYmIGFjdHVhbFRva2VuICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZW1vdmVDaGFyTnVtID0gYWN0dWFsVG9rZW4ubGVuZ3RoO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlbW92ZUNoYXJOdW0gPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBiZWhpbmRDaGFyTnVtID0gZWRpdG9yUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldlZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKCEvXFxzL2cudGVzdChwcmV2VmFsdWVbYmVoaW5kQ2hhck51bV0pKSB7XHJcbiAgICAgICAgICBiZWhpbmRDaGFyTnVtKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBlZGl0b3JSZWYuY3VycmVudC52YWx1ZSA9XHJcbiAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgICAgICBwcmV2VmFsdWUuc2xpY2UoMCwgZWRpdG9yUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQgLSByZW1vdmVDaGFyTnVtKSArXHJcbiAgICAgICAgZXZlbnQuaXRlbS5jaGFyICtcclxuICAgICAgICBwcmV2VmFsdWUuc2xpY2UoYmVoaW5kQ2hhck51bSk7XHJcbiAgICAgIGhhbmRsZUNvbnRlbnRDaGFuZ2VDYWxsYmFjayhlZGl0b3JSZWYuY3VycmVudC52YWx1ZSk7XHJcbiAgICAgIHJlZnJlc2goKTtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQuY3VycmVudFRyaWdnZXIgPT09ICdbWycpIHtcclxuICAgICAgY29uc3QgZmlsZVBhdGggPSBmaWxlTWFuYWdlci5nZW5lcmF0ZU1hcmtkb3duTGluayhldmVudC5pdGVtLmZpbGUsIGV2ZW50Lml0ZW0uZmlsZS5wYXRoLCAnJywgJycpO1xyXG5cclxuICAgICAgY29uc3QgcHJldlZhbHVlID0gZWRpdG9yUmVmLmN1cnJlbnQudmFsdWU7XHJcbiAgICAgIGxldCByZW1vdmVDaGFyTnVtO1xyXG4gICAgICBpZiAoYWN0dWFsVG9rZW4gIT09IG51bGwgJiYgYWN0dWFsVG9rZW4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmIChmaWxlUGF0aC5jb250YWlucygnW1snKSkge1xyXG4gICAgICAgICAgcmVtb3ZlQ2hhck51bSA9IGFjdHVhbFRva2VuLmxlbmd0aCArIDE7XHJcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5pdGVtLmZpbGUuZXh0ZW5zaW9uICE9PSAnbWQnKSB7XHJcbiAgICAgICAgICByZW1vdmVDaGFyTnVtID0gYWN0dWFsVG9rZW4ubGVuZ3RoICsgMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVtb3ZlQ2hhck51bSA9IGFjdHVhbFRva2VuLmxlbmd0aCArIDI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlbW92ZUNoYXJOdW0gPSAyO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBiZWhpbmRDaGFyTnVtID0gZWRpdG9yUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldlZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKCEvXFxzL2cudGVzdChwcmV2VmFsdWVbYmVoaW5kQ2hhck51bV0pKSB7XHJcbiAgICAgICAgICBiZWhpbmRDaGFyTnVtKys7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBlZGl0b3JSZWYuY3VycmVudC52YWx1ZSA9XHJcbiAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgICAgICBwcmV2VmFsdWUuc2xpY2UoMCwgZWRpdG9yUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQgLSByZW1vdmVDaGFyTnVtKSArXHJcbiAgICAgICAgZmlsZVBhdGggK1xyXG4gICAgICAgIHByZXZWYWx1ZS5zbGljZShiZWhpbmRDaGFyTnVtKTtcclxuICAgICAgaGFuZGxlQ29udGVudENoYW5nZUNhbGxiYWNrKGVkaXRvclJlZi5jdXJyZW50LnZhbHVlKTtcclxuICAgICAgcmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUVkaXRvcklucHV0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgaGFuZGxlQ29udGVudENoYW5nZUNhbGxiYWNrKGVkaXRvclJlZi5jdXJyZW50Py52YWx1ZSA/PyAnJyk7XHJcbiAgICByZWZyZXNoKCk7XHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBoYW5kbGVFZGl0b3JLZXlEb3duID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxUZXh0QXJlYUVsZW1lbnQ+KSA9PiB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VudGVyJykge1xyXG4gICAgICBpZiAoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgaGFuZGxlQ29tbW9uQ29uZmlybUJ0bkNsaWNrKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJlZnJlc2goKTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUNvbW1vbkNvbmZpcm1CdG5DbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXRvclJlZi5jdXJyZW50LnZhbHVlID0gZ2V0RWRpdG9yQ29udGVudENhY2hlKCk7XHJcblxyXG4gICAgaGFuZGxlQ29uZmlybUJ0bkNsaWNrQ2FsbGJhY2soZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUpO1xyXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUgPSAnJztcclxuXHJcbiAgICByZWZyZXNoKCk7XHJcbiAgICAvLyBBZnRlciBjb25maXJtIGJ0biBjbGlja2VkLCB0aW55LXVuZG8gc2hvdWxkIHJlc2V0IHN0YXRlKGNsZWFyIGFjdGlvbnMgYW5kIGluZGV4KVxyXG4gICAgdGlueVVuZG9SZWYuY3VycmVudD8ucmVzZXRTdGF0ZSgpO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlQ29tbW9uQ2FuY2VsQnRuQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICBoYW5kbGVDYW5jZWxCdG5DbGlja0NhbGxiYWNrKCk7XHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBnZXRFZGl0b3JDb250ZW50Q2FjaGUgPSAoKTogc3RyaW5nID0+IHtcclxuICAgIHJldHVybiBzdG9yYWdlLmdldChbJ2VkaXRvckNvbnRlbnRDYWNoZSddKS5lZGl0b3JDb250ZW50Q2FjaGUgPz8gJyc7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgZ2V0RWRpdG9yQ29udGVudCA9ICgpOiBzdHJpbmcgPT4ge1xyXG4gICAgaWYgKCFlZGl0b3JSZWYuY3VycmVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQudmFsdWUgPSBnZXRFZGl0b3JDb250ZW50Q2FjaGUoKTtcclxuICAgIC8vIGlmKCBGb2N1c09uRWRpdG9yICl7XHJcbiAgICAvLyAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHJldHVybiBlZGl0b3JSZWYuY3VycmVudC52YWx1ZTtcclxuICB9O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9eydjb21tb24tZWRpdG9yLXdyYXBwZXIgJyArIGNsYXNzTmFtZX0+XHJcbiAgICAgIDxSZWFjdFRleHRhcmVhQXV0b2NvbXBsZXRlXHJcbiAgICAgICAgLy8gYXV0b0ZvY3VzXHJcbiAgICAgICAgY2xhc3NOYW1lPVwiY29tbW9uLWVkaXRvci1pbnB1dGVyIHNjcm9sbFwiXHJcbiAgICAgICAgbG9hZGluZ0NvbXBvbmVudD17TG9hZGluZ31cclxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XHJcbiAgICAgICAgbW92ZVBvcHVwQXNZb3VUeXBlPXt0cnVlfVxyXG4gICAgICAgIC8vIHJlbmRlclRvQm9keT17dHJ1ZX1cclxuXHJcbiAgICAgICAgcmVmPXsocnRhKSA9PiB7XHJcbiAgICAgICAgICBydGEgPSBydGE7XHJcbiAgICAgICAgfX1cclxuICAgICAgICB2YWx1ZT17Z2V0RWRpdG9yQ29udGVudCgpfVxyXG4gICAgICAgIGlubmVyUmVmPXsodGV4dGFyZWEpID0+IHtcclxuICAgICAgICAgIGVkaXRvclJlZi5jdXJyZW50ID0gdGV4dGFyZWE7XHJcbiAgICAgICAgfX1cclxuICAgICAgICBvbklucHV0PXtoYW5kbGVFZGl0b3JJbnB1dH1cclxuICAgICAgICBvbktleURvd249e2hhbmRsZUVkaXRvcktleURvd259XHJcbiAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgIG1pbkhlaWdodDogNDgsXHJcbiAgICAgICAgfX1cclxuICAgICAgICBkcm9wZG93blN0eWxlPXt7XHJcbiAgICAgICAgICBtaW5XaWR0aDogMTgwLFxyXG4gICAgICAgICAgbWF4SGVpZ2h0OiAyNTAsXHJcbiAgICAgICAgICBvdmVyZmxvd1k6ICdhdXRvJyxcclxuICAgICAgICB9fVxyXG4gICAgICAgIG1pbkNoYXI9ezB9XHJcbiAgICAgICAgb25JdGVtU2VsZWN0ZWQ9e2hhbmRsZUluc2VydFRyaWdnZXJ9XHJcbiAgICAgICAgc2Nyb2xsVG9JdGVtPXt0cnVlfVxyXG4gICAgICAgIHRyaWdnZXI9e3tcclxuICAgICAgICAgICcjJzoge1xyXG4gICAgICAgICAgICBkYXRhUHJvdmlkZXI6ICh0b2tlbikgPT4ge1xyXG4gICAgICAgICAgICAgIGFjdHVhbFRva2VuID0gdG9rZW47XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHVzZWRUYWdzKHRva2VuKS5tYXAoKHtuYW1lLCBjaGFyfSkgPT4gKHtuYW1lLCBjaGFyfSkpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgICAgICBjb21wb25lbnQ6IFRJdGVtLFxyXG4gICAgICAgICAgICBhZnRlcldoaXRlc3BhY2U6IHRydWUsXHJcbiAgICAgICAgICAgIG91dHB1dDogKGl0ZW0pID0+IGl0ZW0uY2hhcixcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAnW1snOiB7XHJcbiAgICAgICAgICAgIGRhdGFQcm92aWRlcjogKHRva2VuKSA9PiB7XHJcbiAgICAgICAgICAgICAgYWN0dWFsVG9rZW4gPSB0b2tlbjtcclxuICAgICAgICAgICAgICByZXR1cm4gZ2V0U3VnZ2VzdGlvbnModG9rZW4pXHJcbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgMTApXHJcbiAgICAgICAgICAgICAgICAubWFwKCh7bmFtZSwgY2hhciwgZmlsZX0pID0+ICh7bmFtZSwgY2hhciwgZmlsZX0pKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgICAgICAgICAgY29tcG9uZW50OiBUSXRlbSxcclxuICAgICAgICAgICAgYWZ0ZXJXaGl0ZXNwYWNlOiB0cnVlLFxyXG4gICAgICAgICAgICBvdXRwdXQ6IChpdGVtKSA9PiBpdGVtLmNoYXIsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgLy8gXCJbW1wiOiB7XHJcbiAgICAgICAgICAvLyAgIGRhdGFQcm92aWRlcjogdG9rZW4gPT4ge1xyXG4gICAgICAgICAgLy8gICAgIGFjdHVhbFRva2VuID0gdG9rZW47XHJcbiAgICAgICAgICAvLyAgICAgcmV0dXJuIHVzZWRUYWdzKHRva2VuKVxyXG4gICAgICAgICAgLy8gICAgICAgLnNsaWNlKDAsIDEwKVxyXG4gICAgICAgICAgLy8gICAgICAgLm1hcCgoeyBuYW1lLCBjaGFyIH0pID0+ICh7IG5hbWUsIGNoYXIgfSkpO1xyXG4gICAgICAgICAgLy8gICB9LFxyXG4gICAgICAgICAgLy8gICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgICAgLy8gICBjb21wb25lbnQ6IEl0ZW0sXHJcbiAgICAgICAgICAvLyAgIGFmdGVyV2hpdGVzcGFjZTogdHJ1ZSxcclxuICAgICAgICAgIC8vICAgb3V0cHV0OiAoaXRlbSwgdHJpZ2dlcikgPT4gaXRlbS5jaGFyLFxyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgIH19XHJcbiAgICAgIC8+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29tbW9uLXRvb2xzLXdyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbW1vbi10b29scy1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxPbmx5IHdoZW49e3Byb3BzLnRvb2xzICE9PSB1bmRlZmluZWR9Pntwcm9wcy50b29sc308L09ubHk+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJidG5zLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPE9ubHkgd2hlbj17c2hvd0NhbmNlbEJ0bn0+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYWN0aW9uLWJ0biBjYW5jZWwtYnRuXCIgb25DbGljaz17aGFuZGxlQ29tbW9uQ2FuY2VsQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICAgIHt0KCdDQU5DRUwgRURJVCcpfVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvT25seT5cclxuICAgICAgICAgIDxPbmx5IHdoZW49e3Nob3dDb25maXJtQnRufT5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFjdGlvbi1idG4gY29uZmlybS1idG5cIlxyXG4gICAgICAgICAgICAgIGRpc2FibGVkPXshZWRpdG9yUmVmLmN1cnJlbnQ/LnZhbHVlfVxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNvbW1vbkNvbmZpcm1CdG5DbGlja31cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHtTYXZlTWVtb0J1dHRvbkxhYmVsfVxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb24tdGV4dFwiPuKcje+4jzwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L09ubHk+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBFZGl0b3I7XHJcbiIsIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuIiwiZnVuY3Rpb24gY2FuVXNlRE9NKCkge1xuICByZXR1cm4gISEodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xufVxuXG5leHBvcnQgeyBjYW5Vc2VET00gfTtcbiIsImltcG9ydCB7IHVzZUxheW91dEVmZmVjdCwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2FuVXNlRE9NIH0gZnJvbSAnLi4vLi4vY2FuLXVzZS1kb20vZGlzdC9yZWFjaC11dGlscy1jYW4tdXNlLWRvbS5lc20uanMnO1xuXG4vKipcbiAqIFJlYWN0IGN1cnJlbnRseSB0aHJvd3MgYSB3YXJuaW5nIHdoZW4gdXNpbmcgdXNlTGF5b3V0RWZmZWN0IG9uIHRoZSBzZXJ2ZXIuIFRvXG4gKiBnZXQgYXJvdW5kIGl0LCB3ZSBjYW4gY29uZGl0aW9uYWxseSB1c2VFZmZlY3Qgb24gdGhlIHNlcnZlciAobm8tb3ApIGFuZFxuICogdXNlTGF5b3V0RWZmZWN0IGluIHRoZSBicm93c2VyLiBXZSBvY2Nhc2lvbmFsbHkgbmVlZCB1c2VMYXlvdXRFZmZlY3QgdG9cbiAqIGVuc3VyZSB3ZSBkb24ndCBnZXQgYSByZW5kZXIgZmxhc2ggZm9yIGNlcnRhaW4gb3BlcmF0aW9ucywgYnV0IHdlIG1heSBhbHNvXG4gKiBuZWVkIGFmZmVjdGVkIGNvbXBvbmVudHMgdG8gcmVuZGVyIG9uIHRoZSBzZXJ2ZXIuIE9uZSBleGFtcGxlIGlzIHdoZW4gc2V0dGluZ1xuICogYSBjb21wb25lbnQncyBkZXNjZW5kYW50cyB0byByZXRyaWV2ZSB0aGVpciBpbmRleCB2YWx1ZXMuXG4gKlxuICogSW1wb3J0YW50IHRvIG5vdGUgdGhhdCB1c2luZyB0aGlzIGhvb2sgYXMgYW4gZXNjYXBlIGhhdGNoIHdpbGwgYnJlYWsgdGhlXG4gKiBlc2xpbnQgZGVwZW5kZW5jeSB3YXJuaW5ncyB1bmxlc3MgeW91IHJlbmFtZSB0aGUgaW1wb3J0IHRvIGB1c2VMYXlvdXRFZmZlY3RgLlxuICogVXNlIHNwYXJpbmdseSBvbmx5IHdoZW4gdGhlIGVmZmVjdCB3b24ndCBlZmZlY3QgdGhlIHJlbmRlcmVkIEhUTUwgdG8gYXZvaWRcbiAqIGFueSBzZXJ2ZXIvY2xpZW50IG1pc21hdGNoLlxuICpcbiAqIElmIGEgdXNlTGF5b3V0RWZmZWN0IGlzIG5lZWRlZCBhbmQgdGhlIHJlc3VsdCB3b3VsZCBjcmVhdGUgYSBtaXNtYXRjaCwgaXQnc1xuICogbGlrZWx5IHRoYXQgdGhlIGNvbXBvbmVudCBpbiBxdWVzdGlvbiBzaG91bGRuJ3QgYmUgcmVuZGVyZWQgb24gdGhlIHNlcnZlciBhdFxuICogYWxsLCBzbyBhIGJldHRlciBhcHByb2FjaCB3b3VsZCBiZSB0byBsYXppbHkgcmVuZGVyIHRob3NlIGluIGEgcGFyZW50XG4gKiBjb21wb25lbnQgYWZ0ZXIgY2xpZW50LXNpZGUgaHlkcmF0aW9uLlxuICpcbiAqIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2dhZWFyb24vZTdkOTdjZGYzOGEyOTA3OTI0ZWExMmU0ZWJkZjNjODVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3JlYWN0LXJlZHV4L2Jsb2IvbWFzdGVyL3NyYy91dGlscy91c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0LmpzXG4gKlxuICogQHBhcmFtIGVmZmVjdFxuICogQHBhcmFtIGRlcHNcbiAqL1xuXG52YXIgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IC8qI19fUFVSRV9fKi9jYW5Vc2VET00oKSA/IHVzZUxheW91dEVmZmVjdCA6IHVzZUVmZmVjdDtcblxuZXhwb3J0IHsgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCB9O1xuIiwiaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICdAcmVhY2gvdXRpbHMvdXNlLWlzb21vcnBoaWMtbGF5b3V0LWVmZmVjdCc7XG5cbi8qXG4gKiBXZWxjb21lIHRvIEByZWFjaC9hdXRvLWlkIVxuXG4gKiBMZXQncyBzZWUgaWYgd2UgY2FuIG1ha2Ugc2Vuc2Ugb2Ygd2h5IHRoaXMgaG9vayBleGlzdHMgYW5kIGl0c1xuICogaW1wbGVtZW50YXRpb24uXG4gKlxuICogU29tZSBiYWNrZ3JvdW5kOlxuICogICAxLiBBY2Nlc3NpYmlsaXR5IEFQSXMgcmVseSBoZWF2aWx5IG9uIGVsZW1lbnQgSURzXG4gKiAgIDIuIFJlcXVpcmluZyBkZXZlbG9wZXJzIHRvIHB1dCBJRHMgb24gZXZlcnkgZWxlbWVudCBpbiBSZWFjaCBVSSBpcyBib3RoXG4gKiAgICAgIGN1bWJlcnNvbWUgYW5kIGVycm9yLXByb25lXG4gKiAgIDMuIFdpdGggYSBjb21wb25lbnQgbW9kZWwsIHdlIGNhbiBnZW5lcmF0ZSBJRHMgZm9yIHRoZW0hXG4gKlxuICogU29sdXRpb24gMTogR2VuZXJhdGUgcmFuZG9tIElEcy5cbiAqXG4gKiBUaGlzIHdvcmtzIGdyZWF0IGFzIGxvbmcgYXMgeW91IGRvbid0IHNlcnZlciByZW5kZXIgeW91ciBhcHAuIFdoZW4gUmVhY3QgKGluXG4gKiB0aGUgY2xpZW50KSB0cmllcyB0byByZXVzZSB0aGUgbWFya3VwIGZyb20gdGhlIHNlcnZlciwgdGhlIElEcyB3b24ndCBtYXRjaFxuICogYW5kIFJlYWN0IHdpbGwgdGhlbiByZWNyZWF0ZSB0aGUgZW50aXJlIERPTSB0cmVlLlxuICpcbiAqIFNvbHV0aW9uIDI6IEluY3JlbWVudCBhbiBpbnRlZ2VyXG4gKlxuICogVGhpcyBzb3VuZHMgZ3JlYXQuIFNpbmNlIHdlJ3JlIHJlbmRlcmluZyB0aGUgZXhhY3Qgc2FtZSB0cmVlIG9uIHRoZSBzZXJ2ZXJcbiAqIGFuZCBjbGllbnQsIHdlIGNhbiBpbmNyZW1lbnQgYSBjb3VudGVyIGFuZCBnZXQgYSBkZXRlcm1pbmlzdGljIHJlc3VsdCBiZXR3ZWVuXG4gKiBjbGllbnQgYW5kIHNlcnZlci4gQWxzbywgSlMgaW50ZWdlcnMgY2FuIGdvIHVwIHRvIG5pbmUtcXVhZHJpbGxpb24uIEknbVxuICogcHJldHR5IHN1cmUgdGhlIHRhYiB3aWxsIGJlIGNsb3NlZCBiZWZvcmUgYW4gYXBwIG5ldmVyIG5lZWRzXG4gKiAxMCBxdWFkcmlsbGlvbiBJRHMhXG4gKlxuICogUHJvYmxlbSBzb2x2ZWQsIHJpZ2h0P1xuICpcbiAqIEFoLCBidXQgdGhlcmUncyBhIGNhdGNoISBSZWFjdCdzIGNvbmN1cnJlbnQgcmVuZGVyaW5nIG1ha2VzIHRoaXMgYXBwcm9hY2hcbiAqIG5vbi1kZXRlcm1pbmlzdGljLiBXaGlsZSB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgd2lsbCBlbmQgdXAgd2l0aCB0aGUgc2FtZVxuICogZWxlbWVudHMgaW4gdGhlIGVuZCwgZGVwZW5kaW5nIG9uIHN1c3BlbnNlIGJvdW5kYXJpZXMgKGFuZCBwb3NzaWJseSBzb21lIHVzZXJcbiAqIGlucHV0IGR1cmluZyB0aGUgaW5pdGlhbCByZW5kZXIpIHRoZSBpbmNyZW1lbnRpbmcgaW50ZWdlcnMgd29uJ3QgYWx3YXlzIG1hdGNoXG4gKiB1cC5cbiAqXG4gKiBTb2x1dGlvbiAzOiBEb24ndCB1c2UgSURzIGF0IGFsbCBvbiB0aGUgc2VydmVyOyBwYXRjaCBhZnRlciBmaXJzdCByZW5kZXIuXG4gKlxuICogV2hhdCB3ZSd2ZSBkb25lIGhlcmUgaXMgc29sdXRpb24gMiB3aXRoIHNvbWUgdHJpY2tzLiBXaXRoIHRoaXMgYXBwcm9hY2gsIHRoZVxuICogSUQgcmV0dXJuZWQgaXMgYW4gZW1wdHkgc3RyaW5nIG9uIHRoZSBmaXJzdCByZW5kZXIuIFRoaXMgd2F5IHRoZSBzZXJ2ZXIgYW5kXG4gKiBjbGllbnQgaGF2ZSB0aGUgc2FtZSBtYXJrdXAgbm8gbWF0dGVyIGhvdyB3aWxkIHRoZSBjb25jdXJyZW50IHJlbmRlcmluZyBtYXlcbiAqIGhhdmUgZ290dGVuLlxuICpcbiAqIEFmdGVyIHRoZSByZW5kZXIsIHdlIHBhdGNoIHVwIHRoZSBjb21wb25lbnRzIHdpdGggYW4gaW5jcmVtZW50ZWQgSUQuIFRoaXNcbiAqIGNhdXNlcyBhIGRvdWJsZSByZW5kZXIgb24gYW55IGNvbXBvbmVudHMgd2l0aCBgdXNlSWRgLiBTaG91bGRuJ3QgYmUgYSBwcm9ibGVtXG4gKiBzaW5jZSB0aGUgY29tcG9uZW50cyB1c2luZyB0aGlzIGhvb2sgc2hvdWxkIGJlIHNtYWxsLCBhbmQgd2UncmUgb25seSB1cGRhdGluZ1xuICogdGhlIElEIGF0dHJpYnV0ZSBvbiB0aGUgRE9NLCBub3RoaW5nIGJpZyBpcyBoYXBwZW5pbmcuXG4gKlxuICogSXQgZG9lc24ndCBoYXZlIHRvIGJlIGFuIGluY3JlbWVudGVkIG51bWJlciwgdGhvdWdoLS13ZSBjb3VsZCBkbyBnZW5lcmF0ZVxuICogcmFuZG9tIHN0cmluZ3MgaW5zdGVhZCwgYnV0IGluY3JlbWVudGluZyBhIG51bWJlciBpcyBwcm9iYWJseSB0aGUgY2hlYXBlc3RcbiAqIHRoaW5nIHdlIGNhbiBkby5cbiAqXG4gKiBBZGRpdGlvbmFsbHksIHdlIG9ubHkgZG8gdGhpcyBwYXRjaHVwIG9uIHRoZSB2ZXJ5IGZpcnN0IGNsaWVudCByZW5kZXIgZXZlci5cbiAqIEFueSBjYWxscyB0byBgdXNlSWRgIHRoYXQgaGFwcGVuIGR5bmFtaWNhbGx5IGluIHRoZSBjbGllbnQgd2lsbCBiZVxuICogcG9wdWxhdGVkIGltbWVkaWF0ZWx5IHdpdGggYSB2YWx1ZS4gU28sIHdlIG9ubHkgZ2V0IHRoZSBkb3VibGUgcmVuZGVyIGFmdGVyXG4gKiBzZXJ2ZXIgaHlkcmF0aW9uIGFuZCBuZXZlciBhZ2FpbiwgU08gQkFDSyBPRkYgQUxSSUdIVD9cbiAqL1xudmFyIHNlcnZlckhhbmRvZmZDb21wbGV0ZSA9IGZhbHNlO1xudmFyIGlkID0gMDtcblxudmFyIGdlbklkID0gZnVuY3Rpb24gZ2VuSWQoKSB7XG4gIHJldHVybiArK2lkO1xufTtcbi8qKlxuICogdXNlSWRcbiAqXG4gKiBBdXRvZ2VuZXJhdGUgSURzIHRvIGZhY2lsaXRhdGUgV0FJLUFSSUEgYW5kIHNlcnZlciByZW5kZXJpbmcuXG4gKlxuICogTm90ZTogVGhlIHJldHVybmVkIElEIHdpbGwgaW5pdGlhbGx5IGJlIGBudWxsYCBhbmQgd2lsbCB1cGRhdGUgYWZ0ZXIgYVxuICogY29tcG9uZW50IG1vdW50cy4gVXNlcnMgbWF5IG5lZWQgdG8gc3VwcGx5IHRoZWlyIG93biBJRCBpZiB0aGV5IG5lZWRcbiAqIGNvbnNpc3RlbnQgdmFsdWVzIGZvciBTU1IuXG4gKlxuICogQHNlZSBEb2NzIGh0dHBzOi8vcmVhY2gudGVjaC9hdXRvLWlkXG4gKi9cblxuXG5mdW5jdGlvbiB1c2VJZChpZEZyb21Qcm9wcykge1xuICAvKlxuICAgKiBJZiB0aGlzIGluc3RhbmNlIGlzbid0IHBhcnQgb2YgdGhlIGluaXRpYWwgcmVuZGVyLCB3ZSBkb24ndCBoYXZlIHRvIGRvIHRoZVxuICAgKiBkb3VibGUgcmVuZGVyL3BhdGNoLXVwIGRhbmNlLiBXZSBjYW4ganVzdCBnZW5lcmF0ZSB0aGUgSUQgYW5kIHJldHVybiBpdC5cbiAgICovXG4gIHZhciBpbml0aWFsSWQgPSBpZEZyb21Qcm9wcyB8fCAoc2VydmVySGFuZG9mZkNvbXBsZXRlID8gZ2VuSWQoKSA6IG51bGwpO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSB1c2VTdGF0ZShpbml0aWFsSWQpLFxuICAgICAgaWQgPSBfUmVhY3QkdXNlU3RhdGVbMF0sXG4gICAgICBzZXRJZCA9IF9SZWFjdCR1c2VTdGF0ZVsxXTtcblxuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgIC8qXG4gICAgICAgKiBQYXRjaCB0aGUgSUQgYWZ0ZXIgcmVuZGVyLiBXZSBkbyB0aGlzIGluIGB1c2VMYXlvdXRFZmZlY3RgIHRvIGF2b2lkIGFueVxuICAgICAgICogcmVuZGVyaW5nIGZsaWNrZXIsIHRob3VnaCBpdCdsbCBtYWtlIHRoZSBmaXJzdCByZW5kZXIgc2xvd2VyICh1bmxpa2VseVxuICAgICAgICogdG8gbWF0dGVyLCBidXQgeW91J3JlIHdlbGNvbWUgdG8gbWVhc3VyZSB5b3VyIGFwcCBhbmQgbGV0IHVzIGtub3cgaWZcbiAgICAgICAqIGl0J3MgYSBwcm9ibGVtKS5cbiAgICAgICAqL1xuICAgICAgc2V0SWQoZ2VuSWQoKSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG5cbiAgfSwgW10pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZXJ2ZXJIYW5kb2ZmQ29tcGxldGUgPT09IGZhbHNlKSB7XG4gICAgICAvKlxuICAgICAgICogRmxhZyBhbGwgZnV0dXJlIHVzZXMgb2YgYHVzZUlkYCB0byBza2lwIHRoZSB1cGRhdGUgZGFuY2UuIFRoaXMgaXMgaW5cbiAgICAgICAqIGB1c2VFZmZlY3RgIGJlY2F1c2UgaXQgZ29lcyBhZnRlciBgdXNlTGF5b3V0RWZmZWN0YCwgZW5zdXJpbmcgd2UgZG9uJ3RcbiAgICAgICAqIGFjY2lkZW50YWxseSBiYWlsIG91dCBvZiB0aGUgcGF0Y2gtdXAgZGFuY2UgcHJlbWF0dXJlbHkuXG4gICAgICAgKi9cbiAgICAgIHNlcnZlckhhbmRvZmZDb21wbGV0ZSA9IHRydWU7XG4gICAgfVxuICB9LCBbXSk7XG4gIHJldHVybiBpZCAhPSBudWxsID8gU3RyaW5nKGlkKSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IHsgdXNlSWQgfTtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJ1aWxkRm9ybWF0TG9uZ0ZuKGFyZ3MpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgLy8gVE9ETzogUmVtb3ZlIFN0cmluZygpXG4gICAgdmFyIHdpZHRoID0gb3B0aW9ucy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgIHZhciBmb3JtYXQgPSBhcmdzLmZvcm1hdHNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0c1thcmdzLmRlZmF1bHRXaWR0aF07XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZExvY2FsaXplRm4oYXJncykge1xuICByZXR1cm4gZnVuY3Rpb24gKGRpcnR5SW5kZXgsIGRpcnR5T3B0aW9ucykge1xuICAgIHZhciBvcHRpb25zID0gZGlydHlPcHRpb25zIHx8IHt9O1xuICAgIHZhciBjb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0ID8gU3RyaW5nKG9wdGlvbnMuY29udGV4dCkgOiAnc3RhbmRhbG9uZSc7XG4gICAgdmFyIHZhbHVlc0FycmF5O1xuXG4gICAgaWYgKGNvbnRleHQgPT09ICdmb3JtYXR0aW5nJyAmJiBhcmdzLmZvcm1hdHRpbmdWYWx1ZXMpIHtcbiAgICAgIHZhciBkZWZhdWx0V2lkdGggPSBhcmdzLmRlZmF1bHRGb3JtYXR0aW5nV2lkdGggfHwgYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICB2YXIgd2lkdGggPSBvcHRpb25zLndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogZGVmYXVsdFdpZHRoO1xuICAgICAgdmFsdWVzQXJyYXkgPSBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1tkZWZhdWx0V2lkdGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2RlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdFdpZHRoO1xuXG4gICAgICB2YXIgX3dpZHRoID0gb3B0aW9ucy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoO1xuXG4gICAgICB2YWx1ZXNBcnJheSA9IGFyZ3MudmFsdWVzW193aWR0aF0gfHwgYXJncy52YWx1ZXNbX2RlZmF1bHRXaWR0aF07XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gYXJncy5hcmd1bWVudENhbGxiYWNrID8gYXJncy5hcmd1bWVudENhbGxiYWNrKGRpcnR5SW5kZXgpIDogZGlydHlJbmRleDsgLy8gQHRzLWlnbm9yZTogRm9yIHNvbWUgcmVhc29uIFR5cGVTY3JpcHQganVzdCBkb24ndCB3YW50IHRvIG1hdGNoIGl0LCBubyBtYXR0ZXIgaG93IGhhcmQgd2UgdHJ5LiBJIGNoYWxsZW5nZSB5b3UgdG8gdHJ5IHRvIHJlbW92ZSBpdCFcblxuICAgIHJldHVybiB2YWx1ZXNBcnJheVtpbmRleF07XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRNYXRjaFBhdHRlcm5GbihhcmdzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHZhciBtYXRjaFJlc3VsdCA9IHN0cmluZy5tYXRjaChhcmdzLm1hdGNoUGF0dGVybik7XG4gICAgaWYgKCFtYXRjaFJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcbiAgICB2YXIgcGFyc2VSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5wYXJzZVBhdHRlcm4pO1xuICAgIGlmICghcGFyc2VSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIHZhciB2YWx1ZSA9IGFyZ3MudmFsdWVDYWxsYmFjayA/IGFyZ3MudmFsdWVDYWxsYmFjayhwYXJzZVJlc3VsdFswXSkgOiBwYXJzZVJlc3VsdFswXTtcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/IG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB2YXIgcmVzdCA9IHN0cmluZy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHJlc3Q6IHJlc3RcbiAgICB9O1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2hGbihhcmdzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHZhciB3aWR0aCA9IG9wdGlvbnMud2lkdGg7XG4gICAgdmFyIG1hdGNoUGF0dGVybiA9IHdpZHRoICYmIGFyZ3MubWF0Y2hQYXR0ZXJuc1t3aWR0aF0gfHwgYXJncy5tYXRjaFBhdHRlcm5zW2FyZ3MuZGVmYXVsdE1hdGNoV2lkdGhdO1xuICAgIHZhciBtYXRjaFJlc3VsdCA9IHN0cmluZy5tYXRjaChtYXRjaFBhdHRlcm4pO1xuXG4gICAgaWYgKCFtYXRjaFJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcbiAgICB2YXIgcGFyc2VQYXR0ZXJucyA9IHdpZHRoICYmIGFyZ3MucGFyc2VQYXR0ZXJuc1t3aWR0aF0gfHwgYXJncy5wYXJzZVBhdHRlcm5zW2FyZ3MuZGVmYXVsdFBhcnNlV2lkdGhdO1xuICAgIHZhciBrZXkgPSBBcnJheS5pc0FycmF5KHBhcnNlUGF0dGVybnMpID8gZmluZEluZGV4KHBhcnNlUGF0dGVybnMsIGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgICByZXR1cm4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpO1xuICAgIH0pIDogZmluZEtleShwYXJzZVBhdHRlcm5zLCBmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKTtcbiAgICB9KTtcbiAgICB2YXIgdmFsdWU7XG4gICAgdmFsdWUgPSBhcmdzLnZhbHVlQ2FsbGJhY2sgPyBhcmdzLnZhbHVlQ2FsbGJhY2soa2V5KSA6IGtleTtcbiAgICB2YWx1ZSA9IG9wdGlvbnMudmFsdWVDYWxsYmFjayA/IG9wdGlvbnMudmFsdWVDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB2YXIgcmVzdCA9IHN0cmluZy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIHJlc3Q6IHJlc3RcbiAgICB9O1xuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAob2JqZWN0Lmhhc093blByb3BlcnR5KGtleSkgJiYgcHJlZGljYXRlKG9iamVjdFtrZXldKSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSkge1xuICBmb3IgKHZhciBrZXkgPSAwOyBrZXkgPCBhcnJheS5sZW5ndGg7IGtleSsrKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtrZXldKSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlcXVpcmVkQXJncyhyZXF1aXJlZCwgYXJncykge1xuICBpZiAoYXJncy5sZW5ndGggPCByZXF1aXJlZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocmVxdWlyZWQgKyAnIGFyZ3VtZW50JyArIChyZXF1aXJlZCA+IDEgPyAncycgOiAnJykgKyAnIHJlcXVpcmVkLCBidXQgb25seSAnICsgYXJncy5sZW5ndGggKyAnIHByZXNlbnQnKTtcbiAgfVxufSIsImltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIHRvRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXRzIGNsb25lLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhIG51bWJlciwgaXQgaXMgdHJlYXRlZCBhcyBhIHRpbWVzdGFtcC5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgbm9uZSBvZiB0aGUgYWJvdmUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEludmFsaWQgRGF0ZS5cbiAqXG4gKiAqKk5vdGUqKjogKmFsbCogRGF0ZSBhcmd1bWVudHMgcGFzc2VkIHRvIGFueSAqZGF0ZS1mbnMqIGZ1bmN0aW9uIGlzIHByb2Nlc3NlZCBieSBgdG9EYXRlYC5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBhcmd1bWVudCAtIHRoZSB2YWx1ZSB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIHBhcnNlZCBkYXRlIGluIHRoZSBsb2NhbCB0aW1lIHpvbmVcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDbG9uZSB0aGUgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IHRvRGF0ZShuZXcgRGF0ZSgyMDE0LCAxLCAxMSwgMTEsIDMwLCAzMCkpXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IHRoZSB0aW1lc3RhbXAgdG8gZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IHRvRGF0ZSgxMzkyMDk4NDMwMDAwKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMTE6MzA6MzBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0RhdGUoYXJndW1lbnQpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBhcmdTdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJndW1lbnQpOyAvLyBDbG9uZSB0aGUgZGF0ZVxuXG4gIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIERhdGUgfHwgdHlwZW9mIGFyZ3VtZW50ID09PSAnb2JqZWN0JyAmJiBhcmdTdHIgPT09ICdbb2JqZWN0IERhdGVdJykge1xuICAgIC8vIFByZXZlbnQgdGhlIGRhdGUgdG8gbG9zZSB0aGUgbWlsbGlzZWNvbmRzIHdoZW4gcGFzc2VkIHRvIG5ldyBEYXRlKCkgaW4gSUUxMFxuICAgIHJldHVybiBuZXcgRGF0ZShhcmd1bWVudC5nZXRUaW1lKCkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBhcmd1bWVudCA9PT0gJ251bWJlcicgfHwgYXJnU3RyID09PSAnW29iamVjdCBOdW1iZXJdJykge1xuICAgIHJldHVybiBuZXcgRGF0ZShhcmd1bWVudCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCh0eXBlb2YgYXJndW1lbnQgPT09ICdzdHJpbmcnIHx8IGFyZ1N0ciA9PT0gJ1tvYmplY3QgU3RyaW5nXScpICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcIlN0YXJ0aW5nIHdpdGggdjIuMC4wLWJldGEuMSBkYXRlLWZucyBkb2Vzbid0IGFjY2VwdCBzdHJpbmdzIGFzIGRhdGUgYXJndW1lbnRzLiBQbGVhc2UgdXNlIGBwYXJzZUlTT2AgdG8gcGFyc2Ugc3RyaW5ncy4gU2VlOiBodHRwczovL2dpdC5pby9manVsZVwiKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcblxuICAgICAgY29uc29sZS53YXJuKG5ldyBFcnJvcigpLnN0YWNrKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgfVxufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvSW50ZWdlcihkaXJ0eU51bWJlcikge1xuICBpZiAoZGlydHlOdW1iZXIgPT09IG51bGwgfHwgZGlydHlOdW1iZXIgPT09IHRydWUgfHwgZGlydHlOdW1iZXIgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuXG4gIHZhciBudW1iZXIgPSBOdW1iZXIoZGlydHlOdW1iZXIpO1xuXG4gIGlmIChpc05hTihudW1iZXIpKSB7XG4gICAgcmV0dXJuIG51bWJlcjtcbiAgfVxuXG4gIHJldHVybiBudW1iZXIgPCAwID8gTWF0aC5jZWlsKG51bWJlcikgOiBNYXRoLmZsb29yKG51bWJlcik7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbmltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL3RvSW50ZWdlci9pbmRleC5qc1wiOyAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBwYXJ0IG9mIHB1YmxpYyBBUEkgd2hlbiBVVEMgZnVuY3Rpb24gd2lsbCBiZSBpbXBsZW1lbnRlZC5cbi8vIFNlZSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNzZcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZlVUQ1dlZWsoZGlydHlEYXRlLCBkaXJ0eU9wdGlvbnMpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBvcHRpb25zID0gZGlydHlPcHRpb25zIHx8IHt9O1xuICB2YXIgbG9jYWxlID0gb3B0aW9ucy5sb2NhbGU7XG4gIHZhciBsb2NhbGVXZWVrU3RhcnRzT24gPSBsb2NhbGUgJiYgbG9jYWxlLm9wdGlvbnMgJiYgbG9jYWxlLm9wdGlvbnMud2Vla1N0YXJ0c09uO1xuICB2YXIgZGVmYXVsdFdlZWtTdGFydHNPbiA9IGxvY2FsZVdlZWtTdGFydHNPbiA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihsb2NhbGVXZWVrU3RhcnRzT24pO1xuICB2YXIgd2Vla1N0YXJ0c09uID0gb3B0aW9ucy53ZWVrU3RhcnRzT24gPT0gbnVsbCA/IGRlZmF1bHRXZWVrU3RhcnRzT24gOiB0b0ludGVnZXIob3B0aW9ucy53ZWVrU3RhcnRzT24pOyAvLyBUZXN0IGlmIHdlZWtTdGFydHNPbiBpcyBiZXR3ZWVuIDAgYW5kIDYgX2FuZF8gaXMgbm90IE5hTlxuXG4gIGlmICghKHdlZWtTdGFydHNPbiA+PSAwICYmIHdlZWtTdGFydHNPbiA8PSA2KSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd3ZWVrU3RhcnRzT24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYgaW5jbHVzaXZlbHknKTtcbiAgfVxuXG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBkYXkgPSBkYXRlLmdldFVUQ0RheSgpO1xuICB2YXIgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyA3IDogMCkgKyBkYXkgLSB3ZWVrU3RhcnRzT247XG4gIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSAtIGRpZmYpO1xuICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBhZGREYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBkYXlzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRheXMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHtOdW1iZXJ9IGFtb3VudCAtIHRoZSBhbW91bnQgb2YgZGF5cyB0byBiZSBhZGRlZC4gUG9zaXRpdmUgZGVjaW1hbHMgd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmZsb29yYCwgZGVjaW1hbHMgbGVzcyB0aGFuIHplcm8gd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmNlaWxgLlxuICogQHJldHVybnMge0RhdGV9IC0gdGhlIG5ldyBkYXRlIHdpdGggdGhlIGRheXMgYWRkZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gLSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMTAgZGF5cyB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gYWRkRGF5cyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgMTApXG4gKiAvLz0+IFRodSBTZXAgMTEgMjAxNCAwMDowMDowMFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZERheXMoZGlydHlEYXRlLCBkaXJ0eUFtb3VudCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGFtb3VudCA9IHRvSW50ZWdlcihkaXJ0eUFtb3VudCk7XG5cbiAgaWYgKGlzTmFOKGFtb3VudCkpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgfVxuXG4gIGlmICghYW1vdW50KSB7XG4gICAgLy8gSWYgMCBkYXlzLCBuby1vcCB0byBhdm9pZCBjaGFuZ2luZyB0aW1lcyBpbiB0aGUgaG91ciBiZWZvcmUgZW5kIG9mIERTVFxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgYW1vdW50KTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgYWRkTW9udGhzXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1vbnRocyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtb250aHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHtOdW1iZXJ9IGFtb3VudCAtIHRoZSBhbW91bnQgb2YgbW9udGhzIHRvIGJlIGFkZGVkLiBQb3NpdGl2ZSBkZWNpbWFscyB3aWxsIGJlIHJvdW5kZWQgdXNpbmcgYE1hdGguZmxvb3JgLCBkZWNpbWFscyBsZXNzIHRoYW4gemVybyB3aWxsIGJlIHJvdW5kZWQgdXNpbmcgYE1hdGguY2VpbGAuXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIG5ldyBkYXRlIHdpdGggdGhlIG1vbnRocyBhZGRlZFxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgNSBtb250aHMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZE1vbnRocyhuZXcgRGF0ZSgyMDE0LCA4LCAxKSwgNSlcbiAqIC8vPT4gU3VuIEZlYiAwMSAyMDE1IDAwOjAwOjAwXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWRkTW9udGhzKGRpcnR5RGF0ZSwgZGlydHlBbW91bnQpIHtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBhbW91bnQgPSB0b0ludGVnZXIoZGlydHlBbW91bnQpO1xuXG4gIGlmIChpc05hTihhbW91bnQpKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gIH1cblxuICBpZiAoIWFtb3VudCkge1xuICAgIC8vIElmIDAgbW9udGhzLCBuby1vcCB0byBhdm9pZCBjaGFuZ2luZyB0aW1lcyBpbiB0aGUgaG91ciBiZWZvcmUgZW5kIG9mIERTVFxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgdmFyIGRheU9mTW9udGggPSBkYXRlLmdldERhdGUoKTsgLy8gVGhlIEpTIERhdGUgb2JqZWN0IHN1cHBvcnRzIGRhdGUgbWF0aCBieSBhY2NlcHRpbmcgb3V0LW9mLWJvdW5kcyB2YWx1ZXMgZm9yXG4gIC8vIG1vbnRoLCBkYXksIGV0Yy4gRm9yIGV4YW1wbGUsIG5ldyBEYXRlKDIwMjAsIDAsIDApIHJldHVybnMgMzEgRGVjIDIwMTkgYW5kXG4gIC8vIG5ldyBEYXRlKDIwMjAsIDEzLCAxKSByZXR1cm5zIDEgRmViIDIwMjEuICBUaGlzIGlzICphbG1vc3QqIHRoZSBiZWhhdmlvciB3ZVxuICAvLyB3YW50IGV4Y2VwdCB0aGF0IGRhdGVzIHdpbGwgd3JhcCBhcm91bmQgdGhlIGVuZCBvZiBhIG1vbnRoLCBtZWFuaW5nIHRoYXRcbiAgLy8gbmV3IERhdGUoMjAyMCwgMTMsIDMxKSB3aWxsIHJldHVybiAzIE1hciAyMDIxIG5vdCAyOCBGZWIgMjAyMSBhcyBkZXNpcmVkLiBTb1xuICAvLyB3ZSdsbCBkZWZhdWx0IHRvIHRoZSBlbmQgb2YgdGhlIGRlc2lyZWQgbW9udGggYnkgYWRkaW5nIDEgdG8gdGhlIGRlc2lyZWRcbiAgLy8gbW9udGggYW5kIHVzaW5nIGEgZGF0ZSBvZiAwIHRvIGJhY2sgdXAgb25lIGRheSB0byB0aGUgZW5kIG9mIHRoZSBkZXNpcmVkXG4gIC8vIG1vbnRoLlxuXG4gIHZhciBlbmRPZkRlc2lyZWRNb250aCA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTtcbiAgZW5kT2ZEZXNpcmVkTW9udGguc2V0TW9udGgoZGF0ZS5nZXRNb250aCgpICsgYW1vdW50ICsgMSwgMCk7XG4gIHZhciBkYXlzSW5Nb250aCA9IGVuZE9mRGVzaXJlZE1vbnRoLmdldERhdGUoKTtcblxuICBpZiAoZGF5T2ZNb250aCA+PSBkYXlzSW5Nb250aCkge1xuICAgIC8vIElmIHdlJ3JlIGFscmVhZHkgYXQgdGhlIGVuZCBvZiB0aGUgbW9udGgsIHRoZW4gdGhpcyBpcyB0aGUgY29ycmVjdCBkYXRlXG4gICAgLy8gYW5kIHdlJ3JlIGRvbmUuXG4gICAgcmV0dXJuIGVuZE9mRGVzaXJlZE1vbnRoO1xuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZSwgd2Ugbm93IGtub3cgdGhhdCBzZXR0aW5nIHRoZSBvcmlnaW5hbCBkYXktb2YtbW9udGggdmFsdWUgd29uJ3RcbiAgICAvLyBjYXVzZSBhbiBvdmVyZmxvdywgc28gc2V0IHRoZSBkZXNpcmVkIGRheS1vZi1tb250aC4gTm90ZSB0aGF0IHdlIGNhbid0XG4gICAgLy8ganVzdCBzZXQgdGhlIGRhdGUgb2YgYGVuZE9mRGVzaXJlZE1vbnRoYCBiZWNhdXNlIHRoYXQgb2JqZWN0IG1heSBoYXZlIGhhZFxuICAgIC8vIGl0cyB0aW1lIGNoYW5nZWQgaW4gdGhlIHVudXN1YWwgY2FzZSB3aGVyZSB3aGVyZSBhIERTVCB0cmFuc2l0aW9uIHdhcyBvblxuICAgIC8vIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGggYW5kIGl0cyBsb2NhbCB0aW1lIHdhcyBpbiB0aGUgaG91ciBza2lwcGVkIG9yXG4gICAgLy8gcmVwZWF0ZWQgbmV4dCB0byBhIERTVCB0cmFuc2l0aW9uLiAgU28gd2UgdXNlIGBkYXRlYCBpbnN0ZWFkIHdoaWNoIGlzXG4gICAgLy8gZ3VhcmFudGVlZCB0byBzdGlsbCBoYXZlIHRoZSBvcmlnaW5hbCB0aW1lLlxuICAgIGRhdGUuc2V0RnVsbFllYXIoZW5kT2ZEZXNpcmVkTW9udGguZ2V0RnVsbFllYXIoKSwgZW5kT2ZEZXNpcmVkTW9udGguZ2V0TW9udGgoKSwgZGF5T2ZNb250aCk7XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cbn0iLCJpbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBhZGRNaWxsaXNlY29uZHNcbiAqIEBjYXRlZ29yeSBNaWxsaXNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge051bWJlcn0gYW1vdW50IC0gdGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gYmUgYWRkZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgbWlsbGlzZWNvbmRzIGFkZGVkXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCA3NTAgbWlsbGlzZWNvbmRzIHRvIDEwIEp1bHkgMjAxNCAxMjo0NTozMC4wMDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRNaWxsaXNlY29uZHMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDEyLCA0NSwgMzAsIDApLCA3NTApXG4gKiAvLz0+IFRodSBKdWwgMTAgMjAxNCAxMjo0NTozMC43NTBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRNaWxsaXNlY29uZHMoZGlydHlEYXRlLCBkaXJ0eUFtb3VudCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIHRpbWVzdGFtcCA9IHRvRGF0ZShkaXJ0eURhdGUpLmdldFRpbWUoKTtcbiAgdmFyIGFtb3VudCA9IHRvSW50ZWdlcihkaXJ0eUFtb3VudCk7XG4gIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXAgKyBhbW91bnQpO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqIEBwYXJhbSB7TG9jYWxlfSBbb3B0aW9ucy5sb2NhbGU9ZGVmYXVsdExvY2FsZV0gLSB0aGUgbG9jYWxlIG9iamVjdC4gU2VlIFtMb2NhbGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvTG9jYWxlfVxuICogQHBhcmFtIHswfDF8MnwzfDR8NXw2fSBbb3B0aW9ucy53ZWVrU3RhcnRzT249MF0gLSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayAoMCAtIFN1bmRheSlcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgc3RhcnQgb2YgYSB3ZWVrXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IFN1biBBdWcgMzEgMjAxNCAwMDowMDowMFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiB0aGUgd2VlayBzdGFydHMgb24gTW9uZGF5LCB0aGUgc3RhcnQgb2YgdGhlIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiBNb24gU2VwIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdGFydE9mV2VlayhkaXJ0eURhdGUsIGRpcnR5T3B0aW9ucykge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIG9wdGlvbnMgPSBkaXJ0eU9wdGlvbnMgfHwge307XG4gIHZhciBsb2NhbGUgPSBvcHRpb25zLmxvY2FsZTtcbiAgdmFyIGxvY2FsZVdlZWtTdGFydHNPbiA9IGxvY2FsZSAmJiBsb2NhbGUub3B0aW9ucyAmJiBsb2NhbGUub3B0aW9ucy53ZWVrU3RhcnRzT247XG4gIHZhciBkZWZhdWx0V2Vla1N0YXJ0c09uID0gbG9jYWxlV2Vla1N0YXJ0c09uID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGxvY2FsZVdlZWtTdGFydHNPbik7XG4gIHZhciB3ZWVrU3RhcnRzT24gPSBvcHRpb25zLndlZWtTdGFydHNPbiA9PSBudWxsID8gZGVmYXVsdFdlZWtTdGFydHNPbiA6IHRvSW50ZWdlcihvcHRpb25zLndlZWtTdGFydHNPbik7IC8vIFRlc3QgaWYgd2Vla1N0YXJ0c09uIGlzIGJldHdlZW4gMCBhbmQgNiBfYW5kXyBpcyBub3QgTmFOXG5cbiAgaWYgKCEod2Vla1N0YXJ0c09uID49IDAgJiYgd2Vla1N0YXJ0c09uIDw9IDYpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3dlZWtTdGFydHNPbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNiBpbmNsdXNpdmVseScpO1xuICB9XG5cbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRheSA9IGRhdGUuZ2V0RGF5KCk7XG4gIHZhciBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjtcbiAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gZGlmZik7XG4gIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlO1xufSIsIi8qKlxuICogR29vZ2xlIENocm9tZSBhcyBvZiA2Ny4wLjMzOTYuODcgaW50cm9kdWNlZCB0aW1lem9uZXMgd2l0aCBvZmZzZXQgdGhhdCBpbmNsdWRlcyBzZWNvbmRzLlxuICogVGhleSB1c3VhbGx5IGFwcGVhciBmb3IgZGF0ZXMgdGhhdCBkZW5vdGUgdGltZSBiZWZvcmUgdGhlIHRpbWV6b25lcyB3ZXJlIGludHJvZHVjZWRcbiAqIChlLmcuIGZvciAnRXVyb3BlL1ByYWd1ZScgdGltZXpvbmUgdGhlIG9mZnNldCBpcyBHTVQrMDA6NTc6NDQgYmVmb3JlIDEgT2N0b2JlciAxODkxXG4gKiBhbmQgR01UKzAxOjAwOjAwIGFmdGVyIHRoYXQgZGF0ZSlcbiAqXG4gKiBEYXRlI2dldFRpbWV6b25lT2Zmc2V0IHJldHVybnMgdGhlIG9mZnNldCBpbiBtaW51dGVzIGFuZCB3b3VsZCByZXR1cm4gNTcgZm9yIHRoZSBleGFtcGxlIGFib3ZlLFxuICogd2hpY2ggd291bGQgbGVhZCB0byBpbmNvcnJlY3QgY2FsY3VsYXRpb25zLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdGltZXpvbmUgb2Zmc2V0IGluIG1pbGxpc2Vjb25kcyB0aGF0IHRha2VzIHNlY29uZHMgaW4gYWNjb3VudC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhkYXRlKSB7XG4gIHZhciB1dGNEYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpLCBkYXRlLmdldEhvdXJzKCksIGRhdGUuZ2V0TWludXRlcygpLCBkYXRlLmdldFNlY29uZHMoKSwgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSkpO1xuICB1dGNEYXRlLnNldFVUQ0Z1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSk7XG4gIHJldHVybiBkYXRlLmdldFRpbWUoKSAtIHV0Y0RhdGUuZ2V0VGltZSgpO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgc3RhcnRPZkRheVxuICogQGNhdGVnb3J5IERheSBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgZGF5IGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgb3JpZ2luYWwgZGF0ZVxuICogQHJldHVybnMge0RhdGV9IHRoZSBzdGFydCBvZiBhIGRheVxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIGRheSBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZEYXkobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAwMiAyMDE0IDAwOjAwOjAwXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZkRheShkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlO1xufSIsImltcG9ydCBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzIGZyb20gXCIuLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mRGF5IGZyb20gXCIuLi9zdGFydE9mRGF5L2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xudmFyIE1JTExJU0VDT05EU19JTl9EQVkgPSA4NjQwMDAwMDtcbi8qKlxuICogQG5hbWUgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBkYXlzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHRpbWVzIGFyZSByZW1vdmVkXG4gKiBmcm9tIHRoZSBkYXRlcyBhbmQgdGhlbiB0aGUgZGlmZmVyZW5jZSBpbiBkYXlzIGlzIGNhbGN1bGF0ZWQuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlTGVmdCAtIHRoZSBsYXRlciBkYXRlXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlUmlnaHQgLSB0aGUgZWFybGllciBkYXRlXG4gKiBAcmV0dXJucyB7TnVtYmVyfSB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXNcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgZGF5cyBhcmUgYmV0d2VlblxuICogLy8gMiBKdWx5IDIwMTEgMjM6MDA6MDAgYW5kIDIgSnVseSAyMDEyIDAwOjAwOjAwP1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKFxuICogICBuZXcgRGF0ZSgyMDEyLCA2LCAyLCAwLCAwKSxcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMiwgMjMsIDApXG4gKiApXG4gKiAvLz0+IDM2NlxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgZGF5cyBhcmUgYmV0d2VlblxuICogLy8gMiBKdWx5IDIwMTEgMjM6NTk6MDAgYW5kIDMgSnVseSAyMDExIDAwOjAxOjAwP1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKFxuICogICBuZXcgRGF0ZSgyMDExLCA2LCAzLCAwLCAxKSxcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMiwgMjMsIDU5KVxuICogKVxuICogLy89PiAxXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGRpcnR5RGF0ZUxlZnQsIGRpcnR5RGF0ZVJpZ2h0KSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgc3RhcnRPZkRheUxlZnQgPSBzdGFydE9mRGF5KGRpcnR5RGF0ZUxlZnQpO1xuICB2YXIgc3RhcnRPZkRheVJpZ2h0ID0gc3RhcnRPZkRheShkaXJ0eURhdGVSaWdodCk7XG4gIHZhciB0aW1lc3RhbXBMZWZ0ID0gc3RhcnRPZkRheUxlZnQuZ2V0VGltZSgpIC0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhzdGFydE9mRGF5TGVmdCk7XG4gIHZhciB0aW1lc3RhbXBSaWdodCA9IHN0YXJ0T2ZEYXlSaWdodC5nZXRUaW1lKCkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKHN0YXJ0T2ZEYXlSaWdodCk7IC8vIFJvdW5kIHRoZSBudW1iZXIgb2YgZGF5cyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyXG4gIC8vIGJlY2F1c2UgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYSBkYXkgaXMgbm90IGNvbnN0YW50XG4gIC8vIChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSBkYXkgb2YgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KVxuXG4gIHJldHVybiBNYXRoLnJvdW5kKCh0aW1lc3RhbXBMZWZ0IC0gdGltZXN0YW1wUmlnaHQpIC8gTUlMTElTRUNPTkRTX0lOX0RBWSk7XG59IiwiaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCBhZGREYXlzIGZyb20gXCIuLi9hZGREYXlzL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBhZGRXZWVrc1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHdlZWsgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHtOdW1iZXJ9IGFtb3VudCAtIHRoZSBhbW91bnQgb2Ygd2Vla3MgdG8gYmUgYWRkZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgd2Vla3MgYWRkZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDQgd2Vla3MgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZFdlZWtzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA0KVxuICogLy89PiBNb24gU2VwIDI5IDIwMTQgMDA6MDA6MDBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRXZWVrcyhkaXJ0eURhdGUsIGRpcnR5QW1vdW50KSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgYW1vdW50ID0gdG9JbnRlZ2VyKGRpcnR5QW1vdW50KTtcbiAgdmFyIGRheXMgPSBhbW91bnQgKiA3O1xuICByZXR1cm4gYWRkRGF5cyhkaXJ0eURhdGUsIGRheXMpO1xufSIsImltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL19saWIvdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgYWRkTW9udGhzIGZyb20gXCIuLi9hZGRNb250aHMvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGFkZFllYXJzXG4gKiBAY2F0ZWdvcnkgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhcnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgeWVhcnMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHtOdW1iZXJ9IGFtb3VudCAtIHRoZSBhbW91bnQgb2YgeWVhcnMgdG8gYmUgYWRkZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgeWVhcnMgYWRkZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDUgeWVhcnMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZFllYXJzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCA1KVxuICogLy89PiBTdW4gU2VwIDAxIDIwMTkgMDA6MDA6MDBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRZZWFycyhkaXJ0eURhdGUsIGRpcnR5QW1vdW50KSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgYW1vdW50ID0gdG9JbnRlZ2VyKGRpcnR5QW1vdW50KTtcbiAgcmV0dXJuIGFkZE1vbnRocyhkaXJ0eURhdGUsIGFtb3VudCAqIDEyKTtcbn0iLCJpbXBvcnQgc3RhcnRPZkRheSBmcm9tIFwiLi4vc3RhcnRPZkRheS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgaXNTYW1lRGF5XG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgZGF5IChhbmQgeWVhciBhbmQgbW9udGgpP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSBkYXkgKGFuZCB5ZWFyIGFuZCBtb250aCk/XG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlTGVmdCAtIHRoZSBmaXJzdCBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlUmlnaHQgLSB0aGUgc2Vjb25kIGRhdGUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0aGUgZGF0ZXMgYXJlIGluIHRoZSBzYW1lIGRheSAoYW5kIHllYXIgYW5kIG1vbnRoKVxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgNCBTZXB0ZW1iZXIgMDY6MDA6MDAgYW5kIDQgU2VwdGVtYmVyIDE4OjAwOjAwIGluIHRoZSBzYW1lIGRheT9cbiAqIHZhciByZXN1bHQgPSBpc1NhbWVEYXkobmV3IERhdGUoMjAxNCwgOCwgNCwgNiwgMCksIG5ldyBEYXRlKDIwMTQsIDgsIDQsIDE4LCAwKSlcbiAqIC8vPT4gdHJ1ZVxuICogXG4gKiBAZXhhbXBsZVxuICogLy8gQXJlIDQgU2VwdGVtYmVyIGFuZCA0IE9jdG9iZXIgaW4gdGhlIHNhbWUgZGF5P1xuICogdmFyIHJlc3VsdCA9IGlzU2FtZURheShuZXcgRGF0ZSgyMDE0LCA4LCA0KSwgbmV3IERhdGUoMjAxNCwgOSwgNCkpXG4gKiAvLz0+IGZhbHNlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgNCBTZXB0ZW1iZXIsIDIwMTQgYW5kIDQgU2VwdGVtYmVyLCAyMDE1IGluIHRoZSBzYW1lIGRheT9cbiAqIHZhciByZXN1bHQgPSBpc1NhbWVEYXkobmV3IERhdGUoMjAxNCwgOCwgNCksIG5ldyBEYXRlKDIwMTUsIDgsIDQpKVxuICogLy89PiBmYWxzZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2FtZURheShkaXJ0eURhdGVMZWZ0LCBkaXJ0eURhdGVSaWdodCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGVMZWZ0U3RhcnRPZkRheSA9IHN0YXJ0T2ZEYXkoZGlydHlEYXRlTGVmdCk7XG4gIHZhciBkYXRlUmlnaHRTdGFydE9mRGF5ID0gc3RhcnRPZkRheShkaXJ0eURhdGVSaWdodCk7XG4gIHJldHVybiBkYXRlTGVmdFN0YXJ0T2ZEYXkuZ2V0VGltZSgpID09PSBkYXRlUmlnaHRTdGFydE9mRGF5LmdldFRpbWUoKTtcbn0iLCJpbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBpc0RhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIHZhbHVlIGEgZGF0ZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZS4gVGhlIGZ1bmN0aW9uIHdvcmtzIGZvciBkYXRlcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgaWZyYW1lcy5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgLSB0aGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIGRhdGVcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGEgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZShuZXcgRGF0ZSgpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUobmV3IERhdGUoTmFOKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3Igc29tZSB2YWx1ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZSgnMjAxNC0wMi0zMScpXG4gKiAvLz0+IGZhbHNlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBvYmplY3Q6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUoe30pXG4gKiAvLz0+IGZhbHNlXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNEYXRlKHZhbHVlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufSIsImltcG9ydCBpc0RhdGUgZnJvbSBcIi4uL2lzRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBpc1ZhbGlkXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBnaXZlbiBkYXRlIHZhbGlkP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJucyBmYWxzZSBpZiBhcmd1bWVudCBpcyBJbnZhbGlkIERhdGUgYW5kIHRydWUgb3RoZXJ3aXNlLlxuICogQXJndW1lbnQgaXMgY29udmVydGVkIHRvIERhdGUgdXNpbmcgYHRvRGF0ZWAuIFNlZSBbdG9EYXRlXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL3RvRGF0ZX1cbiAqIEludmFsaWQgRGF0ZSBpcyBhIERhdGUsIHdob3NlIHRpbWUgdmFsdWUgaXMgTmFOLlxuICpcbiAqIFRpbWUgdmFsdWUgb2YgRGF0ZTogaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS45LjEuMVxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogLSBOb3cgYGlzVmFsaWRgIGRvZXNuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uXG4gKiAgIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqICAgSW5zdGVhZCwgYXJndW1lbnQgaXMgY29udmVydGVkIGJlZm9yZWhhbmQgdXNpbmcgYHRvRGF0ZWAuXG4gKlxuICogICBFeGFtcGxlczpcbiAqXG4gKiAgIHwgYGlzVmFsaWRgIGFyZ3VtZW50ICAgICAgICB8IEJlZm9yZSB2Mi4wLjAgfCB2Mi4wLjAgb253YXJkIHxcbiAqICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfFxuICogICB8IGBuZXcgRGF0ZSgpYCAgICAgICAgICAgICAgfCBgdHJ1ZWAgICAgICAgIHwgYHRydWVgICAgICAgICB8XG4gKiAgIHwgYG5ldyBEYXRlKCcyMDE2LTAxLTAxJylgICB8IGB0cnVlYCAgICAgICAgfCBgdHJ1ZWAgICAgICAgIHxcbiAqICAgfCBgbmV3IERhdGUoJycpYCAgICAgICAgICAgIHwgYGZhbHNlYCAgICAgICB8IGBmYWxzZWAgICAgICAgfFxuICogICB8IGBuZXcgRGF0ZSgxNDg4MzcwODM1MDgxKWAgfCBgdHJ1ZWAgICAgICAgIHwgYHRydWVgICAgICAgICB8XG4gKiAgIHwgYG5ldyBEYXRlKE5hTilgICAgICAgICAgICB8IGBmYWxzZWAgICAgICAgfCBgZmFsc2VgICAgICAgIHxcbiAqICAgfCBgJzIwMTYtMDEtMDEnYCAgICAgICAgICAgIHwgYFR5cGVFcnJvcmAgICB8IGBmYWxzZWAgICAgICAgfFxuICogICB8IGAnJ2AgICAgICAgICAgICAgICAgICAgICAgfCBgVHlwZUVycm9yYCAgIHwgYGZhbHNlYCAgICAgICB8XG4gKiAgIHwgYDE0ODgzNzA4MzUwODFgICAgICAgICAgICB8IGBUeXBlRXJyb3JgICAgfCBgdHJ1ZWAgICAgICAgIHxcbiAqICAgfCBgTmFOYCAgICAgICAgICAgICAgICAgICAgIHwgYFR5cGVFcnJvcmAgICB8IGBmYWxzZWAgICAgICAgfFxuICpcbiAqICAgV2UgaW50cm9kdWNlIHRoaXMgY2hhbmdlIHRvIG1ha2UgKmRhdGUtZm5zKiBjb25zaXN0ZW50IHdpdGggRUNNQVNjcmlwdCBiZWhhdmlvclxuICogICB0aGF0IHRyeSB0byBjb2VyY2UgYXJndW1lbnRzIHRvIHRoZSBleHBlY3RlZCB0eXBlXG4gKiAgICh3aGljaCBpcyBhbHNvIHRoZSBjYXNlIHdpdGggb3RoZXIgKmRhdGUtZm5zKiBmdW5jdGlvbnMpLlxuICpcbiAqIEBwYXJhbSB7Kn0gZGF0ZSAtIHRoZSBkYXRlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdGhlIGRhdGUgaXMgdmFsaWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIHZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKG5ldyBEYXRlKDIwMTQsIDEsIDMxKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIHZhbHVlLCBjb252ZXJ0YWJsZSBpbnRvIGEgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzVmFsaWQoMTM5MzgwNDgwMDAwMClcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3IgdGhlIGludmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzVmFsaWQobmV3IERhdGUoJycpKVxuICogLy89PiBmYWxzZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzVmFsaWQoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuXG4gIGlmICghaXNEYXRlKGRpcnR5RGF0ZSkgJiYgdHlwZW9mIGRpcnR5RGF0ZSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICByZXR1cm4gIWlzTmFOKE51bWJlcihkYXRlKSk7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRoc1xuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRocyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRocyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVMZWZ0IC0gdGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVSaWdodCAtIHRoZSBlYXJsaWVyIGRhdGVcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgbW9udGhzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIG1vbnRocyBhcmUgYmV0d2VlbiAzMSBKYW51YXJ5IDIwMTQgYW5kIDEgU2VwdGVtYmVyIDIwMTQ/XG4gKiB2YXIgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDgsIDEpLFxuICogICBuZXcgRGF0ZSgyMDE0LCAwLCAzMSlcbiAqIClcbiAqIC8vPT4gOFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKGRpcnR5RGF0ZUxlZnQsIGRpcnR5RGF0ZVJpZ2h0KSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZUxlZnQgPSB0b0RhdGUoZGlydHlEYXRlTGVmdCk7XG4gIHZhciBkYXRlUmlnaHQgPSB0b0RhdGUoZGlydHlEYXRlUmlnaHQpO1xuICB2YXIgeWVhckRpZmYgPSBkYXRlTGVmdC5nZXRGdWxsWWVhcigpIC0gZGF0ZVJpZ2h0LmdldEZ1bGxZZWFyKCk7XG4gIHZhciBtb250aERpZmYgPSBkYXRlTGVmdC5nZXRNb250aCgpIC0gZGF0ZVJpZ2h0LmdldE1vbnRoKCk7XG4gIHJldHVybiB5ZWFyRGlmZiAqIDEyICsgbW9udGhEaWZmO1xufSIsImltcG9ydCBzdGFydE9mV2VlayBmcm9tIFwiLi4vc3RhcnRPZldlZWsvaW5kZXguanNcIjtcbmltcG9ydCBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzIGZyb20gXCIuLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG52YXIgTUlMTElTRUNPTkRTX0lOX1dFRUsgPSA2MDQ4MDAwMDA7XG4vKipcbiAqIEBuYW1lIGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3NcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIHdlZWtzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgd2Vla3MgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlTGVmdCAtIHRoZSBsYXRlciBkYXRlXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlUmlnaHQgLSB0aGUgZWFybGllciBkYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqIEBwYXJhbSB7TG9jYWxlfSBbb3B0aW9ucy5sb2NhbGU9ZGVmYXVsdExvY2FsZV0gLSB0aGUgbG9jYWxlIG9iamVjdC4gU2VlIFtMb2NhbGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvTG9jYWxlfVxuICogQHBhcmFtIHswfDF8MnwzfDR8NXw2fSBbb3B0aW9ucy53ZWVrU3RhcnRzT249MF0gLSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayAoMCAtIFN1bmRheSlcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgd2Vla3NcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgY2FsZW5kYXIgd2Vla3MgYXJlIGJldHdlZW4gNSBKdWx5IDIwMTQgYW5kIDIwIEp1bHkgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDYsIDIwKSxcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgNSlcbiAqIClcbiAqIC8vPT4gM1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiB0aGUgd2VlayBzdGFydHMgb24gTW9uZGF5LFxuICogLy8gaG93IG1hbnkgY2FsZW5kYXIgd2Vla3MgYXJlIGJldHdlZW4gNSBKdWx5IDIwMTQgYW5kIDIwIEp1bHkgMjAxND9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDYsIDIwKSxcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgNSksXG4gKiAgIHsgd2Vla1N0YXJ0c09uOiAxIH1cbiAqIClcbiAqIC8vPT4gMlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRpZmZlcmVuY2VJbkNhbGVuZGFyV2Vla3MoZGlydHlEYXRlTGVmdCwgZGlydHlEYXRlUmlnaHQsIGRpcnR5T3B0aW9ucykge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIHN0YXJ0T2ZXZWVrTGVmdCA9IHN0YXJ0T2ZXZWVrKGRpcnR5RGF0ZUxlZnQsIGRpcnR5T3B0aW9ucyk7XG4gIHZhciBzdGFydE9mV2Vla1JpZ2h0ID0gc3RhcnRPZldlZWsoZGlydHlEYXRlUmlnaHQsIGRpcnR5T3B0aW9ucyk7XG4gIHZhciB0aW1lc3RhbXBMZWZ0ID0gc3RhcnRPZldlZWtMZWZ0LmdldFRpbWUoKSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoc3RhcnRPZldlZWtMZWZ0KTtcbiAgdmFyIHRpbWVzdGFtcFJpZ2h0ID0gc3RhcnRPZldlZWtSaWdodC5nZXRUaW1lKCkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKHN0YXJ0T2ZXZWVrUmlnaHQpOyAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIGRheXMgdG8gdGhlIG5lYXJlc3QgaW50ZWdlclxuICAvLyBiZWNhdXNlIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIGEgd2VlayBpcyBub3QgY29uc3RhbnRcbiAgLy8gKGUuZy4gaXQncyBkaWZmZXJlbnQgaW4gdGhlIHdlZWsgb2YgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KVxuXG4gIHJldHVybiBNYXRoLnJvdW5kKCh0aW1lc3RhbXBMZWZ0IC0gdGltZXN0YW1wUmlnaHQpIC8gTUlMTElTRUNPTkRTX0lOX1dFRUspO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgZW5kT2ZNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgZW5kIG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBlbmQgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIGVuZCBvZiBhIG1vbnRoXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIGVuZCBvZiBhIG1vbnRoIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gZW5kT2ZNb250aChuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBUdWUgU2VwIDMwIDIwMTQgMjM6NTk6NTkuOTk5XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZW5kT2ZNb250aChkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCksIG1vbnRoICsgMSwgMCk7XG4gIGRhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBzdGFydE9mTW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIG9yaWdpbmFsIGRhdGVcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgc3RhcnQgb2YgYSBtb250aFxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIG1vbnRoIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZk1vbnRoKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCkpXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwMDowMDowMFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0T2ZNb250aChkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIGRhdGUuc2V0RGF0ZSgxKTtcbiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBzdGFydE9mWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgb3JpZ2luYWwgZGF0ZVxuICogQHJldHVybnMge0RhdGV9IHRoZSBzdGFydCBvZiBhIHllYXJcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSB5ZWFyIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZlllYXIobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwMCkpXG4gKiAvLz0+IFdlZCBKYW4gMDEgMjAxNCAwMDowMDowMFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0T2ZZZWFyKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGNsZWFuRGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgZGF0ZSA9IG5ldyBEYXRlKDApO1xuICBkYXRlLnNldEZ1bGxZZWFyKGNsZWFuRGF0ZS5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcblxuLyoqXG4gKiBAbmFtZSBlbmRPZldlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgZW5kIG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGVuZCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKiBAcGFyYW0ge0xvY2FsZX0gW29wdGlvbnMubG9jYWxlPWRlZmF1bHRMb2NhbGVdIC0gdGhlIGxvY2FsZSBvYmplY3QuIFNlZSBbTG9jYWxlXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL0xvY2FsZX1cbiAqIEBwYXJhbSB7MHwxfDJ8M3w0fDV8Nn0gW29wdGlvbnMud2Vla1N0YXJ0c09uPTBdIC0gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgKDAgLSBTdW5kYXkpXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIGVuZCBvZiBhIHdlZWtcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMSBhcmd1bWVudCByZXF1aXJlZFxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gYG9wdGlvbnMud2Vla1N0YXJ0c09uYCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgZW5kIG9mIGEgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBTYXQgU2VwIDA2IDIwMTQgMjM6NTk6NTkuOTk5XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRoZSB3ZWVrIHN0YXJ0cyBvbiBNb25kYXksIHRoZSBlbmQgb2YgdGhlIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBlbmRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSwgeyB3ZWVrU3RhcnRzT246IDEgfSlcbiAqIC8vPT4gU3VuIFNlcCAwNyAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlbmRPZldlZWsoZGlydHlEYXRlLCBkaXJ0eU9wdGlvbnMpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBvcHRpb25zID0gZGlydHlPcHRpb25zIHx8IHt9O1xuICB2YXIgbG9jYWxlID0gb3B0aW9ucy5sb2NhbGU7XG4gIHZhciBsb2NhbGVXZWVrU3RhcnRzT24gPSBsb2NhbGUgJiYgbG9jYWxlLm9wdGlvbnMgJiYgbG9jYWxlLm9wdGlvbnMud2Vla1N0YXJ0c09uO1xuICB2YXIgZGVmYXVsdFdlZWtTdGFydHNPbiA9IGxvY2FsZVdlZWtTdGFydHNPbiA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihsb2NhbGVXZWVrU3RhcnRzT24pO1xuICB2YXIgd2Vla1N0YXJ0c09uID0gb3B0aW9ucy53ZWVrU3RhcnRzT24gPT0gbnVsbCA/IGRlZmF1bHRXZWVrU3RhcnRzT24gOiB0b0ludGVnZXIob3B0aW9ucy53ZWVrU3RhcnRzT24pOyAvLyBUZXN0IGlmIHdlZWtTdGFydHNPbiBpcyBiZXR3ZWVuIDAgYW5kIDYgX2FuZF8gaXMgbm90IE5hTlxuXG4gIGlmICghKHdlZWtTdGFydHNPbiA+PSAwICYmIHdlZWtTdGFydHNPbiA8PSA2KSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd3ZWVrU3RhcnRzT24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYgaW5jbHVzaXZlbHknKTtcbiAgfVxuXG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBkYXkgPSBkYXRlLmdldERheSgpO1xuICB2YXIgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyAtNyA6IDApICsgNiAtIChkYXkgLSB3ZWVrU3RhcnRzT24pO1xuICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBkaWZmKTtcbiAgZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJ2YXIgZm9ybWF0RGlzdGFuY2VMb2NhbGUgPSB7XG4gIGxlc3NUaGFuWFNlY29uZHM6IHtcbiAgICBvbmU6ICdsZXNzIHRoYW4gYSBzZWNvbmQnLFxuICAgIG90aGVyOiAnbGVzcyB0aGFuIHt7Y291bnR9fSBzZWNvbmRzJ1xuICB9LFxuICB4U2Vjb25kczoge1xuICAgIG9uZTogJzEgc2Vjb25kJyxcbiAgICBvdGhlcjogJ3t7Y291bnR9fSBzZWNvbmRzJ1xuICB9LFxuICBoYWxmQU1pbnV0ZTogJ2hhbGYgYSBtaW51dGUnLFxuICBsZXNzVGhhblhNaW51dGVzOiB7XG4gICAgb25lOiAnbGVzcyB0aGFuIGEgbWludXRlJyxcbiAgICBvdGhlcjogJ2xlc3MgdGhhbiB7e2NvdW50fX0gbWludXRlcydcbiAgfSxcbiAgeE1pbnV0ZXM6IHtcbiAgICBvbmU6ICcxIG1pbnV0ZScsXG4gICAgb3RoZXI6ICd7e2NvdW50fX0gbWludXRlcydcbiAgfSxcbiAgYWJvdXRYSG91cnM6IHtcbiAgICBvbmU6ICdhYm91dCAxIGhvdXInLFxuICAgIG90aGVyOiAnYWJvdXQge3tjb3VudH19IGhvdXJzJ1xuICB9LFxuICB4SG91cnM6IHtcbiAgICBvbmU6ICcxIGhvdXInLFxuICAgIG90aGVyOiAne3tjb3VudH19IGhvdXJzJ1xuICB9LFxuICB4RGF5czoge1xuICAgIG9uZTogJzEgZGF5JyxcbiAgICBvdGhlcjogJ3t7Y291bnR9fSBkYXlzJ1xuICB9LFxuICBhYm91dFhXZWVrczoge1xuICAgIG9uZTogJ2Fib3V0IDEgd2VlaycsXG4gICAgb3RoZXI6ICdhYm91dCB7e2NvdW50fX0gd2Vla3MnXG4gIH0sXG4gIHhXZWVrczoge1xuICAgIG9uZTogJzEgd2VlaycsXG4gICAgb3RoZXI6ICd7e2NvdW50fX0gd2Vla3MnXG4gIH0sXG4gIGFib3V0WE1vbnRoczoge1xuICAgIG9uZTogJ2Fib3V0IDEgbW9udGgnLFxuICAgIG90aGVyOiAnYWJvdXQge3tjb3VudH19IG1vbnRocydcbiAgfSxcbiAgeE1vbnRoczoge1xuICAgIG9uZTogJzEgbW9udGgnLFxuICAgIG90aGVyOiAne3tjb3VudH19IG1vbnRocydcbiAgfSxcbiAgYWJvdXRYWWVhcnM6IHtcbiAgICBvbmU6ICdhYm91dCAxIHllYXInLFxuICAgIG90aGVyOiAnYWJvdXQge3tjb3VudH19IHllYXJzJ1xuICB9LFxuICB4WWVhcnM6IHtcbiAgICBvbmU6ICcxIHllYXInLFxuICAgIG90aGVyOiAne3tjb3VudH19IHllYXJzJ1xuICB9LFxuICBvdmVyWFllYXJzOiB7XG4gICAgb25lOiAnb3ZlciAxIHllYXInLFxuICAgIG90aGVyOiAnb3ZlciB7e2NvdW50fX0geWVhcnMnXG4gIH0sXG4gIGFsbW9zdFhZZWFyczoge1xuICAgIG9uZTogJ2FsbW9zdCAxIHllYXInLFxuICAgIG90aGVyOiAnYWxtb3N0IHt7Y291bnR9fSB5ZWFycydcbiAgfVxufTtcblxudmFyIGZvcm1hdERpc3RhbmNlID0gZnVuY3Rpb24gKHRva2VuLCBjb3VudCwgb3B0aW9ucykge1xuICB2YXIgcmVzdWx0O1xuICB2YXIgdG9rZW5WYWx1ZSA9IGZvcm1hdERpc3RhbmNlTG9jYWxlW3Rva2VuXTtcblxuICBpZiAodHlwZW9mIHRva2VuVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmVzdWx0ID0gdG9rZW5WYWx1ZTtcbiAgfSBlbHNlIGlmIChjb3VudCA9PT0gMSkge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub25lO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub3RoZXIucmVwbGFjZSgne3tjb3VudH19JywgY291bnQudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgJiYgb3B0aW9ucy5hZGRTdWZmaXgpIHtcbiAgICBpZiAob3B0aW9ucy5jb21wYXJpc29uICYmIG9wdGlvbnMuY29tcGFyaXNvbiA+IDApIHtcbiAgICAgIHJldHVybiAnaW4gJyArIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdCArICcgYWdvJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZm9ybWF0RGlzdGFuY2U7IiwiaW1wb3J0IGJ1aWxkRm9ybWF0TG9uZ0ZuIGZyb20gXCIuLi8uLi8uLi9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuL2luZGV4LmpzXCI7XG52YXIgZGF0ZUZvcm1hdHMgPSB7XG4gIGZ1bGw6ICdFRUVFLCBNTU1NIGRvLCB5JyxcbiAgbG9uZzogJ01NTU0gZG8sIHknLFxuICBtZWRpdW06ICdNTU0gZCwgeScsXG4gIHNob3J0OiAnTU0vZGQveXl5eSdcbn07XG52YXIgdGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6ICdoOm1tOnNzIGEgenp6eicsXG4gIGxvbmc6ICdoOm1tOnNzIGEgeicsXG4gIG1lZGl1bTogJ2g6bW06c3MgYScsXG4gIHNob3J0OiAnaDptbSBhJ1xufTtcbnZhciBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBsb25nOiBcInt7ZGF0ZX19ICdhdCcge3t0aW1lfX1cIixcbiAgbWVkaXVtOiAne3tkYXRlfX0sIHt7dGltZX19JyxcbiAgc2hvcnQ6ICd7e2RhdGV9fSwge3t0aW1lfX0nXG59O1xudmFyIGZvcm1hdExvbmcgPSB7XG4gIGRhdGU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiBkYXRlRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6ICdmdWxsJ1xuICB9KSxcbiAgdGltZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IHRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogJ2Z1bGwnXG4gIH0pLFxuICBkYXRlVGltZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IGRhdGVUaW1lRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6ICdmdWxsJ1xuICB9KVxufTtcbmV4cG9ydCBkZWZhdWx0IGZvcm1hdExvbmc7IiwidmFyIGZvcm1hdFJlbGF0aXZlTG9jYWxlID0ge1xuICBsYXN0V2VlazogXCInbGFzdCcgZWVlZSAnYXQnIHBcIixcbiAgeWVzdGVyZGF5OiBcIid5ZXN0ZXJkYXkgYXQnIHBcIixcbiAgdG9kYXk6IFwiJ3RvZGF5IGF0JyBwXCIsXG4gIHRvbW9ycm93OiBcIid0b21vcnJvdyBhdCcgcFwiLFxuICBuZXh0V2VlazogXCJlZWVlICdhdCcgcFwiLFxuICBvdGhlcjogJ1AnXG59O1xuXG52YXIgZm9ybWF0UmVsYXRpdmUgPSBmdW5jdGlvbiAodG9rZW4sIF9kYXRlLCBfYmFzZURhdGUsIF9vcHRpb25zKSB7XG4gIHJldHVybiBmb3JtYXRSZWxhdGl2ZUxvY2FsZVt0b2tlbl07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmb3JtYXRSZWxhdGl2ZTsiLCJpbXBvcnQgYnVpbGRMb2NhbGl6ZUZuIGZyb20gXCIuLi8uLi8uLi9fbGliL2J1aWxkTG9jYWxpemVGbi9pbmRleC5qc1wiO1xudmFyIGVyYVZhbHVlcyA9IHtcbiAgbmFycm93OiBbJ0InLCAnQSddLFxuICBhYmJyZXZpYXRlZDogWydCQycsICdBRCddLFxuICB3aWRlOiBbJ0JlZm9yZSBDaHJpc3QnLCAnQW5ubyBEb21pbmknXVxufTtcbnZhciBxdWFydGVyVmFsdWVzID0ge1xuICBuYXJyb3c6IFsnMScsICcyJywgJzMnLCAnNCddLFxuICBhYmJyZXZpYXRlZDogWydRMScsICdRMicsICdRMycsICdRNCddLFxuICB3aWRlOiBbJzFzdCBxdWFydGVyJywgJzJuZCBxdWFydGVyJywgJzNyZCBxdWFydGVyJywgJzR0aCBxdWFydGVyJ11cbn07IC8vIE5vdGU6IGluIEVuZ2xpc2gsIHRoZSBuYW1lcyBvZiBkYXlzIG9mIHRoZSB3ZWVrIGFuZCBtb250aHMgYXJlIGNhcGl0YWxpemVkLlxuLy8gSWYgeW91IGFyZSBtYWtpbmcgYSBuZXcgbG9jYWxlIGJhc2VkIG9uIHRoaXMgb25lLCBjaGVjayBpZiB0aGUgc2FtZSBpcyB0cnVlIGZvciB0aGUgbGFuZ3VhZ2UgeW91J3JlIHdvcmtpbmcgb24uXG4vLyBHZW5lcmFsbHksIGZvcm1hdHRlZCBkYXRlcyBzaG91bGQgbG9vayBsaWtlIHRoZXkgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzZW50ZW5jZSxcbi8vIGUuZy4gaW4gU3BhbmlzaCBsYW5ndWFnZSB0aGUgd2Vla2RheXMgYW5kIG1vbnRocyBzaG91bGQgYmUgaW4gdGhlIGxvd2VyY2FzZS5cblxudmFyIG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXSxcbiAgYWJicmV2aWF0ZWQ6IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXSxcbiAgd2lkZTogWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ11cbn07XG52YXIgZGF5VmFsdWVzID0ge1xuICBuYXJyb3c6IFsnUycsICdNJywgJ1QnLCAnVycsICdUJywgJ0YnLCAnUyddLFxuICBzaG9ydDogWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddLFxuICBhYmJyZXZpYXRlZDogWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnXSxcbiAgd2lkZTogWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddXG59O1xudmFyIGRheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06ICdhJyxcbiAgICBwbTogJ3AnLFxuICAgIG1pZG5pZ2h0OiAnbWknLFxuICAgIG5vb246ICduJyxcbiAgICBtb3JuaW5nOiAnbW9ybmluZycsXG4gICAgYWZ0ZXJub29uOiAnYWZ0ZXJub29uJyxcbiAgICBldmVuaW5nOiAnZXZlbmluZycsXG4gICAgbmlnaHQ6ICduaWdodCdcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogJ0FNJyxcbiAgICBwbTogJ1BNJyxcbiAgICBtaWRuaWdodDogJ21pZG5pZ2h0JyxcbiAgICBub29uOiAnbm9vbicsXG4gICAgbW9ybmluZzogJ21vcm5pbmcnLFxuICAgIGFmdGVybm9vbjogJ2FmdGVybm9vbicsXG4gICAgZXZlbmluZzogJ2V2ZW5pbmcnLFxuICAgIG5pZ2h0OiAnbmlnaHQnXG4gIH0sXG4gIHdpZGU6IHtcbiAgICBhbTogJ2EubS4nLFxuICAgIHBtOiAncC5tLicsXG4gICAgbWlkbmlnaHQ6ICdtaWRuaWdodCcsXG4gICAgbm9vbjogJ25vb24nLFxuICAgIG1vcm5pbmc6ICdtb3JuaW5nJyxcbiAgICBhZnRlcm5vb246ICdhZnRlcm5vb24nLFxuICAgIGV2ZW5pbmc6ICdldmVuaW5nJyxcbiAgICBuaWdodDogJ25pZ2h0J1xuICB9XG59O1xudmFyIGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiAnYScsXG4gICAgcG06ICdwJyxcbiAgICBtaWRuaWdodDogJ21pJyxcbiAgICBub29uOiAnbicsXG4gICAgbW9ybmluZzogJ2luIHRoZSBtb3JuaW5nJyxcbiAgICBhZnRlcm5vb246ICdpbiB0aGUgYWZ0ZXJub29uJyxcbiAgICBldmVuaW5nOiAnaW4gdGhlIGV2ZW5pbmcnLFxuICAgIG5pZ2h0OiAnYXQgbmlnaHQnXG4gIH0sXG4gIGFiYnJldmlhdGVkOiB7XG4gICAgYW06ICdBTScsXG4gICAgcG06ICdQTScsXG4gICAgbWlkbmlnaHQ6ICdtaWRuaWdodCcsXG4gICAgbm9vbjogJ25vb24nLFxuICAgIG1vcm5pbmc6ICdpbiB0aGUgbW9ybmluZycsXG4gICAgYWZ0ZXJub29uOiAnaW4gdGhlIGFmdGVybm9vbicsXG4gICAgZXZlbmluZzogJ2luIHRoZSBldmVuaW5nJyxcbiAgICBuaWdodDogJ2F0IG5pZ2h0J1xuICB9LFxuICB3aWRlOiB7XG4gICAgYW06ICdhLm0uJyxcbiAgICBwbTogJ3AubS4nLFxuICAgIG1pZG5pZ2h0OiAnbWlkbmlnaHQnLFxuICAgIG5vb246ICdub29uJyxcbiAgICBtb3JuaW5nOiAnaW4gdGhlIG1vcm5pbmcnLFxuICAgIGFmdGVybm9vbjogJ2luIHRoZSBhZnRlcm5vb24nLFxuICAgIGV2ZW5pbmc6ICdpbiB0aGUgZXZlbmluZycsXG4gICAgbmlnaHQ6ICdhdCBuaWdodCdcbiAgfVxufTtcblxudmFyIG9yZGluYWxOdW1iZXIgPSBmdW5jdGlvbiAoZGlydHlOdW1iZXIsIF9vcHRpb25zKSB7XG4gIHZhciBudW1iZXIgPSBOdW1iZXIoZGlydHlOdW1iZXIpOyAvLyBJZiBvcmRpbmFsIG51bWJlcnMgZGVwZW5kIG9uIGNvbnRleHQsIGZvciBleGFtcGxlLFxuICAvLyBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBncmFtbWF0aWNhbCBnZW5kZXJzLFxuICAvLyB1c2UgYG9wdGlvbnMudW5pdGAuXG4gIC8vXG4gIC8vIGB1bml0YCBjYW4gYmUgJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RhdGUnLCAnZGF5T2ZZZWFyJyxcbiAgLy8gJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLlxuXG4gIHZhciByZW0xMDAgPSBudW1iZXIgJSAxMDA7XG5cbiAgaWYgKHJlbTEwMCA+IDIwIHx8IHJlbTEwMCA8IDEwKSB7XG4gICAgc3dpdGNoIChyZW0xMDAgJSAxMCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgJ3N0JztcblxuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgJ25kJztcblxuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgJ3JkJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVtYmVyICsgJ3RoJztcbn07XG5cbnZhciBsb2NhbGl6ZSA9IHtcbiAgb3JkaW5hbE51bWJlcjogb3JkaW5hbE51bWJlcixcbiAgZXJhOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZXJhVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogJ3dpZGUnXG4gIH0pLFxuICBxdWFydGVyOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogcXVhcnRlclZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6ICd3aWRlJyxcbiAgICBhcmd1bWVudENhbGxiYWNrOiBmdW5jdGlvbiAocXVhcnRlcikge1xuICAgICAgcmV0dXJuIHF1YXJ0ZXIgLSAxO1xuICAgIH1cbiAgfSksXG4gIG1vbnRoOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogbW9udGhWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiAnd2lkZSdcbiAgfSksXG4gIGRheTogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6ICd3aWRlJ1xuICB9KSxcbiAgZGF5UGVyaW9kOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogJ3dpZGUnLFxuICAgIGZvcm1hdHRpbmdWYWx1ZXM6IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdEZvcm1hdHRpbmdXaWR0aDogJ3dpZGUnXG4gIH0pXG59O1xuZXhwb3J0IGRlZmF1bHQgbG9jYWxpemU7IiwiaW1wb3J0IGJ1aWxkTWF0Y2hGbiBmcm9tIFwiLi4vLi4vLi4vX2xpYi9idWlsZE1hdGNoRm4vaW5kZXguanNcIjtcbmltcG9ydCBidWlsZE1hdGNoUGF0dGVybkZuIGZyb20gXCIuLi8uLi8uLi9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4vaW5kZXguanNcIjtcbnZhciBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL14oXFxkKykodGh8c3R8bmR8cmQpPy9pO1xudmFyIHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXFxkKy9pO1xudmFyIG1hdGNoRXJhUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL14oYnxhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oYlxcLj9cXHM/Y1xcLj98YlxcLj9cXHM/Y1xcLj9cXHM/ZVxcLj98YVxcLj9cXHM/ZFxcLj98Y1xcLj9cXHM/ZVxcLj8pL2ksXG4gIHdpZGU6IC9eKGJlZm9yZSBjaHJpc3R8YmVmb3JlIGNvbW1vbiBlcmF8YW5ubyBkb21pbml8Y29tbW9uIGVyYSkvaVxufTtcbnZhciBwYXJzZUVyYVBhdHRlcm5zID0ge1xuICBhbnk6IFsvXmIvaSwgL14oYXxjKS9pXVxufTtcbnZhciBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlsxMjM0XS9pLFxuICBhYmJyZXZpYXRlZDogL15xWzEyMzRdL2ksXG4gIHdpZGU6IC9eWzEyMzRdKHRofHN0fG5kfHJkKT8gcXVhcnRlci9pXG59O1xudmFyIHBhcnNlUXVhcnRlclBhdHRlcm5zID0ge1xuICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXVxufTtcbnZhciBtYXRjaE1vbnRoUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bamZtYXNvbmRdL2ksXG4gIGFiYnJldmlhdGVkOiAvXihqYW58ZmVifG1hcnxhcHJ8bWF5fGp1bnxqdWx8YXVnfHNlcHxvY3R8bm92fGRlYykvaSxcbiAgd2lkZTogL14oamFudWFyeXxmZWJydWFyeXxtYXJjaHxhcHJpbHxtYXl8anVuZXxqdWx5fGF1Z3VzdHxzZXB0ZW1iZXJ8b2N0b2Jlcnxub3ZlbWJlcnxkZWNlbWJlcikvaVxufTtcbnZhciBwYXJzZU1vbnRoUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogWy9eai9pLCAvXmYvaSwgL15tL2ksIC9eYS9pLCAvXm0vaSwgL15qL2ksIC9eai9pLCAvXmEvaSwgL15zL2ksIC9eby9pLCAvXm4vaSwgL15kL2ldLFxuICBhbnk6IFsvXmphL2ksIC9eZi9pLCAvXm1hci9pLCAvXmFwL2ksIC9ebWF5L2ksIC9eanVuL2ksIC9eanVsL2ksIC9eYXUvaSwgL15zL2ksIC9eby9pLCAvXm4vaSwgL15kL2ldXG59O1xudmFyIG1hdGNoRGF5UGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bc210d2ZdL2ksXG4gIHNob3J0OiAvXihzdXxtb3x0dXx3ZXx0aHxmcnxzYSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKHN1bnxtb258dHVlfHdlZHx0aHV8ZnJpfHNhdCkvaSxcbiAgd2lkZTogL14oc3VuZGF5fG1vbmRheXx0dWVzZGF5fHdlZG5lc2RheXx0aHVyc2RheXxmcmlkYXl8c2F0dXJkYXkpL2lcbn07XG52YXIgcGFyc2VEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbL15zL2ksIC9ebS9pLCAvXnQvaSwgL153L2ksIC9edC9pLCAvXmYvaSwgL15zL2ldLFxuICBhbnk6IFsvXnN1L2ksIC9ebS9pLCAvXnR1L2ksIC9edy9pLCAvXnRoL2ksIC9eZi9pLCAvXnNhL2ldXG59O1xudmFyIG1hdGNoRGF5UGVyaW9kUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL14oYXxwfG1pfG58KGluIHRoZXxhdCkgKG1vcm5pbmd8YWZ0ZXJub29ufGV2ZW5pbmd8bmlnaHQpKS9pLFxuICBhbnk6IC9eKFthcF1cXC4/XFxzP21cXC4/fG1pZG5pZ2h0fG5vb258KGluIHRoZXxhdCkgKG1vcm5pbmd8YWZ0ZXJub29ufGV2ZW5pbmd8bmlnaHQpKS9pXG59O1xudmFyIHBhcnNlRGF5UGVyaW9kUGF0dGVybnMgPSB7XG4gIGFueToge1xuICAgIGFtOiAvXmEvaSxcbiAgICBwbTogL15wL2ksXG4gICAgbWlkbmlnaHQ6IC9ebWkvaSxcbiAgICBub29uOiAvXm5vL2ksXG4gICAgbW9ybmluZzogL21vcm5pbmcvaSxcbiAgICBhZnRlcm5vb246IC9hZnRlcm5vb24vaSxcbiAgICBldmVuaW5nOiAvZXZlbmluZy9pLFxuICAgIG5pZ2h0OiAvbmlnaHQvaVxuICB9XG59O1xudmFyIG1hdGNoID0ge1xuICBvcmRpbmFsTnVtYmVyOiBidWlsZE1hdGNoUGF0dGVybkZuKHtcbiAgICBtYXRjaFBhdHRlcm46IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgcGFyc2VQYXR0ZXJuOiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHZhbHVlQ2FsbGJhY2s6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgfVxuICB9KSxcbiAgZXJhOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6ICd3aWRlJyxcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZUVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55J1xuICB9KSxcbiAgcXVhcnRlcjogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogJ3dpZGUnLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55JyxcbiAgICB2YWx1ZUNhbGxiYWNrOiBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgIHJldHVybiBpbmRleCArIDE7XG4gICAgfVxuICB9KSxcbiAgbW9udGg6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiAnd2lkZScsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55J1xuICB9KSxcbiAgZGF5OiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6ICd3aWRlJyxcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiAnYW55J1xuICB9KSxcbiAgZGF5UGVyaW9kOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6ICdhbnknLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6ICdhbnknXG4gIH0pXG59O1xuZXhwb3J0IGRlZmF1bHQgbWF0Y2g7IiwiaW1wb3J0IGZvcm1hdERpc3RhbmNlIGZyb20gXCIuL19saWIvZm9ybWF0RGlzdGFuY2UvaW5kZXguanNcIjtcbmltcG9ydCBmb3JtYXRMb25nIGZyb20gXCIuL19saWIvZm9ybWF0TG9uZy9pbmRleC5qc1wiO1xuaW1wb3J0IGZvcm1hdFJlbGF0aXZlIGZyb20gXCIuL19saWIvZm9ybWF0UmVsYXRpdmUvaW5kZXguanNcIjtcbmltcG9ydCBsb2NhbGl6ZSBmcm9tIFwiLi9fbGliL2xvY2FsaXplL2luZGV4LmpzXCI7XG5pbXBvcnQgbWF0Y2ggZnJvbSBcIi4vX2xpYi9tYXRjaC9pbmRleC5qc1wiO1xuXG4vKipcbiAqIEB0eXBlIHtMb2NhbGV9XG4gKiBAY2F0ZWdvcnkgTG9jYWxlc1xuICogQHN1bW1hcnkgRW5nbGlzaCBsb2NhbGUgKFVuaXRlZCBTdGF0ZXMpLlxuICogQGxhbmd1YWdlIEVuZ2xpc2hcbiAqIEBpc28tNjM5LTIgZW5nXG4gKiBAYXV0aG9yIFNhc2hhIEtvc3MgW0Brb3Nzbm9jb3JwXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20va29zc25vY29ycH1cbiAqIEBhdXRob3IgTGVzaGEgS29zcyBbQGxlc2hha29zc117QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2xlc2hha29zc31cbiAqL1xudmFyIGxvY2FsZSA9IHtcbiAgY29kZTogJ2VuLVVTJyxcbiAgZm9ybWF0RGlzdGFuY2U6IGZvcm1hdERpc3RhbmNlLFxuICBmb3JtYXRMb25nOiBmb3JtYXRMb25nLFxuICBmb3JtYXRSZWxhdGl2ZTogZm9ybWF0UmVsYXRpdmUsXG4gIGxvY2FsaXplOiBsb2NhbGl6ZSxcbiAgbWF0Y2g6IG1hdGNoLFxuICBvcHRpb25zOiB7XG4gICAgd2Vla1N0YXJ0c09uOiAwXG4gICAgLyogU3VuZGF5ICovXG4gICAgLFxuICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogMVxuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgbG9jYWxlOyIsImltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL19saWIvdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgYWRkTWlsbGlzZWNvbmRzIGZyb20gXCIuLi9hZGRNaWxsaXNlY29uZHMvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIHN1Yk1pbGxpc2Vjb25kc1xuICogQGNhdGVnb3J5IE1pbGxpc2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFN1YnRyYWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU3VidHJhY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHtOdW1iZXJ9IGFtb3VudCAtIHRoZSBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIHRvIGJlIHN1YnRyYWN0ZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgbWlsbGlzZWNvbmRzIHN1YnRyYWN0ZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gU3VidHJhY3QgNzUwIG1pbGxpc2Vjb25kcyBmcm9tIDEwIEp1bHkgMjAxNCAxMjo0NTozMC4wMDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdWJNaWxsaXNlY29uZHMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDEyLCA0NSwgMzAsIDApLCA3NTApXG4gKiAvLz0+IFRodSBKdWwgMTAgMjAxNCAxMjo0NToyOS4yNTBcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdWJNaWxsaXNlY29uZHMoZGlydHlEYXRlLCBkaXJ0eUFtb3VudCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGFtb3VudCA9IHRvSW50ZWdlcihkaXJ0eUFtb3VudCk7XG4gIHJldHVybiBhZGRNaWxsaXNlY29uZHMoZGlydHlEYXRlLCAtYW1vdW50KTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xudmFyIE1JTExJU0VDT05EU19JTl9EQVkgPSA4NjQwMDAwMDsgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGEgcGFydCBvZiBwdWJsaWMgQVBJIHdoZW4gVVRDIGZ1bmN0aW9uIHdpbGwgYmUgaW1wbGVtZW50ZWQuXG4vLyBTZWUgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9pc3N1ZXMvMzc2XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVUQ0RheU9mWWVhcihkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciB0aW1lc3RhbXAgPSBkYXRlLmdldFRpbWUoKTtcbiAgZGF0ZS5zZXRVVENNb250aCgwLCAxKTtcbiAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZZZWFyVGltZXN0YW1wID0gZGF0ZS5nZXRUaW1lKCk7XG4gIHZhciBkaWZmZXJlbmNlID0gdGltZXN0YW1wIC0gc3RhcnRPZlllYXJUaW1lc3RhbXA7XG4gIHJldHVybiBNYXRoLmZsb29yKGRpZmZlcmVuY2UgLyBNSUxMSVNFQ09ORFNfSU5fREFZKSArIDE7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjsgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGEgcGFydCBvZiBwdWJsaWMgQVBJIHdoZW4gVVRDIGZ1bmN0aW9uIHdpbGwgYmUgaW1wbGVtZW50ZWQuXG4vLyBTZWUgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9pc3N1ZXMvMzc2XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0T2ZVVENJU09XZWVrKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIHdlZWtTdGFydHNPbiA9IDE7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBkYXkgPSBkYXRlLmdldFVUQ0RheSgpO1xuICB2YXIgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyA3IDogMCkgKyBkYXkgLSB3ZWVrU3RhcnRzT247XG4gIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSAtIGRpZmYpO1xuICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZVVENJU09XZWVrIGZyb20gXCIuLi9zdGFydE9mVVRDSVNPV2Vlay9pbmRleC5qc1wiOyAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBwYXJ0IG9mIHB1YmxpYyBBUEkgd2hlbiBVVEMgZnVuY3Rpb24gd2lsbCBiZSBpbXBsZW1lbnRlZC5cbi8vIFNlZSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNzZcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VVRDSVNPV2Vla1llYXIoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgdmFyIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhci5zZXRVVENGdWxsWWVhcih5ZWFyICsgMSwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBzdGFydE9mTmV4dFllYXIgPSBzdGFydE9mVVRDSVNPV2Vlayhmb3VydGhPZkphbnVhcnlPZk5leHRZZWFyKTtcbiAgdmFyIGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRVVENGdWxsWWVhcih5ZWFyLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZUaGlzWWVhciA9IHN0YXJ0T2ZVVENJU09XZWVrKGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIpO1xuXG4gIGlmIChkYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mTmV4dFllYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXIgKyAxO1xuICB9IGVsc2UgaWYgKGRhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZUaGlzWWVhci5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geWVhciAtIDE7XG4gIH1cbn0iLCJpbXBvcnQgZ2V0VVRDSVNPV2Vla1llYXIgZnJvbSBcIi4uL2dldFVUQ0lTT1dlZWtZZWFyL2luZGV4LmpzXCI7XG5pbXBvcnQgc3RhcnRPZlVUQ0lTT1dlZWsgZnJvbSBcIi4uL3N0YXJ0T2ZVVENJU09XZWVrL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjsgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGEgcGFydCBvZiBwdWJsaWMgQVBJIHdoZW4gVVRDIGZ1bmN0aW9uIHdpbGwgYmUgaW1wbGVtZW50ZWQuXG4vLyBTZWUgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9pc3N1ZXMvMzc2XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0YXJ0T2ZVVENJU09XZWVrWWVhcihkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciB5ZWFyID0gZ2V0VVRDSVNPV2Vla1llYXIoZGlydHlEYXRlKTtcbiAgdmFyIGZvdXJ0aE9mSmFudWFyeSA9IG5ldyBEYXRlKDApO1xuICBmb3VydGhPZkphbnVhcnkuc2V0VVRDRnVsbFllYXIoeWVhciwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIGRhdGUgPSBzdGFydE9mVVRDSVNPV2Vlayhmb3VydGhPZkphbnVhcnkpO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi8uLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDSVNPV2VlayBmcm9tIFwiLi4vc3RhcnRPZlVUQ0lTT1dlZWsvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mVVRDSVNPV2Vla1llYXIgZnJvbSBcIi4uL3N0YXJ0T2ZVVENJU09XZWVrWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG52YXIgTUlMTElTRUNPTkRTX0lOX1dFRUsgPSA2MDQ4MDAwMDA7IC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBhIHBhcnQgb2YgcHVibGljIEFQSSB3aGVuIFVUQyBmdW5jdGlvbiB3aWxsIGJlIGltcGxlbWVudGVkLlxuLy8gU2VlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM3NlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRVVENJU09XZWVrKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRpZmYgPSBzdGFydE9mVVRDSVNPV2VlayhkYXRlKS5nZXRUaW1lKCkgLSBzdGFydE9mVVRDSVNPV2Vla1llYXIoZGF0ZSkuZ2V0VGltZSgpOyAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIGRheXMgdG8gdGhlIG5lYXJlc3QgaW50ZWdlclxuICAvLyBiZWNhdXNlIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIGEgd2VlayBpcyBub3QgY29uc3RhbnRcbiAgLy8gKGUuZy4gaXQncyBkaWZmZXJlbnQgaW4gdGhlIHdlZWsgb2YgdGhlIGRheWxpZ2h0IHNhdmluZyB0aW1lIGNsb2NrIHNoaWZ0KVxuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBNSUxMSVNFQ09ORFNfSU5fV0VFSykgKyAxO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uLy4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG5pbXBvcnQgc3RhcnRPZlVUQ1dlZWsgZnJvbSBcIi4uL3N0YXJ0T2ZVVENXZWVrL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi90b0ludGVnZXIvaW5kZXguanNcIjsgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGEgcGFydCBvZiBwdWJsaWMgQVBJIHdoZW4gVVRDIGZ1bmN0aW9uIHdpbGwgYmUgaW1wbGVtZW50ZWQuXG4vLyBTZWUgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9pc3N1ZXMvMzc2XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVUQ1dlZWtZZWFyKGRpcnR5RGF0ZSwgZGlydHlPcHRpb25zKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKTtcbiAgdmFyIG9wdGlvbnMgPSBkaXJ0eU9wdGlvbnMgfHwge307XG4gIHZhciBsb2NhbGUgPSBvcHRpb25zLmxvY2FsZTtcbiAgdmFyIGxvY2FsZUZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IGxvY2FsZSAmJiBsb2NhbGUub3B0aW9ucyAmJiBsb2NhbGUub3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGU7XG4gIHZhciBkZWZhdWx0Rmlyc3RXZWVrQ29udGFpbnNEYXRlID0gbG9jYWxlRmlyc3RXZWVrQ29udGFpbnNEYXRlID09IG51bGwgPyAxIDogdG9JbnRlZ2VyKGxvY2FsZUZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIHZhciBmaXJzdFdlZWtDb250YWluc0RhdGUgPSBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9PSBudWxsID8gZGVmYXVsdEZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA6IHRvSW50ZWdlcihvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7IC8vIFRlc3QgaWYgd2Vla1N0YXJ0c09uIGlzIGJldHdlZW4gMSBhbmQgNyBfYW5kXyBpcyBub3QgTmFOXG5cbiAgaWYgKCEoZmlyc3RXZWVrQ29udGFpbnNEYXRlID49IDEgJiYgZmlyc3RXZWVrQ29udGFpbnNEYXRlIDw9IDcpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2ZpcnN0V2Vla0NvbnRhaW5zRGF0ZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNyBpbmNsdXNpdmVseScpO1xuICB9XG5cbiAgdmFyIGZpcnN0V2Vla09mTmV4dFllYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRVVENGdWxsWWVhcih5ZWFyICsgMSwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZVVENXZWVrKGZpcnN0V2Vla09mTmV4dFllYXIsIGRpcnR5T3B0aW9ucyk7XG4gIHZhciBmaXJzdFdlZWtPZlRoaXNZZWFyID0gbmV3IERhdGUoMCk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0VVRDRnVsbFllYXIoeWVhciwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrT2ZUaGlzWWVhci5zZXRVVENIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZUaGlzWWVhciA9IHN0YXJ0T2ZVVENXZWVrKGZpcnN0V2Vla09mVGhpc1llYXIsIGRpcnR5T3B0aW9ucyk7XG5cbiAgaWYgKGRhdGUuZ2V0VGltZSgpID49IHN0YXJ0T2ZOZXh0WWVhci5nZXRUaW1lKCkpIHtcbiAgICByZXR1cm4geWVhciArIDE7XG4gIH0gZWxzZSBpZiAoZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZlRoaXNZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufSIsImltcG9ydCBnZXRVVENXZWVrWWVhciBmcm9tIFwiLi4vZ2V0VVRDV2Vla1llYXIvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZVVENXZWVrIGZyb20gXCIuLi9zdGFydE9mVVRDV2Vlay9pbmRleC5qc1wiO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vdG9JbnRlZ2VyL2luZGV4LmpzXCI7IC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBhIHBhcnQgb2YgcHVibGljIEFQSSB3aGVuIFVUQyBmdW5jdGlvbiB3aWxsIGJlIGltcGxlbWVudGVkLlxuLy8gU2VlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM3NlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdGFydE9mVVRDV2Vla1llYXIoZGlydHlEYXRlLCBkaXJ0eU9wdGlvbnMpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBvcHRpb25zID0gZGlydHlPcHRpb25zIHx8IHt9O1xuICB2YXIgbG9jYWxlID0gb3B0aW9ucy5sb2NhbGU7XG4gIHZhciBsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUgPSBsb2NhbGUgJiYgbG9jYWxlLm9wdGlvbnMgJiYgbG9jYWxlLm9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlO1xuICB2YXIgZGVmYXVsdEZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IGxvY2FsZUZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9PSBudWxsID8gMSA6IHRvSW50ZWdlcihsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUpO1xuICB2YXIgZmlyc3RXZWVrQ29udGFpbnNEYXRlID0gb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPT0gbnVsbCA/IGRlZmF1bHRGaXJzdFdlZWtDb250YWluc0RhdGUgOiB0b0ludGVnZXIob3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUpO1xuICB2YXIgeWVhciA9IGdldFVUQ1dlZWtZZWFyKGRpcnR5RGF0ZSwgZGlydHlPcHRpb25zKTtcbiAgdmFyIGZpcnN0V2VlayA9IG5ldyBEYXRlKDApO1xuICBmaXJzdFdlZWsuc2V0VVRDRnVsbFllYXIoeWVhciwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApO1xuICB2YXIgZGF0ZSA9IHN0YXJ0T2ZVVENXZWVrKGZpcnN0V2VlaywgZGlydHlPcHRpb25zKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgc3RhcnRPZlVUQ1dlZWsgZnJvbSBcIi4uL3N0YXJ0T2ZVVENXZWVrL2luZGV4LmpzXCI7XG5pbXBvcnQgc3RhcnRPZlVUQ1dlZWtZZWFyIGZyb20gXCIuLi9zdGFydE9mVVRDV2Vla1llYXIvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xudmFyIE1JTExJU0VDT05EU19JTl9XRUVLID0gNjA0ODAwMDAwOyAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgYSBwYXJ0IG9mIHB1YmxpYyBBUEkgd2hlbiBVVEMgZnVuY3Rpb24gd2lsbCBiZSBpbXBsZW1lbnRlZC5cbi8vIFNlZSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNzZcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0VVRDV2VlayhkaXJ0eURhdGUsIG9wdGlvbnMpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciBkaWZmID0gc3RhcnRPZlVUQ1dlZWsoZGF0ZSwgb3B0aW9ucykuZ2V0VGltZSgpIC0gc3RhcnRPZlVUQ1dlZWtZZWFyKGRhdGUsIG9wdGlvbnMpLmdldFRpbWUoKTsgLy8gUm91bmQgdGhlIG51bWJlciBvZiBkYXlzIHRvIHRoZSBuZWFyZXN0IGludGVnZXJcbiAgLy8gYmVjYXVzZSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50XG4gIC8vIChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdClcblxuICByZXR1cm4gTWF0aC5yb3VuZChkaWZmIC8gTUlMTElTRUNPTkRTX0lOX1dFRUspICsgMTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRMZWFkaW5nWmVyb3MobnVtYmVyLCB0YXJnZXRMZW5ndGgpIHtcbiAgdmFyIHNpZ24gPSBudW1iZXIgPCAwID8gJy0nIDogJyc7XG4gIHZhciBvdXRwdXQgPSBNYXRoLmFicyhudW1iZXIpLnRvU3RyaW5nKCk7XG5cbiAgd2hpbGUgKG91dHB1dC5sZW5ndGggPCB0YXJnZXRMZW5ndGgpIHtcbiAgICBvdXRwdXQgPSAnMCcgKyBvdXRwdXQ7XG4gIH1cblxuICByZXR1cm4gc2lnbiArIG91dHB1dDtcbn0iLCJpbXBvcnQgYWRkTGVhZGluZ1plcm9zIGZyb20gXCIuLi8uLi9hZGRMZWFkaW5nWmVyb3MvaW5kZXguanNcIjtcbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICovXG5cbnZhciBmb3JtYXR0ZXJzID0ge1xuICAvLyBZZWFyXG4gIHk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIC8vIEZyb20gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS0zMS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9Gb3JtYXRfdG9rZW5zXG4gICAgLy8gfCBZZWFyICAgICB8ICAgICB5IHwgeXkgfCAgIHl5eSB8ICB5eXl5IHwgeXl5eXkgfFxuICAgIC8vIHwtLS0tLS0tLS0tfC0tLS0tLS18LS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXxcbiAgICAvLyB8IEFEIDEgICAgIHwgICAgIDEgfCAwMSB8ICAgMDAxIHwgIDAwMDEgfCAwMDAwMSB8XG4gICAgLy8gfCBBRCAxMiAgICB8ICAgIDEyIHwgMTIgfCAgIDAxMiB8ICAwMDEyIHwgMDAwMTIgfFxuICAgIC8vIHwgQUQgMTIzICAgfCAgIDEyMyB8IDIzIHwgICAxMjMgfCAgMDEyMyB8IDAwMTIzIHxcbiAgICAvLyB8IEFEIDEyMzQgIHwgIDEyMzQgfCAzNCB8ICAxMjM0IHwgIDEyMzQgfCAwMTIzNCB8XG4gICAgLy8gfCBBRCAxMjM0NSB8IDEyMzQ1IHwgNDUgfCAxMjM0NSB8IDEyMzQ1IHwgMTIzNDUgfFxuICAgIHZhciBzaWduZWRZZWFyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpOyAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuXG4gICAgdmFyIHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRva2VuID09PSAneXknID8geWVhciAlIDEwMCA6IHllYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIHZhciBtb250aCA9IGRhdGUuZ2V0VVRDTW9udGgoKTtcbiAgICByZXR1cm4gdG9rZW4gPT09ICdNJyA/IFN0cmluZyhtb250aCArIDEpIDogYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gIH0sXG4gIC8vIERheSBvZiB0aGUgbW9udGhcbiAgZDogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFVUQ0RhdGUoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gQU0gb3IgUE1cbiAgYTogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgdmFyIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRhdGUuZ2V0VVRDSG91cnMoKSAvIDEyID49IDEgPyAncG0nIDogJ2FtJztcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgY2FzZSAnYWEnOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgIGNhc2UgJ2FhYSc6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWU7XG5cbiAgICAgIGNhc2UgJ2FhYWFhJzpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZVswXTtcblxuICAgICAgY2FzZSAnYWFhYSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlID09PSAnYW0nID8gJ2EubS4nIDogJ3AubS4nO1xuICAgIH1cbiAgfSxcbiAgLy8gSG91ciBbMS0xMl1cbiAgaDogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFVUQ0hvdXJzKCkgJSAxMiB8fCAxMiwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gSG91ciBbMC0yM11cbiAgSDogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFVUQ0hvdXJzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIE1pbnV0ZVxuICBtOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRhdGUuZ2V0VVRDTWludXRlcygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBTZWNvbmRcbiAgczogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldFVUQ1NlY29uZHMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gRnJhY3Rpb24gb2Ygc2Vjb25kXG4gIFM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIHZhciBudW1iZXJPZkRpZ2l0cyA9IHRva2VuLmxlbmd0aDtcbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKTtcbiAgICB2YXIgZnJhY3Rpb25hbFNlY29uZHMgPSBNYXRoLmZsb29yKG1pbGxpc2Vjb25kcyAqIE1hdGgucG93KDEwLCBudW1iZXJPZkRpZ2l0cyAtIDMpKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGZyYWN0aW9uYWxTZWNvbmRzLCB0b2tlbi5sZW5ndGgpO1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgZm9ybWF0dGVyczsiLCJpbXBvcnQgZ2V0VVRDRGF5T2ZZZWFyIGZyb20gXCIuLi8uLi8uLi9fbGliL2dldFVUQ0RheU9mWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IGdldFVUQ0lTT1dlZWsgZnJvbSBcIi4uLy4uLy4uL19saWIvZ2V0VVRDSVNPV2Vlay9pbmRleC5qc1wiO1xuaW1wb3J0IGdldFVUQ0lTT1dlZWtZZWFyIGZyb20gXCIuLi8uLi8uLi9fbGliL2dldFVUQ0lTT1dlZWtZZWFyL2luZGV4LmpzXCI7XG5pbXBvcnQgZ2V0VVRDV2VlayBmcm9tIFwiLi4vLi4vLi4vX2xpYi9nZXRVVENXZWVrL2luZGV4LmpzXCI7XG5pbXBvcnQgZ2V0VVRDV2Vla1llYXIgZnJvbSBcIi4uLy4uLy4uL19saWIvZ2V0VVRDV2Vla1llYXIvaW5kZXguanNcIjtcbmltcG9ydCBhZGRMZWFkaW5nWmVyb3MgZnJvbSBcIi4uLy4uL2FkZExlYWRpbmdaZXJvcy9pbmRleC5qc1wiO1xuaW1wb3J0IGxpZ2h0Rm9ybWF0dGVycyBmcm9tIFwiLi4vbGlnaHRGb3JtYXR0ZXJzL2luZGV4LmpzXCI7XG52YXIgZGF5UGVyaW9kRW51bSA9IHtcbiAgYW06ICdhbScsXG4gIHBtOiAncG0nLFxuICBtaWRuaWdodDogJ21pZG5pZ2h0JyxcbiAgbm9vbjogJ25vb24nLFxuICBtb3JuaW5nOiAnbW9ybmluZycsXG4gIGFmdGVybm9vbjogJ2FmdGVybm9vbicsXG4gIGV2ZW5pbmc6ICdldmVuaW5nJyxcbiAgbmlnaHQ6ICduaWdodCdcbn07XG4vKlxuICogfCAgICAgfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCAgYSAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgfCAgQSogfCBNaWxsaXNlY29uZHMgaW4gZGF5ICAgICAgICAgICAgfFxuICogfCAgYiAgfCBBTSwgUE0sIG5vb24sIG1pZG5pZ2h0ICAgICAgICAgfCAgQiAgfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgfFxuICogfCAgYyAgfCBTdGFuZC1hbG9uZSBsb2NhbCBkYXkgb2Ygd2VlayAgfCAgQyogfCBMb2NhbGl6ZWQgaG91ciB3LyBkYXkgcGVyaW9kICAgfFxuICogfCAgZCAgfCBEYXkgb2YgbW9udGggICAgICAgICAgICAgICAgICAgfCAgRCAgfCBEYXkgb2YgeWVhciAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgZSAgfCBMb2NhbCBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgfCAgRSAgfCBEYXkgb2Ygd2VlayAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgZiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgRiogfCBEYXkgb2Ygd2VlayBpbiBtb250aCAgICAgICAgICAgfFxuICogfCAgZyogfCBNb2RpZmllZCBKdWxpYW4gZGF5ICAgICAgICAgICAgfCAgRyAgfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgaCAgfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgfCAgSCAgfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgaSEgfCBJU08gZGF5IG9mIHdlZWsgICAgICAgICAgICAgICAgfCAgSSEgfCBJU08gd2VlayBvZiB5ZWFyICAgICAgICAgICAgICAgfFxuICogfCAgaiogfCBMb2NhbGl6ZWQgaG91ciB3LyBkYXkgcGVyaW9kICAgfCAgSiogfCBMb2NhbGl6ZWQgaG91ciB3L28gZGF5IHBlcmlvZCAgfFxuICogfCAgayAgfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgfCAgSyAgfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbCogfCAoZGVwcmVjYXRlZCkgICAgICAgICAgICAgICAgICAgfCAgTCAgfCBTdGFuZC1hbG9uZSBtb250aCAgICAgICAgICAgICAgfFxuICogfCAgbSAgfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTSAgfCBNb250aCAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgbyEgfCBPcmRpbmFsIG51bWJlciBtb2RpZmllciAgICAgICAgfCAgTyAgfCBUaW1lem9uZSAoR01UKSAgICAgICAgICAgICAgICAgfFxuICogfCAgcCEgfCBMb25nIGxvY2FsaXplZCB0aW1lICAgICAgICAgICAgfCAgUCEgfCBMb25nIGxvY2FsaXplZCBkYXRlICAgICAgICAgICAgfFxuICogfCAgcSAgfCBTdGFuZC1hbG9uZSBxdWFydGVyICAgICAgICAgICAgfCAgUSAgfCBRdWFydGVyICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgciogfCBSZWxhdGVkIEdyZWdvcmlhbiB5ZWFyICAgICAgICAgfCAgUiEgfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgfFxuICogfCAgcyAgfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgfCAgUyAgfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgfFxuICogfCAgdCEgfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgfCAgVCEgfCBNaWxsaXNlY29uZHMgdGltZXN0YW1wICAgICAgICAgfFxuICogfCAgdSAgfCBFeHRlbmRlZCB5ZWFyICAgICAgICAgICAgICAgICAgfCAgVSogfCBDeWNsaWMgeWVhciAgICAgICAgICAgICAgICAgICAgfFxuICogfCAgdiogfCBUaW1lem9uZSAoZ2VuZXJpYyBub24tbG9jYXQuKSAgfCAgViogfCBUaW1lem9uZSAobG9jYXRpb24pICAgICAgICAgICAgfFxuICogfCAgdyAgfCBMb2NhbCB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgfCAgVyogfCBXZWVrIG9mIG1vbnRoICAgICAgICAgICAgICAgICAgfFxuICogfCAgeCAgfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgfCAgWCAgfCBUaW1lem9uZSAoSVNPLTg2MDEpICAgICAgICAgICAgfFxuICogfCAgeSAgfCBZZWFyIChhYnMpICAgICAgICAgICAgICAgICAgICAgfCAgWSAgfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgfFxuICogfCAgeiAgfCBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0LikgfCAgWiogfCBUaW1lem9uZSAoYWxpYXNlcykgICAgICAgICAgICAgfFxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICogYXJlIG5vdCBpbXBsZW1lbnRlZCBidXQgcmVzZXJ2ZWQgYnkgVW5pY29kZSBzdGFuZGFyZC5cbiAqXG4gKiBMZXR0ZXJzIG1hcmtlZCBieSAhIGFyZSBub24tc3RhbmRhcmQsIGJ1dCBpbXBsZW1lbnRlZCBieSBkYXRlLWZuczpcbiAqIC0gYG9gIG1vZGlmaWVzIHRoZSBwcmV2aW91cyB0b2tlbiB0byB0dXJuIGl0IGludG8gYW4gb3JkaW5hbCAoc2VlIGBmb3JtYXRgIGRvY3MpXG4gKiAtIGBpYCBpcyBJU08gZGF5IG9mIHdlZWsuIEZvciBgaWAgYW5kIGBpaWAgaXMgcmV0dXJucyBudW1lcmljIElTTyB3ZWVrIGRheXMsXG4gKiAgIGkuZS4gNyBmb3IgU3VuZGF5LCAxIGZvciBNb25kYXksIGV0Yy5cbiAqIC0gYElgIGlzIElTTyB3ZWVrIG9mIHllYXIsIGFzIG9wcG9zZWQgdG8gYHdgIHdoaWNoIGlzIGxvY2FsIHdlZWsgb2YgeWVhci5cbiAqIC0gYFJgIGlzIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyLCBhcyBvcHBvc2VkIHRvIGBZYCB3aGljaCBpcyBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyLlxuICogICBgUmAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGBJYCBhbmQgYGlgXG4gKiAgIGZvciB1bml2ZXJzYWwgSVNPIHdlZWstbnVtYmVyaW5nIGRhdGUsIHdoZXJlYXNcbiAqICAgYFlgIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgd2AgYW5kIGBlYFxuICogICBmb3Igd2Vlay1udW1iZXJpbmcgZGF0ZSBzcGVjaWZpYyB0byB0aGUgbG9jYWxlLlxuICogLSBgUGAgaXMgbG9uZyBsb2NhbGl6ZWQgZGF0ZSBmb3JtYXRcbiAqIC0gYHBgIGlzIGxvbmcgbG9jYWxpemVkIHRpbWUgZm9ybWF0XG4gKi9cblxudmFyIGZvcm1hdHRlcnMgPSB7XG4gIC8vIEVyYVxuICBHOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIGVyYSA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKSA+IDAgPyAxIDogMDtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIEFELCBCQ1xuICAgICAgY2FzZSAnRyc6XG4gICAgICBjYXNlICdHRyc6XG4gICAgICBjYXNlICdHR0cnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZXJhKGVyYSwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnXG4gICAgICAgIH0pO1xuICAgICAgLy8gQSwgQlxuXG4gICAgICBjYXNlICdHR0dHRyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnXG4gICAgICAgIH0pO1xuICAgICAgLy8gQW5ubyBEb21pbmksIEJlZm9yZSBDaHJpc3RcblxuICAgICAgY2FzZSAnR0dHRyc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZXJhKGVyYSwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZSdcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBZZWFyXG4gIHk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICAvLyBPcmRpbmFsIG51bWJlclxuICAgIGlmICh0b2tlbiA9PT0gJ3lvJykge1xuICAgICAgdmFyIHNpZ25lZFllYXIgPSBkYXRlLmdldFVUQ0Z1bGxZZWFyKCk7IC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG5cbiAgICAgIHZhciB5ZWFyID0gc2lnbmVkWWVhciA+IDAgPyBzaWduZWRZZWFyIDogMSAtIHNpZ25lZFllYXI7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih5ZWFyLCB7XG4gICAgICAgIHVuaXQ6ICd5ZWFyJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy55KGRhdGUsIHRva2VuKTtcbiAgfSxcbiAgLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICBZOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIHNpZ25lZFdlZWtZZWFyID0gZ2V0VVRDV2Vla1llYXIoZGF0ZSwgb3B0aW9ucyk7IC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG5cbiAgICB2YXIgd2Vla1llYXIgPSBzaWduZWRXZWVrWWVhciA+IDAgPyBzaWduZWRXZWVrWWVhciA6IDEgLSBzaWduZWRXZWVrWWVhcjsgLy8gVHdvIGRpZ2l0IHllYXJcblxuICAgIGlmICh0b2tlbiA9PT0gJ1lZJykge1xuICAgICAgdmFyIHR3b0RpZ2l0WWVhciA9IHdlZWtZZWFyICUgMTAwO1xuICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh0d29EaWdpdFllYXIsIDIpO1xuICAgIH0gLy8gT3JkaW5hbCBudW1iZXJcblxuXG4gICAgaWYgKHRva2VuID09PSAnWW8nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrWWVhciwge1xuICAgICAgICB1bml0OiAneWVhcidcbiAgICAgIH0pO1xuICAgIH0gLy8gUGFkZGluZ1xuXG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWtZZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICBSOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICB2YXIgaXNvV2Vla1llYXIgPSBnZXRVVENJU09XZWVrWWVhcihkYXRlKTsgLy8gUGFkZGluZ1xuXG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29XZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gRXh0ZW5kZWQgeWVhci4gVGhpcyBpcyBhIHNpbmdsZSBudW1iZXIgZGVzaWduYXRpbmcgdGhlIHllYXIgb2YgdGhpcyBjYWxlbmRhciBzeXN0ZW0uXG4gIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBsb2NhbGl6ZXJzIGFyZSBCLkMuIHllYXJzOlxuICAvLyB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICAvLyB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICAvLyB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICAvLyB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICAvLyB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICAvLyBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gIC8vIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZC5cbiAgdTogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgdmFyIHllYXIgPSBkYXRlLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh5ZWFyLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBRdWFydGVyXG4gIFE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRVVENNb250aCgpICsgMSkgLyAzKTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgJ1EnOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcblxuICAgICAgY2FzZSAnUVEnOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG5cbiAgICAgIGNhc2UgJ1FvJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIocXVhcnRlciwge1xuICAgICAgICAgIHVuaXQ6ICdxdWFydGVyJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG5cbiAgICAgIGNhc2UgJ1FRUSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyAxLCAyLCAzLCA0IChuYXJyb3cgcXVhcnRlcjsgY291bGQgYmUgbm90IG51bWVyaWNhbClcblxuICAgICAgY2FzZSAnUVFRUVEnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG5cbiAgICAgIGNhc2UgJ1FRUVEnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gU3RhbmQtYWxvbmUgcXVhcnRlclxuICBxOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIHF1YXJ0ZXIgPSBNYXRoLmNlaWwoKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpIC8gMyk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlICdxJzpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhxdWFydGVyKTtcbiAgICAgIC8vIDAxLCAwMiwgMDMsIDA0XG5cbiAgICAgIGNhc2UgJ3FxJzpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhxdWFydGVyLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAzcmQsIDR0aFxuXG4gICAgICBjYXNlICdxbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB1bml0OiAncXVhcnRlcidcbiAgICAgICAgfSk7XG4gICAgICAvLyBRMSwgUTIsIFEzLCBRNFxuXG4gICAgICBjYXNlICdxcXEnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUucXVhcnRlcihxdWFydGVyLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG5cbiAgICAgIGNhc2UgJ3FxcXFxJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiAnbmFycm93JyxcbiAgICAgICAgICBjb250ZXh0OiAnc3RhbmRhbG9uZSdcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuXG4gICAgICBjYXNlICdxcXFxJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgbW9udGggPSBkYXRlLmdldFVUQ01vbnRoKCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlICdNJzpcbiAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5NKGRhdGUsIHRva2VuKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDEydGhcblxuICAgICAgY2FzZSAnTW8nOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihtb250aCArIDEsIHtcbiAgICAgICAgICB1bml0OiAnbW9udGgnXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFuLCBGZWIsIC4uLiwgRGVjXG5cbiAgICAgIGNhc2UgJ01NTSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuXG4gICAgICBjYXNlICdNTU1NTSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiAnbmFycm93JyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBKYW51YXJ5LCBGZWJydWFyeSwgLi4uLCBEZWNlbWJlclxuXG4gICAgICBjYXNlICdNTU1NJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gU3RhbmQtYWxvbmUgbW9udGhcbiAgTDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBtb250aCA9IGRhdGUuZ2V0VVRDTW9udGgoKTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgJ0wnOlxuICAgICAgICByZXR1cm4gU3RyaW5nKG1vbnRoICsgMSk7XG4gICAgICAvLyAwMSwgMDIsIC4uLiwgMTJcblxuICAgICAgY2FzZSAnTEwnOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG5cbiAgICAgIGNhc2UgJ0xvJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7XG4gICAgICAgICAgdW5pdDogJ21vbnRoJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuXG4gICAgICBjYXNlICdMTEwnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnc3RhbmRhbG9uZSdcbiAgICAgICAgfSk7XG4gICAgICAvLyBKLCBGLCAuLi4sIERcblxuICAgICAgY2FzZSAnTExMTEwnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgICAgLy8gSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXJcblxuICAgICAgY2FzZSAnTExMTCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIExvY2FsIHdlZWsgb2YgeWVhclxuICB3OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIHdlZWsgPSBnZXRVVENXZWVrKGRhdGUsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHRva2VuID09PSAnd28nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrLCB7XG4gICAgICAgIHVuaXQ6ICd3ZWVrJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh3ZWVrLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBJU08gd2VlayBvZiB5ZWFyXG4gIEk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaXNvV2VlayA9IGdldFVUQ0lTT1dlZWsoZGF0ZSk7XG5cbiAgICBpZiAodG9rZW4gPT09ICdJbycpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGlzb1dlZWssIHtcbiAgICAgICAgdW5pdDogJ3dlZWsnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGlzb1dlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG4gIC8vIERheSBvZiB0aGUgbW9udGhcbiAgZDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gJ2RvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRVVENEYXRlKCksIHtcbiAgICAgICAgdW5pdDogJ2RhdGUnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLmQoZGF0ZSwgdG9rZW4pO1xuICB9LFxuICAvLyBEYXkgb2YgeWVhclxuICBEOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIGRheU9mWWVhciA9IGdldFVUQ0RheU9mWWVhcihkYXRlKTtcblxuICAgIGlmICh0b2tlbiA9PT0gJ0RvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF5T2ZZZWFyLCB7XG4gICAgICAgIHVuaXQ6ICdkYXlPZlllYXInXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRheU9mWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gRGF5IG9mIHdlZWtcbiAgRTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIHZhciBkYXlPZldlZWsgPSBkYXRlLmdldFVUQ0RheSgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gVHVlXG4gICAgICBjYXNlICdFJzpcbiAgICAgIGNhc2UgJ0VFJzpcbiAgICAgIGNhc2UgJ0VFRSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuXG4gICAgICBjYXNlICdFRUVFRSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG5cbiAgICAgIGNhc2UgJ0VFRUVFRSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdzaG9ydCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuXG4gICAgICBjYXNlICdFRUVFJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBMb2NhbCBkYXkgb2Ygd2Vla1xuICBlOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIGRheU9mV2VlayA9IGRhdGUuZ2V0VVRDRGF5KCk7XG4gICAgdmFyIGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKE50aCBkYXkgb2Ygd2VlayB3aXRoIGN1cnJlbnQgbG9jYWxlIG9yIHdlZWtTdGFydHNPbilcbiAgICAgIGNhc2UgJ2UnOlxuICAgICAgICByZXR1cm4gU3RyaW5nKGxvY2FsRGF5T2ZXZWVrKTtcbiAgICAgIC8vIFBhZGRlZCBudW1lcmljYWwgdmFsdWVcblxuICAgICAgY2FzZSAnZWUnOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGxvY2FsRGF5T2ZXZWVrLCAyKTtcbiAgICAgIC8vIDFzdCwgMm5kLCAuLi4sIDd0aFxuXG4gICAgICBjYXNlICdlbyc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGxvY2FsRGF5T2ZXZWVrLCB7XG4gICAgICAgICAgdW5pdDogJ2RheSdcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2VlZSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuXG4gICAgICBjYXNlICdlZWVlZSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG5cbiAgICAgIGNhc2UgJ2VlZWVlZSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICdzaG9ydCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVlc2RheVxuXG4gICAgICBjYXNlICdlZWVlJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6ICd3aWRlJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuICAvLyBTdGFuZC1hbG9uZSBsb2NhbCBkYXkgb2Ygd2Vla1xuICBjOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIGRheU9mV2VlayA9IGRhdGUuZ2V0VVRDRGF5KCk7XG4gICAgdmFyIGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBOdW1lcmljYWwgdmFsdWUgKHNhbWUgYXMgaW4gYGVgKVxuICAgICAgY2FzZSAnYyc6XG4gICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspO1xuICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZVxuXG4gICAgICBjYXNlICdjYyc6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcblxuICAgICAgY2FzZSAnY28nOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2Vlaywge1xuICAgICAgICAgIHVuaXQ6ICdkYXknXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdjY2MnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFRcblxuICAgICAgY2FzZSAnY2NjY2MnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnbmFycm93JyxcbiAgICAgICAgICBjb250ZXh0OiAnc3RhbmRhbG9uZSdcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdVxuXG4gICAgICBjYXNlICdjY2NjY2MnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnc2hvcnQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdzdGFuZGFsb25lJ1xuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcblxuICAgICAgY2FzZSAnY2NjYyc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ3N0YW5kYWxvbmUnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gSVNPIGRheSBvZiB3ZWVrXG4gIGk6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgZGF5T2ZXZWVrID0gZGF0ZS5nZXRVVENEYXkoKTtcbiAgICB2YXIgaXNvRGF5T2ZXZWVrID0gZGF5T2ZXZWVrID09PSAwID8gNyA6IGRheU9mV2VlaztcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDJcbiAgICAgIGNhc2UgJ2knOlxuICAgICAgICByZXR1cm4gU3RyaW5nKGlzb0RheU9mV2Vlayk7XG4gICAgICAvLyAwMlxuXG4gICAgICBjYXNlICdpaSc6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvRGF5T2ZXZWVrLCB0b2tlbi5sZW5ndGgpO1xuICAgICAgLy8gMm5kXG5cbiAgICAgIGNhc2UgJ2lvJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaXNvRGF5T2ZXZWVrLCB7XG4gICAgICAgICAgdW5pdDogJ2RheSdcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVcblxuICAgICAgY2FzZSAnaWlpJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ2FiYnJldmlhdGVkJyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBUXG5cbiAgICAgIGNhc2UgJ2lpaWlpJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ25hcnJvdycsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcblxuICAgICAgY2FzZSAnaWlpaWlpJzpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ3Nob3J0JyxcbiAgICAgICAgICBjb250ZXh0OiAnZm9ybWF0dGluZydcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG5cbiAgICAgIGNhc2UgJ2lpaWknOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogJ3dpZGUnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIC8vIEFNIG9yIFBNXG4gIGE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCk7XG4gICAgdmFyIGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/ICdwbScgOiAnYW0nO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSAnYSc6XG4gICAgICBjYXNlICdhYSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdhYWEnOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBjYXNlICdhYWFhYSc6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnYWFhYSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gQU0sIFBNLCBtaWRuaWdodCwgbm9vblxuICBiOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIGhvdXJzID0gZGF0ZS5nZXRVVENIb3VycygpO1xuICAgIHZhciBkYXlQZXJpb2RFbnVtVmFsdWU7XG5cbiAgICBpZiAoaG91cnMgPT09IDEyKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA9PT0gMCkge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5taWRuaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gaG91cnMgLyAxMiA+PSAxID8gJ3BtJyA6ICdhbSc7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSAnYic6XG4gICAgICBjYXNlICdiYic6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdiYmInOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnYWJicmV2aWF0ZWQnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBjYXNlICdiYmJiYic6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnYmJiYic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gaW4gdGhlIG1vcm5pbmcsIGluIHRoZSBhZnRlcm5vb24sIGluIHRoZSBldmVuaW5nLCBhdCBuaWdodFxuICBCOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIGhvdXJzID0gZGF0ZS5nZXRVVENIb3VycygpO1xuICAgIHZhciBkYXlQZXJpb2RFbnVtVmFsdWU7XG5cbiAgICBpZiAoaG91cnMgPj0gMTcpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0uZXZlbmluZztcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDEyKSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmFmdGVybm9vbjtcbiAgICB9IGVsc2UgaWYgKGhvdXJzID49IDQpIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubW9ybmluZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5uaWdodDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlICdCJzpcbiAgICAgIGNhc2UgJ0JCJzpcbiAgICAgIGNhc2UgJ0JCQic6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICdhYmJyZXZpYXRlZCcsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdCQkJCQic6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6ICduYXJyb3cnLFxuICAgICAgICAgIGNvbnRleHQ6ICdmb3JtYXR0aW5nJ1xuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnQkJCQic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiAnd2lkZScsXG4gICAgICAgICAgY29udGV4dDogJ2Zvcm1hdHRpbmcnXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgLy8gSG91ciBbMS0xMl1cbiAgaDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gJ2hvJykge1xuICAgICAgdmFyIGhvdXJzID0gZGF0ZS5nZXRVVENIb3VycygpICUgMTI7XG4gICAgICBpZiAoaG91cnMgPT09IDApIGhvdXJzID0gMTI7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3Vycywge1xuICAgICAgICB1bml0OiAnaG91cidcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuaChkYXRlLCB0b2tlbik7XG4gIH0sXG4gIC8vIEhvdXIgWzAtMjNdXG4gIEg6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09ICdIbycpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0VVRDSG91cnMoKSwge1xuICAgICAgICB1bml0OiAnaG91cidcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuSChkYXRlLCB0b2tlbik7XG4gIH0sXG4gIC8vIEhvdXIgWzAtMTFdXG4gIEs6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCkgJSAxMjtcblxuICAgIGlmICh0b2tlbiA9PT0gJ0tvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHtcbiAgICAgICAgdW5pdDogJ2hvdXInXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGhvdXJzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBIb3VyIFsxLTI0XVxuICBrOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgdmFyIGhvdXJzID0gZGF0ZS5nZXRVVENIb3VycygpO1xuICAgIGlmIChob3VycyA9PT0gMCkgaG91cnMgPSAyNDtcblxuICAgIGlmICh0b2tlbiA9PT0gJ2tvJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaG91cnMsIHtcbiAgICAgICAgdW5pdDogJ2hvdXInXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGhvdXJzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuICAvLyBNaW51dGVcbiAgbTogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gJ21vJykge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRVVENNaW51dGVzKCksIHtcbiAgICAgICAgdW5pdDogJ21pbnV0ZSdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMubShkYXRlLCB0b2tlbik7XG4gIH0sXG4gIC8vIFNlY29uZFxuICBzOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSAnc28nKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldFVUQ1NlY29uZHMoKSwge1xuICAgICAgICB1bml0OiAnc2Vjb25kJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5zKGRhdGUsIHRva2VuKTtcbiAgfSxcbiAgLy8gRnJhY3Rpb24gb2Ygc2Vjb25kXG4gIFM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuUyhkYXRlLCB0b2tlbik7XG4gIH0sXG4gIC8vIFRpbWV6b25lIChJU08tODYwMS4gSWYgb2Zmc2V0IGlzIDAsIG91dHB1dCBpcyBhbHdheXMgYCdaJ2ApXG4gIFg6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIG9yaWdpbmFsRGF0ZSA9IG9wdGlvbnMuX29yaWdpbmFsRGF0ZSB8fCBkYXRlO1xuICAgIHZhciB0aW1lem9uZU9mZnNldCA9IG9yaWdpbmFsRGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgaWYgKHRpbWV6b25lT2Zmc2V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gJ1onO1xuICAgIH1cblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIEhvdXJzIGFuZCBvcHRpb25hbCBtaW51dGVzXG4gICAgICBjYXNlICdYJzpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyh0aW1lem9uZU9mZnNldCk7XG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWGBcblxuICAgICAgY2FzZSAnWFhYWCc6XG4gICAgICBjYXNlICdYWCc6XG4gICAgICAgIC8vIEhvdXJzIGFuZCBtaW51dGVzIHdpdGhvdXQgYDpgIGRlbGltaXRlclxuICAgICAgICByZXR1cm4gZm9ybWF0VGltZXpvbmUodGltZXpvbmVPZmZzZXQpO1xuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgWFhYYFxuXG4gICAgICBjYXNlICdYWFhYWCc6XG4gICAgICBjYXNlICdYWFgnOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0LCAnOicpO1xuICAgIH1cbiAgfSxcbiAgLy8gVGltZXpvbmUgKElTTy04NjAxLiBJZiBvZmZzZXQgaXMgMCwgb3V0cHV0IGlzIGAnKzAwOjAwJ2Agb3IgZXF1aXZhbGVudClcbiAgeDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBfbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICB2YXIgb3JpZ2luYWxEYXRlID0gb3B0aW9ucy5fb3JpZ2luYWxEYXRlIHx8IGRhdGU7XG4gICAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gb3JpZ2luYWxEYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBIb3VycyBhbmQgb3B0aW9uYWwgbWludXRlc1xuICAgICAgY2FzZSAneCc6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuICAgICAgLy8gSG91cnMsIG1pbnV0ZXMgYW5kIG9wdGlvbmFsIHNlY29uZHMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAvLyBOb3RlOiBuZWl0aGVyIElTTy04NjAxIG5vciBKYXZhU2NyaXB0IHN1cHBvcnRzIHNlY29uZHMgaW4gdGltZXpvbmUgb2Zmc2V0c1xuICAgICAgLy8gc28gdGhpcyB0b2tlbiBhbHdheXMgaGFzIHRoZSBzYW1lIG91dHB1dCBhcyBgeHhgXG5cbiAgICAgIGNhc2UgJ3h4eHgnOlxuICAgICAgY2FzZSAneHgnOlxuICAgICAgICAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKHRpbWV6b25lT2Zmc2V0KTtcbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4eGBcblxuICAgICAgY2FzZSAneHh4eHgnOlxuICAgICAgY2FzZSAneHh4JzogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aCBgOmAgZGVsaW1pdGVyXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICB9XG4gIH0sXG4gIC8vIFRpbWV6b25lIChHTVQpXG4gIE86IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIG9yaWdpbmFsRGF0ZSA9IG9wdGlvbnMuX29yaWdpbmFsRGF0ZSB8fCBkYXRlO1xuICAgIHZhciB0aW1lem9uZU9mZnNldCA9IG9yaWdpbmFsRGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgJ08nOlxuICAgICAgY2FzZSAnT08nOlxuICAgICAgY2FzZSAnT09PJzpcbiAgICAgICAgcmV0dXJuICdHTVQnICsgZm9ybWF0VGltZXpvbmVTaG9ydCh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICAgIC8vIExvbmdcblxuICAgICAgY2FzZSAnT09PTyc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ0dNVCcgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICB9XG4gIH0sXG4gIC8vIFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXRpb24pXG4gIHo6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIG9yaWdpbmFsRGF0ZSA9IG9wdGlvbnMuX29yaWdpbmFsRGF0ZSB8fCBkYXRlO1xuICAgIHZhciB0aW1lem9uZU9mZnNldCA9IG9yaWdpbmFsRGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgJ3onOlxuICAgICAgY2FzZSAnenonOlxuICAgICAgY2FzZSAnenp6JzpcbiAgICAgICAgcmV0dXJuICdHTVQnICsgZm9ybWF0VGltZXpvbmVTaG9ydCh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICAgIC8vIExvbmdcblxuICAgICAgY2FzZSAnenp6eic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ0dNVCcgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgJzonKTtcbiAgICB9XG4gIH0sXG4gIC8vIFNlY29uZHMgdGltZXN0YW1wXG4gIHQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgdmFyIG9yaWdpbmFsRGF0ZSA9IG9wdGlvbnMuX29yaWdpbmFsRGF0ZSB8fCBkYXRlO1xuICAgIHZhciB0aW1lc3RhbXAgPSBNYXRoLmZsb29yKG9yaWdpbmFsRGF0ZS5nZXRUaW1lKCkgLyAxMDAwKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbiAgLy8gTWlsbGlzZWNvbmRzIHRpbWVzdGFtcFxuICBUOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSwgb3B0aW9ucykge1xuICAgIHZhciBvcmlnaW5hbERhdGUgPSBvcHRpb25zLl9vcmlnaW5hbERhdGUgfHwgZGF0ZTtcbiAgICB2YXIgdGltZXN0YW1wID0gb3JpZ2luYWxEYXRlLmdldFRpbWUoKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZm9ybWF0VGltZXpvbmVTaG9ydChvZmZzZXQsIGRpcnR5RGVsaW1pdGVyKSB7XG4gIHZhciBzaWduID0gb2Zmc2V0ID4gMCA/ICctJyA6ICcrJztcbiAgdmFyIGFic09mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7XG4gIHZhciBob3VycyA9IE1hdGguZmxvb3IoYWJzT2Zmc2V0IC8gNjApO1xuICB2YXIgbWludXRlcyA9IGFic09mZnNldCAlIDYwO1xuXG4gIGlmIChtaW51dGVzID09PSAwKSB7XG4gICAgcmV0dXJuIHNpZ24gKyBTdHJpbmcoaG91cnMpO1xuICB9XG5cbiAgdmFyIGRlbGltaXRlciA9IGRpcnR5RGVsaW1pdGVyIHx8ICcnO1xuICByZXR1cm4gc2lnbiArIFN0cmluZyhob3VycykgKyBkZWxpbWl0ZXIgKyBhZGRMZWFkaW5nWmVyb3MobWludXRlcywgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyhvZmZzZXQsIGRpcnR5RGVsaW1pdGVyKSB7XG4gIGlmIChvZmZzZXQgJSA2MCA9PT0gMCkge1xuICAgIHZhciBzaWduID0gb2Zmc2V0ID4gMCA/ICctJyA6ICcrJztcbiAgICByZXR1cm4gc2lnbiArIGFkZExlYWRpbmdaZXJvcyhNYXRoLmFicyhvZmZzZXQpIC8gNjAsIDIpO1xuICB9XG5cbiAgcmV0dXJuIGZvcm1hdFRpbWV6b25lKG9mZnNldCwgZGlydHlEZWxpbWl0ZXIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRpcnR5RGVsaW1pdGVyKSB7XG4gIHZhciBkZWxpbWl0ZXIgPSBkaXJ0eURlbGltaXRlciB8fCAnJztcbiAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnO1xuICB2YXIgYWJzT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcbiAgdmFyIGhvdXJzID0gYWRkTGVhZGluZ1plcm9zKE1hdGguZmxvb3IoYWJzT2Zmc2V0IC8gNjApLCAyKTtcbiAgdmFyIG1pbnV0ZXMgPSBhZGRMZWFkaW5nWmVyb3MoYWJzT2Zmc2V0ICUgNjAsIDIpO1xuICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZm9ybWF0dGVyczsiLCJmdW5jdGlvbiBkYXRlTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nKSB7XG4gIHN3aXRjaCAocGF0dGVybikge1xuICAgIGNhc2UgJ1AnOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7XG4gICAgICAgIHdpZHRoOiAnc2hvcnQnXG4gICAgICB9KTtcblxuICAgIGNhc2UgJ1BQJzpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoe1xuICAgICAgICB3aWR0aDogJ21lZGl1bSdcbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnUFBQJzpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLmRhdGUoe1xuICAgICAgICB3aWR0aDogJ2xvbmcnXG4gICAgICB9KTtcblxuICAgIGNhc2UgJ1BQUFAnOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHtcbiAgICAgICAgd2lkdGg6ICdmdWxsJ1xuICAgICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGltZUxvbmdGb3JtYXR0ZXIocGF0dGVybiwgZm9ybWF0TG9uZykge1xuICBzd2l0Y2ggKHBhdHRlcm4pIHtcbiAgICBjYXNlICdwJzpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoe1xuICAgICAgICB3aWR0aDogJ3Nob3J0J1xuICAgICAgfSk7XG5cbiAgICBjYXNlICdwcCc6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHtcbiAgICAgICAgd2lkdGg6ICdtZWRpdW0nXG4gICAgICB9KTtcblxuICAgIGNhc2UgJ3BwcCc6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHtcbiAgICAgICAgd2lkdGg6ICdsb25nJ1xuICAgICAgfSk7XG5cbiAgICBjYXNlICdwcHBwJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcudGltZSh7XG4gICAgICAgIHdpZHRoOiAnZnVsbCdcbiAgICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRhdGVUaW1lTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nKSB7XG4gIHZhciBtYXRjaFJlc3VsdCA9IHBhdHRlcm4ubWF0Y2goLyhQKykocCspPy8pIHx8IFtdO1xuICB2YXIgZGF0ZVBhdHRlcm4gPSBtYXRjaFJlc3VsdFsxXTtcbiAgdmFyIHRpbWVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMl07XG5cbiAgaWYgKCF0aW1lUGF0dGVybikge1xuICAgIHJldHVybiBkYXRlTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nKTtcbiAgfVxuXG4gIHZhciBkYXRlVGltZUZvcm1hdDtcblxuICBzd2l0Y2ggKGRhdGVQYXR0ZXJuKSB7XG4gICAgY2FzZSAnUCc6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoe1xuICAgICAgICB3aWR0aDogJ3Nob3J0J1xuICAgICAgfSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ1BQJzpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7XG4gICAgICAgIHdpZHRoOiAnbWVkaXVtJ1xuICAgICAgfSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ1BQUCc6XG4gICAgICBkYXRlVGltZUZvcm1hdCA9IGZvcm1hdExvbmcuZGF0ZVRpbWUoe1xuICAgICAgICB3aWR0aDogJ2xvbmcnXG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnUFBQUCc6XG4gICAgZGVmYXVsdDpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7XG4gICAgICAgIHdpZHRoOiAnZnVsbCdcbiAgICAgIH0pO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZGF0ZVRpbWVGb3JtYXQucmVwbGFjZSgne3tkYXRlfX0nLCBkYXRlTG9uZ0Zvcm1hdHRlcihkYXRlUGF0dGVybiwgZm9ybWF0TG9uZykpLnJlcGxhY2UoJ3t7dGltZX19JywgdGltZUxvbmdGb3JtYXR0ZXIodGltZVBhdHRlcm4sIGZvcm1hdExvbmcpKTtcbn1cblxudmFyIGxvbmdGb3JtYXR0ZXJzID0ge1xuICBwOiB0aW1lTG9uZ0Zvcm1hdHRlcixcbiAgUDogZGF0ZVRpbWVMb25nRm9ybWF0dGVyXG59O1xuZXhwb3J0IGRlZmF1bHQgbG9uZ0Zvcm1hdHRlcnM7IiwidmFyIHByb3RlY3RlZERheU9mWWVhclRva2VucyA9IFsnRCcsICdERCddO1xudmFyIHByb3RlY3RlZFdlZWtZZWFyVG9rZW5zID0gWydZWScsICdZWVlZJ107XG5leHBvcnQgZnVuY3Rpb24gaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbih0b2tlbikge1xuICByZXR1cm4gcHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW5zLmluZGV4T2YodG9rZW4pICE9PSAtMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIHByb3RlY3RlZFdlZWtZZWFyVG9rZW5zLmluZGV4T2YodG9rZW4pICE9PSAtMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd1Byb3RlY3RlZEVycm9yKHRva2VuLCBmb3JtYXQsIGlucHV0KSB7XG4gIGlmICh0b2tlbiA9PT0gJ1lZWVknKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJVc2UgYHl5eXlgIGluc3RlYWQgb2YgYFlZWVlgIChpbiBgXCIuY29uY2F0KGZvcm1hdCwgXCJgKSBmb3IgZm9ybWF0dGluZyB5ZWFycyB0byB0aGUgaW5wdXQgYFwiKS5jb25jYXQoaW5wdXQsIFwiYDsgc2VlOiBodHRwczovL2dpdC5pby9meEN5clwiKSk7XG4gIH0gZWxzZSBpZiAodG9rZW4gPT09ICdZWScpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlVzZSBgeXlgIGluc3RlYWQgb2YgYFlZYCAoaW4gYFwiLmNvbmNhdChmb3JtYXQsIFwiYCkgZm9yIGZvcm1hdHRpbmcgeWVhcnMgdG8gdGhlIGlucHV0IGBcIikuY29uY2F0KGlucHV0LCBcImA7IHNlZTogaHR0cHM6Ly9naXQuaW8vZnhDeXJcIikpO1xuICB9IGVsc2UgaWYgKHRva2VuID09PSAnRCcpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlVzZSBgZGAgaW5zdGVhZCBvZiBgRGAgKGluIGBcIi5jb25jYXQoZm9ybWF0LCBcImApIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHRvIHRoZSBpbnB1dCBgXCIpLmNvbmNhdChpbnB1dCwgXCJgOyBzZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXCIpKTtcbiAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ0REJykge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVXNlIGBkZGAgaW5zdGVhZCBvZiBgRERgIChpbiBgXCIuY29uY2F0KGZvcm1hdCwgXCJgKSBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB0byB0aGUgaW5wdXQgYFwiKS5jb25jYXQoaW5wdXQsIFwiYDsgc2VlOiBodHRwczovL2dpdC5pby9meEN5clwiKSk7XG4gIH1cbn0iLCJpbXBvcnQgaXNWYWxpZCBmcm9tIFwiLi4vaXNWYWxpZC9pbmRleC5qc1wiO1xuaW1wb3J0IGRlZmF1bHRMb2NhbGUgZnJvbSBcIi4uL2xvY2FsZS9lbi1VUy9pbmRleC5qc1wiO1xuaW1wb3J0IHN1Yk1pbGxpc2Vjb25kcyBmcm9tIFwiLi4vc3ViTWlsbGlzZWNvbmRzL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCBmb3JtYXR0ZXJzIGZyb20gXCIuLi9fbGliL2Zvcm1hdC9mb3JtYXR0ZXJzL2luZGV4LmpzXCI7XG5pbXBvcnQgbG9uZ0Zvcm1hdHRlcnMgZnJvbSBcIi4uL19saWIvZm9ybWF0L2xvbmdGb3JtYXR0ZXJzL2luZGV4LmpzXCI7XG5pbXBvcnQgZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyBmcm9tIFwiLi4vX2xpYi9nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBpc1Byb3RlY3RlZERheU9mWWVhclRva2VuLCBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4sIHRocm93UHJvdGVjdGVkRXJyb3IgfSBmcm9tIFwiLi4vX2xpYi9wcm90ZWN0ZWRUb2tlbnMvaW5kZXguanNcIjtcbmltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL19saWIvdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiOyAvLyBUaGlzIFJlZ0V4cCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0cyBzZXBhcmF0ZWQgYnkgYHxgOlxuLy8gLSBbeVlRcU1Md0lkRGVjaWhIS2ttc11vIG1hdGNoZXMgYW55IGF2YWlsYWJsZSBvcmRpbmFsIG51bWJlciB0b2tlblxuLy8gICAob25lIG9mIHRoZSBjZXJ0YWluIGxldHRlcnMgZm9sbG93ZWQgYnkgYG9gKVxuLy8gLSAoXFx3KVxcMSogbWF0Y2hlcyBhbnkgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIGxldHRlclxuLy8gLSAnJyBtYXRjaGVzIHR3byBxdW90ZSBjaGFyYWN0ZXJzIGluIGEgcm93XG4vLyAtICcoJyd8W14nXSkrKCd8JCkgbWF0Y2hlcyBhbnl0aGluZyBzdXJyb3VuZGVkIGJ5IHR3byBxdW90ZSBjaGFyYWN0ZXJzICgnKSxcbi8vICAgZXhjZXB0IGEgc2luZ2xlIHF1b3RlIHN5bWJvbCwgd2hpY2ggZW5kcyB0aGUgc2VxdWVuY2UuXG4vLyAgIFR3byBxdW90ZSBjaGFyYWN0ZXJzIGRvIG5vdCBlbmQgdGhlIHNlcXVlbmNlLlxuLy8gICBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBzaW5nbGUgcXVvdGVcbi8vICAgdGhlbiB0aGUgc2VxdWVuY2Ugd2lsbCBjb250aW51ZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG4vLyAtIC4gbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciB1bm1hdGNoZWQgYnkgcHJldmlvdXMgcGFydHMgb2YgdGhlIFJlZ0V4cHNcblxudmFyIGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPSAvW3lZUXFNTHdJZERlY2loSEtrbXNdb3woXFx3KVxcMSp8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7IC8vIFRoaXMgUmVnRXhwIGNhdGNoZXMgc3ltYm9scyBlc2NhcGVkIGJ5IHF1b3RlcywgYW5kIGFsc29cbi8vIHNlcXVlbmNlcyBvZiBzeW1ib2xzIFAsIHAsIGFuZCB0aGUgY29tYmluYXRpb25zIGxpa2UgYFBQUFBQUFBwcHBwcGBcblxudmFyIGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG52YXIgZXNjYXBlZFN0cmluZ1JlZ0V4cCA9IC9eJyhbXl0qPyknPyQvO1xudmFyIGRvdWJsZVF1b3RlUmVnRXhwID0gLycnL2c7XG52YXIgdW5lc2NhcGVkTGF0aW5DaGFyYWN0ZXJSZWdFeHAgPSAvW2EtekEtWl0vO1xuLyoqXG4gKiBAbmFtZSBmb3JtYXRcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgRm9ybWF0IHRoZSBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcgaW4gdGhlIGdpdmVuIGZvcm1hdC4gVGhlIHJlc3VsdCBtYXkgdmFyeSBieSBsb2NhbGUuXG4gKlxuICogPiDimqDvuI8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgYGZvcm1hdGAgdG9rZW5zIGRpZmZlciBmcm9tIE1vbWVudC5qcyBhbmQgb3RoZXIgbGlicmFyaWVzLlxuICogPiBTZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXG4gKlxuICogVGhlIGNoYXJhY3RlcnMgd3JhcHBlZCBiZXR3ZWVuIHR3byBzaW5nbGUgcXVvdGVzIGNoYXJhY3RlcnMgKCcpIGFyZSBlc2NhcGVkLlxuICogVHdvIHNpbmdsZSBxdW90ZXMgaW4gYSByb3csIHdoZXRoZXIgaW5zaWRlIG9yIG91dHNpZGUgYSBxdW90ZWQgc2VxdWVuY2UsIHJlcHJlc2VudCBhICdyZWFsJyBzaW5nbGUgcXVvdGUuXG4gKiAoc2VlIHRoZSBsYXN0IGV4YW1wbGUpXG4gKlxuICogRm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgYmFzZWQgb24gVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0ZpZWxkX1N5bWJvbF9UYWJsZVxuICogd2l0aCBhIGZldyBhZGRpdGlvbnMgKHNlZSBub3RlIDcgYmVsb3cgdGhlIHRhYmxlKS5cbiAqXG4gKiBBY2NlcHRlZCBwYXR0ZXJuczpcbiAqIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBhdHRlcm4gfCBSZXN1bHQgZXhhbXBsZXMgICAgICAgICAgICAgICAgICAgfCBOb3RlcyB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tfFxuICogfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRy4uR0dHICB8IEFELCBCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdHR0cgICAgfCBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHR0dHRyAgIHwgQSwgQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBDYWxlbmRhciB5ZWFyICAgICAgICAgICAgICAgICAgIHwgeSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHlvICAgICAgfCA0NHRoLCAxc3QsIDB0aCwgMTd0aCAgICAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5ICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eXkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXl5eSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgIHwgWSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlvICAgICAgfCA0NHRoLCAxc3QsIDE5MDB0aCwgMjAxN3RoICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWVkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVlZWSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgIHwgUiAgICAgICB8IC00MywgMCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSICAgICAgfCAtNDMsIDAwLCAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlIgICAgIHwgLTA0MywgMDAwLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSUiAgICB8IC0wMDQzLCAwMDAwLCAwMDAxLCAxOTAwLCAyMDE3ICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUlJSICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUsNyB8XG4gKiB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICAgfCB1ICAgICAgIHwgLTQzLCAwLCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXUgICAgICB8IC00MywgMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dSAgICAgfCAtMDQzLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXV1ICAgIHwgLTAwNDMsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1dXUgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgUXVhcnRlciAoZm9ybWF0dGluZykgICAgICAgICAgICB8IFEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVFRICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRUVEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgUXVhcnRlciAoc3RhbmQtYWxvbmUpICAgICAgICAgICB8IHEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXFxICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxcXEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgTW9udGggKGZvcm1hdHRpbmcpICAgICAgICAgICAgICB8IE0gICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU0gICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTSAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU1NICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NTU0gICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTW9udGggKHN0YW5kLWFsb25lKSAgICAgICAgICAgICB8IEwgICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTEwgICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTCAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTExMICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMTEwgICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgICB8IHcgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3byAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd3cgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgICB8IEkgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUkgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgICB8IGQgICAgICAgfCAxLCAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzFzdCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGQgICAgICB8IDAxLCAwMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgICB8IEQgICAgICAgfCAxLCAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgICAgfCA5ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzY1dGgsIDM2NnRoICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREQgICAgICB8IDAxLCAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICB8IDkgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERERCAgICAgfCAwMDEsIDAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEREREICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyAgICAgfFxuICogfCBEYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgICAgIHwgRS4uRUVFICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFRSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRUVFICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICB8IGkgICAgICAgfCAxLCAyLCAzLCAuLi4sIDcgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgN3RoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWkgICAgICB8IDAxLCAwMiwgLi4uLCAwNyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaWkgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWlpaSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCA3ICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgfCBlICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZW8gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWUgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWVlICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlZWUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoc3RhbmQtYWxvbmUpIHwgYyAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjYyAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2MgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjYyAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjY2NjICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEuLmFhICAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWEgICAgIHwgYW0sIHBtICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhYSAgICB8IGEubS4sIHAubS4gICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYWFhICAgfCBhLCBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgfCBiLi5iYiAgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiICAgICB8IGFtLCBwbSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYmIgICAgfCBhLm0uLCBwLm0uLCBub29uLCBtaWRuaWdodCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmJiYiAgIHwgYSwgcCwgbiwgbWkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgIHwgQi4uQkJCICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJCQkIgICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCQkJCQiAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgIHwgaCAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAxMnRoICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoaCAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgIHwgSCAgICAgICB8IDAsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhvICAgICAgfCAwdGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBISCAgICAgIHwgMDAsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgIHwgSyAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAwdGggICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLSyAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgIHwgayAgICAgICB8IDI0LCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtvICAgICAgfCAyNHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrayAgICAgIHwgMjQsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbSAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1vICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtbSAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcyAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNvICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzcyAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgIHwgUyAgICAgICB8IDAsIDEsIC4uLiwgOSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTICAgICAgfCAwMCwgMDEsIC4uLiwgOTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTU1MgICAgIHwgMDAwLCAwMDEsIC4uLiwgOTk5ICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1NTUyAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvIFopICAgICAgICB8IFggICAgICAgfCAtMDgsICswNTMwLCBaICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWCAgICAgIHwgLTA4MDAsICswNTMwLCBaICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYICAgICB8IC0wODowMCwgKzA1OjMwLCBaICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWFggICAgfCAtMDgwMCwgKzA1MzAsIFosICsxMjM0NTYgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFhYWCAgIHwgLTA4OjAwLCArMDU6MzAsIFosICsxMjozNDo1NiAgICAgIHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgIHwgeCAgICAgICB8IC0wOCwgKzA1MzAsICswMCAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4ICAgICAgfCAtMDgwMCwgKzA1MzAsICswMDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHggICAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4eCAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAsICsxMjM0NTYgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eHh4ICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwLCArMTI6MzQ6NTYgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICAgfCBPLi4uT09PIHwgR01ULTgsIEdNVCs1OjMwLCBHTVQrMCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT09PTyAgICB8IEdNVC0wODowMCwgR01UKzA1OjMwLCBHTVQrMDA6MDAgICB8IDIgICAgIHxcbiAqIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pICB8IHouLi56enogfCBHTVQtOCwgR01UKzU6MzAsIEdNVCswICAgICAgICAgICAgfCA2ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB6enp6ICAgIHwgR01ULTA4OjAwLCBHTVQrMDU6MzAsIEdNVCswMDowMCAgIHwgMiw2ICAgfFxuICogfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgIHwgdCAgICAgICB8IDUxMjk2OTUyMCAgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR0ICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDcgICB8XG4gKiB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgfCBUICAgICAgIHwgNTEyOTY5NTIwOTAwICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNyAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgICB8IFAgICAgICAgfCAwNC8yOS8xNDUzICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUCAgICAgIHwgQXByIDI5LCAxNDUzICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQICAgICB8IEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUFAgICAgfCBGcmlkYXksIEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgfCAyLDcgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICAgfCBwICAgICAgIHwgMTI6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHAgICAgICB8IDEyOjAwOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwcCAgICAgfCAxMjowMDowMCBBTSBHTVQrMiAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcHBwICAgIHwgMTI6MDA6MDAgQU0gR01UKzAyOjAwICAgICAgICAgICAgIHwgMiw3ICAgfFxuICogfCBDb21iaW5hdGlvbiBvZiBkYXRlIGFuZCB0aW1lICAgIHwgUHAgICAgICB8IDA0LzI5LzE0NTMsIDEyOjAwIEFNICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQcHAgICAgfCBBcHIgMjksIDE0NTMsIDEyOjAwOjAwIEFNICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBwcHAgIHwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQUHBwcHB8IEZyaWRheSwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICB8IDIsNyAgIHxcbiAqIE5vdGVzOlxuICogMS4gXCJGb3JtYXR0aW5nXCIgdW5pdHMgKGUuZy4gZm9ybWF0dGluZyBxdWFydGVyKSBpbiB0aGUgZGVmYXVsdCBlbi1VUyBsb2NhbGVcbiAqICAgIGFyZSB0aGUgc2FtZSBhcyBcInN0YW5kLWFsb25lXCIgdW5pdHMsIGJ1dCBhcmUgZGlmZmVyZW50IGluIHNvbWUgbGFuZ3VhZ2VzLlxuICogICAgXCJGb3JtYXR0aW5nXCIgdW5pdHMgYXJlIGRlY2xpbmVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIGxhbmd1YWdlXG4gKiAgICBpbiB0aGUgY29udGV4dCBvZiBhIGRhdGUuIFwiU3RhbmQtYWxvbmVcIiB1bml0cyBhcmUgYWx3YXlzIG5vbWluYXRpdmUgc2luZ3VsYXI6XG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBMTExMJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZCdgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBNTU1NJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZHUnYFxuICpcbiAqIDIuIEFueSBzZXF1ZW5jZSBvZiB0aGUgaWRlbnRpY2FsIGxldHRlcnMgaXMgYSBwYXR0ZXJuLCB1bmxlc3MgaXQgaXMgZXNjYXBlZCBieVxuICogICAgdGhlIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIChzZWUgYmVsb3cpLlxuICogICAgSWYgdGhlIHNlcXVlbmNlIGlzIGxvbmdlciB0aGFuIGxpc3RlZCBpbiB0YWJsZSAoZS5nLiBgRUVFRUVFRUVFRUVgKVxuICogICAgdGhlIG91dHB1dCB3aWxsIGJlIHRoZSBzYW1lIGFzIGRlZmF1bHQgcGF0dGVybiBmb3IgdGhpcyB1bml0LCB1c3VhbGx5XG4gKiAgICB0aGUgbG9uZ2VzdCBvbmUgKGluIGNhc2Ugb2YgSVNPIHdlZWtkYXlzLCBgRUVFRWApLiBEZWZhdWx0IHBhdHRlcm5zIGZvciB1bml0c1xuICogICAgYXJlIG1hcmtlZCB3aXRoIFwiMlwiIGluIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgdGFibGUuXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU0nKSAvLz0+ICdOb3YnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NJykgLy89PiAnTidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqIDMuIFNvbWUgcGF0dGVybnMgY291bGQgYmUgdW5saW1pdGVkIGxlbmd0aCAoc3VjaCBhcyBgeXl5eXl5eXlgKS5cbiAqICAgIFRoZSBvdXRwdXQgd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvcyB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuLlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAneXl5eXl5eXknKSAvLz0+ICcwMDAwMjAxNydgXG4gKlxuICogNC4gYFFRUVFRYCBhbmQgYHFxcXFxYCBjb3VsZCBiZSBub3Qgc3RyaWN0bHkgbnVtZXJpY2FsIGluIHNvbWUgbG9jYWxlcy5cbiAqICAgIFRoZXNlIHRva2VucyByZXByZXNlbnQgdGhlIHNob3J0ZXN0IGZvcm0gb2YgdGhlIHF1YXJ0ZXIuXG4gKlxuICogNS4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIHBhdHRlcm5zIGFyZSBCLkMuIHllYXJzOlxuICpcbiAqICAgIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICogICAgfCBBQyAxIHwgICAxIHwgICAxIHxcbiAqICAgIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gKiAgICB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICpcbiAqICAgIEFsc28gYHl5YCBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIGEgeWVhcixcbiAqICAgIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZDpcbiAqXG4gKiAgICB8IFllYXIgfCBgeXlgIHwgYHV1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18XG4gKiAgICB8IDEgICAgfCAgIDAxIHwgICAwMSB8XG4gKiAgICB8IDE0ICAgfCAgIDE0IHwgICAxNCB8XG4gKiAgICB8IDM3NiAgfCAgIDc2IHwgIDM3NiB8XG4gKiAgICB8IDE0NTMgfCAgIDUzIHwgMTQ1MyB8XG4gKlxuICogICAgVGhlIHNhbWUgZGlmZmVyZW5jZSBpcyB0cnVlIGZvciBsb2NhbCBhbmQgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJzIChgWWAgYW5kIGBSYCksXG4gKiAgICBleGNlcHQgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhcnMgYXJlIGRlcGVuZGVudCBvbiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gXG4gKiAgICBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAoY29tcGFyZSBbZ2V0SVNPV2Vla1llYXJde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvZ2V0SVNPV2Vla1llYXJ9XG4gKiAgICBhbmQgW2dldFdlZWtZZWFyXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL2dldFdlZWtZZWFyfSkuXG4gKlxuICogNi4gU3BlY2lmaWMgbm9uLWxvY2F0aW9uIHRpbWV6b25lcyBhcmUgY3VycmVudGx5IHVuYXZhaWxhYmxlIGluIGBkYXRlLWZuc2AsXG4gKiAgICBzbyByaWdodCBub3cgdGhlc2UgdG9rZW5zIGZhbGwgYmFjayB0byBHTVQgdGltZXpvbmVzLlxuICpcbiAqIDcuIFRoZXNlIHBhdHRlcm5zIGFyZSBub3QgaW4gdGhlIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqICAgIC0gYGlgOiBJU08gZGF5IG9mIHdlZWtcbiAqICAgIC0gYElgOiBJU08gd2VlayBvZiB5ZWFyXG4gKiAgICAtIGBSYDogSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqICAgIC0gYHRgOiBzZWNvbmRzIHRpbWVzdGFtcFxuICogICAgLSBgVGA6IG1pbGxpc2Vjb25kcyB0aW1lc3RhbXBcbiAqICAgIC0gYG9gOiBvcmRpbmFsIG51bWJlciBtb2RpZmllclxuICogICAgLSBgUGA6IGxvbmcgbG9jYWxpemVkIGRhdGVcbiAqICAgIC0gYHBgOiBsb25nIGxvY2FsaXplZCB0aW1lXG4gKlxuICogOC4gYFlZYCBhbmQgYFlZWVlgIHRva2VucyByZXByZXNlbnQgd2Vlay1udW1iZXJpbmcgeWVhcnMgYnV0IHRoZXkgYXJlIG9mdGVuIGNvbmZ1c2VkIHdpdGggeWVhcnMuXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXG4gKlxuICogOS4gYERgIGFuZCBgRERgIHRva2VucyByZXByZXNlbnQgZGF5cyBvZiB0aGUgeWVhciBidXQgdGhleSBhcmUgb2Z0ZW4gY29uZnVzZWQgd2l0aCBkYXlzIG9mIHRoZSBtb250aC5cbiAqICAgIFlvdSBzaG91bGQgZW5hYmxlIGBvcHRpb25zLnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiAtIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbm93IHJlcXVpcmVkIGZvciB0aGUgc2FrZSBvZiBleHBsaWNpdG5lc3MuXG4gKlxuICogICBgYGBqYXZhc2NyaXB0XG4gKiAgIC8vIEJlZm9yZSB2Mi4wLjBcbiAqICAgZm9ybWF0KG5ldyBEYXRlKDIwMTYsIDAsIDEpKVxuICpcbiAqICAgLy8gdjIuMC4wIG9ud2FyZFxuICogICBmb3JtYXQobmV3IERhdGUoMjAxNiwgMCwgMSksIFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU3h4eFwiKVxuICogICBgYGBcbiAqXG4gKiAtIE5ldyBmb3JtYXQgc3RyaW5nIEFQSSBmb3IgYGZvcm1hdGAgZnVuY3Rpb25cbiAqICAgd2hpY2ggaXMgYmFzZWQgb24gW1VuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNV0oaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0ZpZWxkX1N5bWJvbF9UYWJsZSkuXG4gKiAgIFNlZSBbdGhpcyBwb3N0XShodHRwczovL2Jsb2cuZGF0ZS1mbnMub3JnL3Bvc3QvdW5pY29kZS10b2tlbnMtaW4tZGF0ZS1mbnMtdjItc3JlYXR5a2k5MWpnKSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIC0gQ2hhcmFjdGVycyBhcmUgbm93IGVzY2FwZWQgdXNpbmcgc2luZ2xlIHF1b3RlIHN5bWJvbHMgKGAnYCkgaW5zdGVhZCBvZiBzcXVhcmUgYnJhY2tldHMuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IC0gdGhlIHN0cmluZyBvZiB0b2tlbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICogQHBhcmFtIHtMb2NhbGV9IFtvcHRpb25zLmxvY2FsZT1kZWZhdWx0TG9jYWxlXSAtIHRoZSBsb2NhbGUgb2JqZWN0LiBTZWUgW0xvY2FsZV17QGxpbmsgaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy9Mb2NhbGV9XG4gKiBAcGFyYW0gezB8MXwyfDN8NHw1fDZ9IFtvcHRpb25zLndlZWtTdGFydHNPbj0wXSAtIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrICgwIC0gU3VuZGF5KVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZT0xXSAtIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudXNlQWRkaXRpb25hbFdlZWtZZWFyVG9rZW5zPWZhbHNlXSAtIGlmIHRydWUsIGFsbG93cyB1c2FnZSBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhciB0b2tlbnMgYFlZYCBhbmQgYFlZWVlgO1xuICogICBzZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVzZUFkZGl0aW9uYWxEYXlPZlllYXJUb2tlbnM9ZmFsc2VdIC0gaWYgdHJ1ZSwgYWxsb3dzIHVzYWdlIG9mIHRoZSBkYXkgb2YgeWVhciB0b2tlbnMgYERgIGFuZCBgRERgO1xuICogICBzZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgZGF0ZWAgbXVzdCBub3QgYmUgSW52YWxpZCBEYXRlXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgbG9jYWxpemVgIHByb3BlcnR5XG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgZm9ybWF0TG9uZ2AgcHJvcGVydHlcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDdcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IHVzZSBgeXl5eWAgaW5zdGVhZCBvZiBgWVlZWWAgZm9yIGZvcm1hdHRpbmcgeWVhcnMgdXNpbmcgW2Zvcm1hdCBwcm92aWRlZF0gdG8gdGhlIGlucHV0IFtpbnB1dCBwcm92aWRlZF07IHNlZTogaHR0cHM6Ly9naXQuaW8vZnhDeXJcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IHVzZSBgeXlgIGluc3RlYWQgb2YgYFlZYCBmb3IgZm9ybWF0dGluZyB5ZWFycyB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdC5pby9meEN5clxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gdXNlIGBkYCBpbnN0ZWFkIG9mIGBEYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdC5pby9meEN5clxuICogQHRocm93cyB7UmFuZ2VFcnJvcn0gdXNlIGBkZGAgaW5zdGVhZCBvZiBgRERgIGZvciBmb3JtYXR0aW5nIGRheXMgb2YgdGhlIG1vbnRoIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0LmlvL2Z4Q3lyXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVwcmVzZW50IDExIEZlYnJ1YXJ5IDIwMTQgaW4gbWlkZGxlLWVuZGlhbiBmb3JtYXQ6XG4gKiB2YXIgcmVzdWx0ID0gZm9ybWF0KG5ldyBEYXRlKDIwMTQsIDEsIDExKSwgJ01NL2RkL3l5eXknKVxuICogLy89PiAnMDIvMTEvMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVwcmVzZW50IDIgSnVseSAyMDE0IGluIEVzcGVyYW50bzpcbiAqIGltcG9ydCB7IGVvTG9jYWxlIH0gZnJvbSAnZGF0ZS1mbnMvbG9jYWxlL2VvJ1xuICogdmFyIHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyKSwgXCJkbyAnZGUnIE1NTU0geXl5eVwiLCB7XG4gKiAgIGxvY2FsZTogZW9Mb2NhbGVcbiAqIH0pXG4gKiAvLz0+ICcyLWEgZGUganVsaW8gMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXNjYXBlIHN0cmluZyBieSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyczpcbiAqIHZhciByZXN1bHQgPSBmb3JtYXQobmV3IERhdGUoMjAxNCwgNiwgMiwgMTUpLCBcImggJ28nJ2Nsb2NrJ1wiKVxuICogLy89PiBcIjMgbydjbG9ja1wiXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0KGRpcnR5RGF0ZSwgZGlydHlGb3JtYXRTdHIsIGRpcnR5T3B0aW9ucykge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGZvcm1hdFN0ciA9IFN0cmluZyhkaXJ0eUZvcm1hdFN0cik7XG4gIHZhciBvcHRpb25zID0gZGlydHlPcHRpb25zIHx8IHt9O1xuICB2YXIgbG9jYWxlID0gb3B0aW9ucy5sb2NhbGUgfHwgZGVmYXVsdExvY2FsZTtcbiAgdmFyIGxvY2FsZUZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IGxvY2FsZS5vcHRpb25zICYmIGxvY2FsZS5vcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZTtcbiAgdmFyIGRlZmF1bHRGaXJzdFdlZWtDb250YWluc0RhdGUgPSBsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUgPT0gbnVsbCA/IDEgOiB0b0ludGVnZXIobG9jYWxlRmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgdmFyIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID09IG51bGwgPyBkZWZhdWx0Rmlyc3RXZWVrQ29udGFpbnNEYXRlIDogdG9JbnRlZ2VyKG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKTsgLy8gVGVzdCBpZiB3ZWVrU3RhcnRzT24gaXMgYmV0d2VlbiAxIGFuZCA3IF9hbmRfIGlzIG5vdCBOYU5cblxuICBpZiAoIShmaXJzdFdlZWtDb250YWluc0RhdGUgPj0gMSAmJiBmaXJzdFdlZWtDb250YWluc0RhdGUgPD0gNykpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZmlyc3RXZWVrQ29udGFpbnNEYXRlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA3IGluY2x1c2l2ZWx5Jyk7XG4gIH1cblxuICB2YXIgbG9jYWxlV2Vla1N0YXJ0c09uID0gbG9jYWxlLm9wdGlvbnMgJiYgbG9jYWxlLm9wdGlvbnMud2Vla1N0YXJ0c09uO1xuICB2YXIgZGVmYXVsdFdlZWtTdGFydHNPbiA9IGxvY2FsZVdlZWtTdGFydHNPbiA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihsb2NhbGVXZWVrU3RhcnRzT24pO1xuICB2YXIgd2Vla1N0YXJ0c09uID0gb3B0aW9ucy53ZWVrU3RhcnRzT24gPT0gbnVsbCA/IGRlZmF1bHRXZWVrU3RhcnRzT24gOiB0b0ludGVnZXIob3B0aW9ucy53ZWVrU3RhcnRzT24pOyAvLyBUZXN0IGlmIHdlZWtTdGFydHNPbiBpcyBiZXR3ZWVuIDAgYW5kIDYgX2FuZF8gaXMgbm90IE5hTlxuXG4gIGlmICghKHdlZWtTdGFydHNPbiA+PSAwICYmIHdlZWtTdGFydHNPbiA8PSA2KSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd3ZWVrU3RhcnRzT24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYgaW5jbHVzaXZlbHknKTtcbiAgfVxuXG4gIGlmICghbG9jYWxlLmxvY2FsaXplKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2xvY2FsZSBtdXN0IGNvbnRhaW4gbG9jYWxpemUgcHJvcGVydHknKTtcbiAgfVxuXG4gIGlmICghbG9jYWxlLmZvcm1hdExvbmcpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignbG9jYWxlIG11c3QgY29udGFpbiBmb3JtYXRMb25nIHByb3BlcnR5Jyk7XG4gIH1cblxuICB2YXIgb3JpZ2luYWxEYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG5cbiAgaWYgKCFpc1ZhbGlkKG9yaWdpbmFsRGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0aW1lIHZhbHVlJyk7XG4gIH0gLy8gQ29udmVydCB0aGUgZGF0ZSBpbiBzeXN0ZW0gdGltZXpvbmUgdG8gdGhlIHNhbWUgZGF0ZSBpbiBVVEMrMDA6MDAgdGltZXpvbmUuXG4gIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdoZW4gVVRDIGZ1bmN0aW9ucyB3aWxsIGJlIGltcGxlbWVudGVkLCBsb2NhbGVzIHdpbGwgYmUgY29tcGF0aWJsZSB3aXRoIHRoZW0uXG4gIC8vIFNlZSBhbiBpc3N1ZSBhYm91dCBVVEMgZnVuY3Rpb25zOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvaXNzdWVzLzM3NlxuXG5cbiAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhvcmlnaW5hbERhdGUpO1xuICB2YXIgdXRjRGF0ZSA9IHN1Yk1pbGxpc2Vjb25kcyhvcmlnaW5hbERhdGUsIHRpbWV6b25lT2Zmc2V0KTtcbiAgdmFyIGZvcm1hdHRlck9wdGlvbnMgPSB7XG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiBmaXJzdFdlZWtDb250YWluc0RhdGUsXG4gICAgd2Vla1N0YXJ0c09uOiB3ZWVrU3RhcnRzT24sXG4gICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgX29yaWdpbmFsRGF0ZTogb3JpZ2luYWxEYXRlXG4gIH07XG4gIHZhciByZXN1bHQgPSBmb3JtYXRTdHIubWF0Y2gobG9uZ0Zvcm1hdHRpbmdUb2tlbnNSZWdFeHApLm1hcChmdW5jdGlvbiAoc3Vic3RyaW5nKSB7XG4gICAgdmFyIGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuXG4gICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSAncCcgfHwgZmlyc3RDaGFyYWN0ZXIgPT09ICdQJykge1xuICAgICAgdmFyIGxvbmdGb3JtYXR0ZXIgPSBsb25nRm9ybWF0dGVyc1tmaXJzdENoYXJhY3Rlcl07XG4gICAgICByZXR1cm4gbG9uZ0Zvcm1hdHRlcihzdWJzdHJpbmcsIGxvY2FsZS5mb3JtYXRMb25nLCBmb3JtYXR0ZXJPcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3Vic3RyaW5nO1xuICB9KS5qb2luKCcnKS5tYXRjaChmb3JtYXR0aW5nVG9rZW5zUmVnRXhwKS5tYXAoZnVuY3Rpb24gKHN1YnN0cmluZykge1xuICAgIC8vIFJlcGxhY2UgdHdvIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIHdpdGggb25lIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJcbiAgICBpZiAoc3Vic3RyaW5nID09PSBcIicnXCIpIHtcbiAgICAgIHJldHVybiBcIidcIjtcbiAgICB9XG5cbiAgICB2YXIgZmlyc3RDaGFyYWN0ZXIgPSBzdWJzdHJpbmdbMF07XG5cbiAgICBpZiAoZmlyc3RDaGFyYWN0ZXIgPT09IFwiJ1wiKSB7XG4gICAgICByZXR1cm4gY2xlYW5Fc2NhcGVkU3RyaW5nKHN1YnN0cmluZyk7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdHRlciA9IGZvcm1hdHRlcnNbZmlyc3RDaGFyYWN0ZXJdO1xuXG4gICAgaWYgKGZvcm1hdHRlcikge1xuICAgICAgaWYgKCFvcHRpb25zLnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VucyAmJiBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4oc3Vic3RyaW5nKSkge1xuICAgICAgICB0aHJvd1Byb3RlY3RlZEVycm9yKHN1YnN0cmluZywgZGlydHlGb3JtYXRTdHIsIGRpcnR5RGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghb3B0aW9ucy51c2VBZGRpdGlvbmFsRGF5T2ZZZWFyVG9rZW5zICYmIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4oc3Vic3RyaW5nKSkge1xuICAgICAgICB0aHJvd1Byb3RlY3RlZEVycm9yKHN1YnN0cmluZywgZGlydHlGb3JtYXRTdHIsIGRpcnR5RGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmb3JtYXR0ZXIodXRjRGF0ZSwgc3Vic3RyaW5nLCBsb2NhbGUubG9jYWxpemUsIGZvcm1hdHRlck9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCkpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdGb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXIgYCcgKyBmaXJzdENoYXJhY3RlciArICdgJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1YnN0cmluZztcbiAgfSkuam9pbignJyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNsZWFuRXNjYXBlZFN0cmluZyhpbnB1dCkge1xuICByZXR1cm4gaW5wdXQubWF0Y2goZXNjYXBlZFN0cmluZ1JlZ0V4cClbMV0ucmVwbGFjZShkb3VibGVRdW90ZVJlZ0V4cCwgXCInXCIpO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgZ2V0RGF5c0luTW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBkYXlzIGluIGEgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBkYXlzIGluIGEgbW9udGggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGdpdmVuIGRhdGVcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBudW1iZXIgb2YgZGF5cyBpbiBhIG1vbnRoXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgZGF5cyBhcmUgaW4gRmVicnVhcnkgMjAwMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldERheXNJbk1vbnRoKG5ldyBEYXRlKDIwMDAsIDEpKVxuICogLy89PiAyOVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERheXNJbk1vbnRoKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gIHZhciBtb250aEluZGV4ID0gZGF0ZS5nZXRNb250aCgpO1xuICB2YXIgbGFzdERheU9mTW9udGggPSBuZXcgRGF0ZSgwKTtcbiAgbGFzdERheU9mTW9udGguc2V0RnVsbFllYXIoeWVhciwgbW9udGhJbmRleCArIDEsIDApO1xuICBsYXN0RGF5T2ZNb250aC5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIGxhc3REYXlPZk1vbnRoLmdldERhdGUoKTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGdldFRpbWVcbiAqIEBjYXRlZ29yeSBUaW1lc3RhbXAgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBtaWxsaXNlY29uZHMgdGltZXN0YW1wIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBtaWxsaXNlY29uZHMgdGltZXN0YW1wIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBnaXZlbiBkYXRlXG4gKiBAcmV0dXJucyB7TnVtYmVyfSB0aGUgdGltZXN0YW1wXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gR2V0IHRoZSB0aW1lc3RhbXAgb2YgMjkgRmVicnVhcnkgMjAxMiAxMTo0NTowNS4xMjM6XG4gKiBjb25zdCByZXN1bHQgPSBnZXRUaW1lKG5ldyBEYXRlKDIwMTIsIDEsIDI5LCAxMSwgNDUsIDUsIDEyMykpXG4gKiAvLz0+IDEzMzA1MTU5MDUxMjNcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRUaW1lKGRpcnR5RGF0ZSkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIHRpbWVzdGFtcCA9IGRhdGUuZ2V0VGltZSgpO1xuICByZXR1cm4gdGltZXN0YW1wO1xufSIsImltcG9ydCBnZXRUaW1lIGZyb20gXCIuLi9nZXRUaW1lL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBnZXRVbml4VGltZVxuICogQGNhdGVnb3J5IFRpbWVzdGFtcCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIHNlY29uZHMgdGltZXN0YW1wIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBzZWNvbmRzIHRpbWVzdGFtcCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZ2l2ZW4gZGF0ZVxuICogQHJldHVybnMge051bWJlcn0gdGhlIHRpbWVzdGFtcFxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEdldCB0aGUgdGltZXN0YW1wIG9mIDI5IEZlYnJ1YXJ5IDIwMTIgMTE6NDU6MDUgQ0VUOlxuICogY29uc3QgcmVzdWx0ID0gZ2V0VW5peFRpbWUobmV3IERhdGUoMjAxMiwgMSwgMjksIDExLCA0NSwgNSkpXG4gKiAvLz0+IDEzMzA1MTIzMDVcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRVbml4VGltZShkaXJ0eURhdGUpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHJldHVybiBNYXRoLmZsb29yKGdldFRpbWUoZGlydHlEYXRlKSAvIDEwMDApO1xufSIsImltcG9ydCBzdGFydE9mV2VlayBmcm9tIFwiLi4vc3RhcnRPZldlZWsvaW5kZXguanNcIjtcbmltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG5cbi8qKlxuICogQG5hbWUgZ2V0V2Vla1llYXJcbiAqIEBjYXRlZ29yeSBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNXZWVrX251bWJlcmluZ1xuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqIEBwYXJhbSB7TG9jYWxlfSBbb3B0aW9ucy5sb2NhbGU9ZGVmYXVsdExvY2FsZV0gLSB0aGUgbG9jYWxlIG9iamVjdC4gU2VlIFtMb2NhbGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvTG9jYWxlfVxuICogQHBhcmFtIHswfDF8MnwzfDR8NXw2fSBbb3B0aW9ucy53ZWVrU3RhcnRzT249MF0gLSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayAoMCAtIFN1bmRheSlcbiAqIEBwYXJhbSB7MXwyfDN8NHw1fDZ8N30gW29wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlPTFdIC0gdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3M/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpKVxuICogLy89PiAyMDA1XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCBpZiB3ZWVrIHN0YXJ0cyBvbiBTYXR1cmRheT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNiksIHsgd2Vla1N0YXJ0c09uOiA2IH0pXG4gKiAvLz0+IDIwMDRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IGlmIHRoZSBmaXJzdCB3ZWVrIGNvbnRhaW5zIDQgSmFudWFyeT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNiksIHsgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0IH0pXG4gKiAvLz0+IDIwMDRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2Vla1llYXIoZGlydHlEYXRlLCBvcHRpb25zKSB7XG4gIHZhciBfb3B0aW9ucyRsb2NhbGUsIF9vcHRpb25zJGxvY2FsZSRvcHRpbztcblxuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gIHZhciBsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfb3B0aW9ucyRsb2NhbGUgPSBvcHRpb25zLmxvY2FsZSkgPT09IG51bGwgfHwgX29wdGlvbnMkbG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX29wdGlvbnMkbG9jYWxlJG9wdGlvID0gX29wdGlvbnMkbG9jYWxlLm9wdGlvbnMpID09PSBudWxsIHx8IF9vcHRpb25zJGxvY2FsZSRvcHRpbyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbG9jYWxlJG9wdGlvLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZTtcbiAgdmFyIGRlZmF1bHRGaXJzdFdlZWtDb250YWluc0RhdGUgPSBsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUgPT0gbnVsbCA/IDEgOiB0b0ludGVnZXIobG9jYWxlRmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgdmFyIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKSA9PSBudWxsID8gZGVmYXVsdEZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA6IHRvSW50ZWdlcihvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7IC8vIFRlc3QgaWYgd2Vla1N0YXJ0c09uIGlzIGJldHdlZW4gMSBhbmQgNyBfYW5kXyBpcyBub3QgTmFOXG5cbiAgaWYgKCEoZmlyc3RXZWVrQ29udGFpbnNEYXRlID49IDEgJiYgZmlyc3RXZWVrQ29udGFpbnNEYXRlIDw9IDcpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2ZpcnN0V2Vla0NvbnRhaW5zRGF0ZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNyBpbmNsdXNpdmVseScpO1xuICB9XG5cbiAgdmFyIGZpcnN0V2Vla09mTmV4dFllYXIgPSBuZXcgRGF0ZSgwKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRGdWxsWWVhcih5ZWFyICsgMSwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrT2ZOZXh0WWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vla09mTmV4dFllYXIsIG9wdGlvbnMpO1xuICB2YXIgZmlyc3RXZWVrT2ZUaGlzWWVhciA9IG5ldyBEYXRlKDApO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEZ1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBzdGFydE9mVGhpc1llYXIgPSBzdGFydE9mV2VlayhmaXJzdFdlZWtPZlRoaXNZZWFyLCBvcHRpb25zKTtcblxuICBpZiAoZGF0ZS5nZXRUaW1lKCkgPj0gc3RhcnRPZk5leHRZZWFyLmdldFRpbWUoKSkge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmIChkYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHllYXIgLSAxO1xuICB9XG59IiwiaW1wb3J0IGdldFdlZWtZZWFyIGZyb20gXCIuLi9nZXRXZWVrWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZXZWVrIGZyb20gXCIuLi9zdGFydE9mV2Vlay9pbmRleC5qc1wiO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG5cbi8qKlxuICogQG5hbWUgc3RhcnRPZldlZWtZZWFyXG4gKiBAY2F0ZWdvcnkgV2Vlay1OdW1iZXJpbmcgWWVhciBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhci5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNXZWVrX251bWJlcmluZ1xuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucy5cbiAqIEBwYXJhbSB7TG9jYWxlfSBbb3B0aW9ucy5sb2NhbGU9ZGVmYXVsdExvY2FsZV0gLSB0aGUgbG9jYWxlIG9iamVjdC4gU2VlIFtMb2NhbGVde0BsaW5rIGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvTG9jYWxlfVxuICogQHBhcmFtIHswfDF8MnwzfDR8NXw2fSBbb3B0aW9ucy53ZWVrU3RhcnRzT249MF0gLSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayAoMCAtIFN1bmRheSlcbiAqIEBwYXJhbSB7MXwyfDN8NHw1fDZ8N30gW29wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlPTFdIC0gdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXJcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgc3RhcnQgb2YgYSB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLndlZWtTdGFydHNPbmAgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDZcbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIGEgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDUgd2l0aCBkZWZhdWx0IHNldHRpbmdzOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBTdW4gRGVjIDI2IDIwMDQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgd2Vlay1udW1iZXJpbmcgeWVhciBmb3IgMiBKdWx5IDIwMDVcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHdlZWtcbiAqIC8vIGFuZCA0IEphbnVhcnkgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RhcnRPZldlZWtZZWFyKGRpcnR5RGF0ZSwgZGlydHlPcHRpb25zKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgb3B0aW9ucyA9IGRpcnR5T3B0aW9ucyB8fCB7fTtcbiAgdmFyIGxvY2FsZSA9IG9wdGlvbnMubG9jYWxlO1xuICB2YXIgbG9jYWxlRmlyc3RXZWVrQ29udGFpbnNEYXRlID0gbG9jYWxlICYmIGxvY2FsZS5vcHRpb25zICYmIGxvY2FsZS5vcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZTtcbiAgdmFyIGRlZmF1bHRGaXJzdFdlZWtDb250YWluc0RhdGUgPSBsb2NhbGVGaXJzdFdlZWtDb250YWluc0RhdGUgPT0gbnVsbCA/IDEgOiB0b0ludGVnZXIobG9jYWxlRmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgdmFyIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9IG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlID09IG51bGwgPyBkZWZhdWx0Rmlyc3RXZWVrQ29udGFpbnNEYXRlIDogdG9JbnRlZ2VyKG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgdmFyIHllYXIgPSBnZXRXZWVrWWVhcihkaXJ0eURhdGUsIGRpcnR5T3B0aW9ucyk7XG4gIHZhciBmaXJzdFdlZWsgPSBuZXcgRGF0ZSgwKTtcbiAgZmlyc3RXZWVrLnNldEZ1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vlay5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgdmFyIGRhdGUgPSBzdGFydE9mV2VlayhmaXJzdFdlZWssIGRpcnR5T3B0aW9ucyk7XG4gIHJldHVybiBkYXRlO1xufSIsImltcG9ydCBzdGFydE9mV2VlayBmcm9tIFwiLi4vc3RhcnRPZldlZWsvaW5kZXguanNcIjtcbmltcG9ydCBzdGFydE9mV2Vla1llYXIgZnJvbSBcIi4uL3N0YXJ0T2ZXZWVrWWVhci9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xudmFyIE1JTExJU0VDT05EU19JTl9XRUVLID0gNjA0ODAwMDAwO1xuLyoqXG4gKiBAbmFtZSBnZXRXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjV2Vla19udW1iZXJpbmdcbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKiBAcGFyYW0ge0xvY2FsZX0gW29wdGlvbnMubG9jYWxlPWRlZmF1bHRMb2NhbGVdIC0gdGhlIGxvY2FsZSBvYmplY3QuIFNlZSBbTG9jYWxlXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL0xvY2FsZX1cbiAqIEBwYXJhbSB7MHwxfDJ8M3w0fDV8Nn0gW29wdGlvbnMud2Vla1N0YXJ0c09uPTBdIC0gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgKDAgLSBTdW5kYXkpXG4gKiBAcGFyYW0gezF8MnwzfDR8NXw2fDd9IFtvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZT0xXSAtIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSB0aGUgd2Vla1xuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy53ZWVrU3RhcnRzT25gIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA2XG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA3XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgb2YgdGhlIGxvY2FsIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDUgd2l0aCBkZWZhdWx0IG9wdGlvbnM/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpKVxuICogLy89PiAyXG4gKlxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSxcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLFxuICogLy8gYW5kIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyIGFsd2F5cyBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiA1M1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdlZWsoZGlydHlEYXRlLCBvcHRpb25zKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgZGlmZiA9IHN0YXJ0T2ZXZWVrKGRhdGUsIG9wdGlvbnMpLmdldFRpbWUoKSAtIHN0YXJ0T2ZXZWVrWWVhcihkYXRlLCBvcHRpb25zKS5nZXRUaW1lKCk7IC8vIFJvdW5kIHRoZSBudW1iZXIgb2YgZGF5cyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyXG4gIC8vIGJlY2F1c2UgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYSB3ZWVrIGlzIG5vdCBjb25zdGFudFxuICAvLyAoZS5nLiBpdCdzIGRpZmZlcmVudCBpbiB0aGUgd2VlayBvZiB0aGUgZGF5bGlnaHQgc2F2aW5nIHRpbWUgY2xvY2sgc2hpZnQpXG5cbiAgcmV0dXJuIE1hdGgucm91bmQoZGlmZiAvIE1JTExJU0VDT05EU19JTl9XRUVLKSArIDE7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBsYXN0RGF5T2ZNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgbGFzdCBkYXkgb2YgYSBtb250aCBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGxhc3QgZGF5IG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgb3JpZ2luYWwgZGF0ZVxuICogQHJldHVybnMge0RhdGV9IHRoZSBsYXN0IGRheSBvZiBhIG1vbnRoXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIGxhc3QgZGF5IG9mIGEgbW9udGggZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiB2YXIgcmVzdWx0ID0gbGFzdERheU9mTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAzMCAyMDE0IDAwOjAwOjAwXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGFzdERheU9mTW9udGgoZGlydHlEYXRlKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gIGRhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aCArIDEsIDApO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn0iLCJpbXBvcnQgZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcyBmcm9tIFwiLi4vZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcy9pbmRleC5qc1wiO1xuaW1wb3J0IGxhc3REYXlPZk1vbnRoIGZyb20gXCIuLi9sYXN0RGF5T2ZNb250aC9pbmRleC5qc1wiO1xuaW1wb3J0IHN0YXJ0T2ZNb250aCBmcm9tIFwiLi4vc3RhcnRPZk1vbnRoL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIGdldFdlZWtzSW5Nb250aFxuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgd2Vla3MgYSBtb250aCBzcGFucy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIHdlZWtzIHRoZSBtb250aCBpbiB0aGUgZ2l2ZW4gZGF0ZSBzcGFucy5cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKiBAcGFyYW0ge0xvY2FsZX0gW29wdGlvbnMubG9jYWxlPWRlZmF1bHRMb2NhbGVdIC0gdGhlIGxvY2FsZSBvYmplY3QuIFNlZSBbTG9jYWxlXXtAbGluayBodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL0xvY2FsZX1cbiAqIEBwYXJhbSB7MHwxfDJ8M3w0fDV8Nn0gW29wdGlvbnMud2Vla1N0YXJ0c09uPTBdIC0gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgKDAgLSBTdW5kYXkpXG4gKiBAcmV0dXJucyB7TnVtYmVyfSB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIHdlZWtzXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBgb3B0aW9ucy53ZWVrU3RhcnRzT25gIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA2XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIHdlZWtzIGRvZXMgRmVicnVhcnkgMjAxNSBzcGFuP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla3NJbk1vbnRoKG5ldyBEYXRlKDIwMTUsIDEsIDgpKVxuICogLy89PiA0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRoZSB3ZWVrIHN0YXJ0cyBvbiBNb25kYXksXG4gKiAvLyBob3cgbWFueSBjYWxlbmRhciB3ZWVrcyBkb2VzIEp1bHkgMjAxNyBzcGFuP1xuICogY29uc3QgcmVzdWx0ID0gZ2V0V2Vla3NJbk1vbnRoKG5ldyBEYXRlKDIwMTcsIDYsIDUpLCB7IHdlZWtTdGFydHNPbjogMSB9KVxuICogLy89PiA2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdlZWtzSW5Nb250aChkYXRlLCBvcHRpb25zKSB7XG4gIHJlcXVpcmVkQXJncygxLCBhcmd1bWVudHMpO1xuICByZXR1cm4gZGlmZmVyZW5jZUluQ2FsZW5kYXJXZWVrcyhsYXN0RGF5T2ZNb250aChkYXRlKSwgc3RhcnRPZk1vbnRoKGRhdGUpLCBvcHRpb25zKSArIDE7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBpc0FmdGVyXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBmaXJzdCBkYXRlIGFmdGVyIHRoZSBzZWNvbmQgb25lP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSXMgdGhlIGZpcnN0IGRhdGUgYWZ0ZXIgdGhlIHNlY29uZCBvbmU/XG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdGhhdCBzaG91bGQgYmUgYWZ0ZXIgdGhlIG90aGVyIG9uZSB0byByZXR1cm4gdHJ1ZVxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZVRvQ29tcGFyZSAtIHRoZSBkYXRlIHRvIGNvbXBhcmUgd2l0aFxuICogQHJldHVybnMge0Jvb2xlYW59IHRoZSBmaXJzdCBkYXRlIGlzIGFmdGVyIHRoZSBzZWNvbmQgZGF0ZVxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJcyAxMCBKdWx5IDE5ODkgYWZ0ZXIgMTEgRmVicnVhcnkgMTk4Nz9cbiAqIHZhciByZXN1bHQgPSBpc0FmdGVyKG5ldyBEYXRlKDE5ODksIDYsIDEwKSwgbmV3IERhdGUoMTk4NywgMSwgMTEpKVxuICogLy89PiB0cnVlXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNBZnRlcihkaXJ0eURhdGUsIGRpcnR5RGF0ZVRvQ29tcGFyZSkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRhdGVUb0NvbXBhcmUgPSB0b0RhdGUoZGlydHlEYXRlVG9Db21wYXJlKTtcbiAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpID4gZGF0ZVRvQ29tcGFyZS5nZXRUaW1lKCk7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBpc0JlZm9yZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZmlyc3QgZGF0ZSBiZWZvcmUgdGhlIHNlY29uZCBvbmU/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJcyB0aGUgZmlyc3QgZGF0ZSBiZWZvcmUgdGhlIHNlY29uZCBvbmU/XG4gKlxuICogIyMjIHYyLjAuMCBicmVha2luZyBjaGFuZ2VzOlxuICpcbiAqIC0gW0NoYW5nZXMgdGhhdCBhcmUgY29tbW9uIGZvciB0aGUgd2hvbGUgbGlicmFyeV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI0NvbW1vbi1DaGFuZ2VzKS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdGhhdCBzaG91bGQgYmUgYmVmb3JlIHRoZSBvdGhlciBvbmUgdG8gcmV0dXJuIHRydWVcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVUb0NvbXBhcmUgLSB0aGUgZGF0ZSB0byBjb21wYXJlIHdpdGhcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0aGUgZmlyc3QgZGF0ZSBpcyBiZWZvcmUgdGhlIHNlY29uZCBkYXRlXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElzIDEwIEp1bHkgMTk4OSBiZWZvcmUgMTEgRmVicnVhcnkgMTk4Nz9cbiAqIHZhciByZXN1bHQgPSBpc0JlZm9yZShuZXcgRGF0ZSgxOTg5LCA2LCAxMCksIG5ldyBEYXRlKDE5ODcsIDEsIDExKSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0JlZm9yZShkaXJ0eURhdGUsIGRpcnR5RGF0ZVRvQ29tcGFyZSkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRhdGVUb0NvbXBhcmUgPSB0b0RhdGUoZGlydHlEYXRlVG9Db21wYXJlKTtcbiAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpIDwgZGF0ZVRvQ29tcGFyZS5nZXRUaW1lKCk7XG59IiwiaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBpc1NhbWVNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgbW9udGggKGFuZCB5ZWFyKT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgbW9udGggKGFuZCB5ZWFyKT9cbiAqXG4gKiAjIyMgdjIuMC4wIGJyZWFraW5nIGNoYW5nZXM6XG4gKlxuICogLSBbQ2hhbmdlcyB0aGF0IGFyZSBjb21tb24gZm9yIHRoZSB3aG9sZSBsaWJyYXJ5XShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91cGdyYWRlR3VpZGUubWQjQ29tbW9uLUNoYW5nZXMpLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVMZWZ0IC0gdGhlIGZpcnN0IGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVSaWdodCAtIHRoZSBzZWNvbmQgZGF0ZSB0byBjaGVja1xuICogQHJldHVybnMge0Jvb2xlYW59IHRoZSBkYXRlcyBhcmUgaW4gdGhlIHNhbWUgbW9udGggKGFuZCB5ZWFyKVxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMiBTZXB0ZW1iZXIgMjAxNCBhbmQgMjUgU2VwdGVtYmVyIDIwMTQgaW4gdGhlIHNhbWUgbW9udGg/XG4gKiB2YXIgcmVzdWx0ID0gaXNTYW1lTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiksIG5ldyBEYXRlKDIwMTQsIDgsIDI1KSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMiBTZXB0ZW1iZXIgMjAxNCBhbmQgMjUgU2VwdGVtYmVyIDIwMTUgaW4gdGhlIHNhbWUgbW9udGg/XG4gKiB2YXIgcmVzdWx0ID0gaXNTYW1lTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiksIG5ldyBEYXRlKDIwMTUsIDgsIDI1KSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1NhbWVNb250aChkaXJ0eURhdGVMZWZ0LCBkaXJ0eURhdGVSaWdodCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGVMZWZ0ID0gdG9EYXRlKGRpcnR5RGF0ZUxlZnQpO1xuICB2YXIgZGF0ZVJpZ2h0ID0gdG9EYXRlKGRpcnR5RGF0ZVJpZ2h0KTtcbiAgcmV0dXJuIGRhdGVMZWZ0LmdldEZ1bGxZZWFyKCkgPT09IGRhdGVSaWdodC5nZXRGdWxsWWVhcigpICYmIGRhdGVMZWZ0LmdldE1vbnRoKCkgPT09IGRhdGVSaWdodC5nZXRNb250aCgpO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgaXNTYW1lWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSB5ZWFyP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXJlIHRoZSBnaXZlbiBkYXRlcyBpbiB0aGUgc2FtZSB5ZWFyP1xuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZUxlZnQgLSB0aGUgZmlyc3QgZGF0ZSB0byBjaGVja1xuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZVJpZ2h0IC0gdGhlIHNlY29uZCBkYXRlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdGhlIGRhdGVzIGFyZSBpbiB0aGUgc2FtZSB5ZWFyXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAyIFNlcHRlbWJlciAyMDE0IGFuZCAyNSBTZXB0ZW1iZXIgMjAxNCBpbiB0aGUgc2FtZSB5ZWFyP1xuICogdmFyIHJlc3VsdCA9IGlzU2FtZVllYXIobmV3IERhdGUoMjAxNCwgOCwgMiksIG5ldyBEYXRlKDIwMTQsIDgsIDI1KSlcbiAqIC8vPT4gdHJ1ZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2FtZVllYXIoZGlydHlEYXRlTGVmdCwgZGlydHlEYXRlUmlnaHQpIHtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlTGVmdCA9IHRvRGF0ZShkaXJ0eURhdGVMZWZ0KTtcbiAgdmFyIGRhdGVSaWdodCA9IHRvRGF0ZShkaXJ0eURhdGVSaWdodCk7XG4gIHJldHVybiBkYXRlTGVmdC5nZXRGdWxsWWVhcigpID09PSBkYXRlUmlnaHQuZ2V0RnVsbFllYXIoKTtcbn0iLCJpbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IHRvRGF0ZSBmcm9tIFwiLi4vdG9EYXRlL2luZGV4LmpzXCI7XG5pbXBvcnQgZ2V0RGF5c0luTW9udGggZnJvbSBcIi4uL2dldERheXNJbk1vbnRoL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBzZXRNb250aFxuICogQGNhdGVnb3J5IE1vbnRoIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFNldCB0aGUgbW9udGggdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZXQgdGhlIG1vbnRoIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBtb250aCAtIHRoZSBtb250aCBvZiB0aGUgbmV3IGRhdGVcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgbW9udGggc2V0XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCBGZWJydWFyeSB0byAxIFNlcHRlbWJlciAyMDE0OlxuICogY29uc3QgcmVzdWx0ID0gc2V0TW9udGgobmV3IERhdGUoMjAxNCwgOCwgMSksIDEpXG4gKiAvLz0+IFNhdCBGZWIgMDEgMjAxNCAwMDowMDowMFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldE1vbnRoKGRpcnR5RGF0ZSwgZGlydHlNb250aCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIG1vbnRoID0gdG9JbnRlZ2VyKGRpcnR5TW9udGgpO1xuICB2YXIgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgdmFyIGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICB2YXIgZGF0ZVdpdGhEZXNpcmVkTW9udGggPSBuZXcgRGF0ZSgwKTtcbiAgZGF0ZVdpdGhEZXNpcmVkTW9udGguc2V0RnVsbFllYXIoeWVhciwgbW9udGgsIDE1KTtcbiAgZGF0ZVdpdGhEZXNpcmVkTW9udGguc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHZhciBkYXlzSW5Nb250aCA9IGdldERheXNJbk1vbnRoKGRhdGVXaXRoRGVzaXJlZE1vbnRoKTsgLy8gU2V0IHRoZSBsYXN0IGRheSBvZiB0aGUgbmV3IG1vbnRoXG4gIC8vIGlmIHRoZSBvcmlnaW5hbCBkYXRlIHdhcyB0aGUgbGFzdCBkYXkgb2YgdGhlIGxvbmdlciBtb250aFxuXG4gIGRhdGUuc2V0TW9udGgobW9udGgsIE1hdGgubWluKGRheSwgZGF5c0luTW9udGgpKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgc2V0WWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgU2V0IHRoZSB5ZWFyIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogU2V0IHRoZSB5ZWFyIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqICMjIyB2Mi4wLjAgYnJlYWtpbmcgY2hhbmdlczpcbiAqXG4gKiAtIFtDaGFuZ2VzIHRoYXQgYXJlIGNvbW1vbiBmb3IgdGhlIHdob2xlIGxpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNDb21tb24tQ2hhbmdlcykuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5ZWFyIC0gdGhlIHllYXIgb2YgdGhlIG5ldyBkYXRlXG4gKiBAcmV0dXJucyB7RGF0ZX0gdGhlIG5ldyBkYXRlIHdpdGggdGhlIHllYXIgc2V0XG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNldCB5ZWFyIDIwMTMgdG8gMSBTZXB0ZW1iZXIgMjAxNDpcbiAqIGNvbnN0IHJlc3VsdCA9IHNldFllYXIobmV3IERhdGUoMjAxNCwgOCwgMSksIDIwMTMpXG4gKiAvLz0+IFN1biBTZXAgMDEgMjAxMyAwMDowMDowMFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldFllYXIoZGlydHlEYXRlLCBkaXJ0eVllYXIpIHtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciBkYXRlID0gdG9EYXRlKGRpcnR5RGF0ZSk7XG4gIHZhciB5ZWFyID0gdG9JbnRlZ2VyKGRpcnR5WWVhcik7IC8vIENoZWNrIGlmIGRhdGUgaXMgSW52YWxpZCBEYXRlIGJlY2F1c2UgRGF0ZS5wcm90b3R5cGUuc2V0RnVsbFllYXIgaWdub3JlcyB0aGUgdmFsdWUgb2YgSW52YWxpZCBEYXRlXG5cbiAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICB9XG5cbiAgZGF0ZS5zZXRGdWxsWWVhcih5ZWFyKTtcbiAgcmV0dXJuIGRhdGU7XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzU2FtZVllYXIsIHNldE1vbnRoIGFzIHNldERhdGVNb250aCwgc3RhcnRPZk1vbnRoIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbi8qKlxuICogUmVuZGVyIHRoZSBkcm9wZG93biB0byBuYXZpZ2F0ZSBiZXR3ZWVuIG1vbnRocy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1vbnRoc0Ryb3Bkb3duKHByb3BzKSB7XG4gICAgdmFyIGRpc3BsYXlNb250aCA9IHByb3BzLmRpc3BsYXlNb250aDtcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgZnJvbURhdGUgPSBfYS5mcm9tRGF0ZSwgdG9EYXRlID0gX2EudG9EYXRlLCBzdHlsZXMgPSBfYS5zdHlsZXMsIGxvY2FsZSA9IF9hLmxvY2FsZSwgZm9ybWF0TW9udGhDYXB0aW9uID0gX2EuZm9ybWF0dGVycy5mb3JtYXRNb250aENhcHRpb24sIGNsYXNzTmFtZXMgPSBfYS5jbGFzc05hbWVzLCBEcm9wZG93biA9IF9hLmNvbXBvbmVudHMuRHJvcGRvd24sIGxhYmVsTW9udGhEcm9wZG93biA9IF9hLmxhYmVscy5sYWJlbE1vbnRoRHJvcGRvd247XG4gICAgaWYgKCFmcm9tRGF0ZSAmJiAhdG9EYXRlKSB7XG4gICAgICAgIC8vIFRPRE86IHVzZSB0eXBlIGd1YXJkc1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCk7XG4gICAgfVxuICAgIHZhciBkcm9wZG93bk1vbnRocyA9IFtdO1xuICAgIGlmIChmcm9tRGF0ZSAmJiB0b0RhdGUpIHtcbiAgICAgICAgaWYgKGlzU2FtZVllYXIoZnJvbURhdGUsIHRvRGF0ZSkpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgZGlzcGxheSB0aGUgbW9udGhzIGluY2x1ZGVkIGluIHRoZSByYW5nZVxuICAgICAgICAgICAgZm9yICh2YXIgbW9udGggPSBmcm9tRGF0ZS5nZXRNb250aCgpOyBtb250aCA8PSB0b0RhdGUuZ2V0TW9udGgoKTsgbW9udGgrKykge1xuICAgICAgICAgICAgICAgIGRyb3Bkb3duTW9udGhzLnB1c2goc2V0RGF0ZU1vbnRoKHN0YXJ0T2ZNb250aChmcm9tRGF0ZSksIG1vbnRoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBkaXNwbGF5IGFsbCB0aGUgMTIgbW9udGhzXG4gICAgICAgICAgICBmb3IgKHZhciBtb250aCA9IDA7IG1vbnRoIDw9IDExOyBtb250aCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFueURhdGUgPSBuZXcgRGF0ZSgpOyAvLyBhbnkgZGF0ZSBpcyBPSywgd2UganVzdCBuZWVkIHRoZSB5ZWFyXG4gICAgICAgICAgICAgICAgZHJvcGRvd25Nb250aHMucHVzaChzZXREYXRlTW9udGgoc3RhcnRPZk1vbnRoKGFueURhdGUpLCBtb250aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgbmV3TW9udGggPSBzZXREYXRlTW9udGgobmV3IERhdGUoZGlzcGxheU1vbnRoKSwgTnVtYmVyKGUudGFyZ2V0LnZhbHVlKSk7XG4gICAgICAgIHByb3BzLm9uQ2hhbmdlKG5ld01vbnRoKTtcbiAgICB9O1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChEcm9wZG93biwgeyBcImFyaWEtbGFiZWxcIjogbGFiZWxNb250aERyb3Bkb3duKCksIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5kcm9wZG93bl9tb250aCwgc3R5bGU6IHN0eWxlcy5kcm9wZG93bl9tb250aCwgb25DaGFuZ2U6IGhhbmRsZUNoYW5nZSwgdmFsdWU6IGRpc3BsYXlNb250aC5nZXRNb250aCgpLCBjYXB0aW9uOiBmb3JtYXRNb250aENhcHRpb24oZGlzcGxheU1vbnRoLCB7IGxvY2FsZTogbG9jYWxlIH0pIH0sIGRyb3Bkb3duTW9udGhzLm1hcChmdW5jdGlvbiAobSkgeyByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIiwgeyBrZXk6IG0uZ2V0TW9udGgoKSwgdmFsdWU6IG0uZ2V0TW9udGgoKSB9LCBmb3JtYXRNb250aENhcHRpb24obSwgeyBsb2NhbGU6IGxvY2FsZSB9KSkpOyB9KSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TW9udGhzRHJvcGRvd24uanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuLyoqXG4gKiBSZW5kZXIgYSBidXR0b24gSFRNTCBlbGVtZW50IGFwcGx5aW5nIHRoZSByZXNldCBjbGFzcyBuYW1lLlxuICovXG5leHBvcnQgdmFyIEJ1dHRvbiA9IFJlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgY2xhc3NOYW1lcyA9IF9hLmNsYXNzTmFtZXMsIHN0eWxlcyA9IF9hLnN0eWxlcztcbiAgICB2YXIgY2xhc3NOYW1lc0FyciA9IFtjbGFzc05hbWVzLmJ1dHRvbl9yZXNldCwgY2xhc3NOYW1lcy5idXR0b25dO1xuICAgIGlmIChwcm9wcy5jbGFzc05hbWUpIHtcbiAgICAgICAgY2xhc3NOYW1lc0Fyci5wdXNoKHByb3BzLmNsYXNzTmFtZSk7XG4gICAgfVxuICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc05hbWVzQXJyLmpvaW4oJyAnKTtcbiAgICB2YXIgc3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGVzLmJ1dHRvbl9yZXNldCksIHN0eWxlcy5idXR0b24pO1xuICAgIGlmIChwcm9wcy5zdHlsZSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCBwcm9wcy5zdHlsZSk7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCBfX2Fzc2lnbih7fSwgcHJvcHMsIHsgcmVmOiByZWYsIHR5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogY2xhc3NOYW1lLCBzdHlsZTogc3R5bGUgfSkpKTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnV0dG9uLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnLi4vQnV0dG9uJztcbi8qKiBBIGNvbXBvbmVudCByZW5kZXJpbmcgdGhlIG5hdmlnYXRpb24gYnV0dG9ucyBvciB0aGUgZHJvcC1kb3ducy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBOYXZpZ2F0aW9uKHByb3BzKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBfYiA9IHVzZURheVBpY2tlcigpLCBkaXIgPSBfYi5kaXIsIGxvY2FsZSA9IF9iLmxvY2FsZSwgY2xhc3NOYW1lcyA9IF9iLmNsYXNzTmFtZXMsIHN0eWxlcyA9IF9iLnN0eWxlcywgX2MgPSBfYi5sYWJlbHMsIGxhYmVsUHJldmlvdXMgPSBfYy5sYWJlbFByZXZpb3VzLCBsYWJlbE5leHQgPSBfYy5sYWJlbE5leHQsIF9kID0gX2IuY29tcG9uZW50cywgSWNvblJpZ2h0ID0gX2QuSWNvblJpZ2h0LCBJY29uTGVmdCA9IF9kLkljb25MZWZ0O1xuICAgIHZhciBvblByZXZpb3VzQ2xpY2sgPSBwcm9wcy5vblByZXZpb3VzQ2xpY2ssIG9uTmV4dENsaWNrID0gcHJvcHMub25OZXh0Q2xpY2s7XG4gICAgaWYgKGRpciA9PT0gJ3J0bCcpIHtcbiAgICAgICAgX2EgPSBbb25QcmV2aW91c0NsaWNrLCBvbk5leHRDbGlja10sIG9uTmV4dENsaWNrID0gX2FbMF0sIG9uUHJldmlvdXNDbGljayA9IF9hWzFdO1xuICAgIH1cbiAgICB2YXIgcHJldmlvdXNNb250aCA9IHByb3BzLnByZXZpb3VzTW9udGgsIG5leHRNb250aCA9IHByb3BzLm5leHRNb250aDtcbiAgICB2YXIgcHJldmlvdXNMYWJlbCA9IGxhYmVsUHJldmlvdXMocHJldmlvdXNNb250aCwgeyBsb2NhbGU6IGxvY2FsZSB9KTtcbiAgICB2YXIgcHJldmlvdXNDbGFzc05hbWUgPSBbXG4gICAgICAgIGNsYXNzTmFtZXMubmF2X2J1dHRvbixcbiAgICAgICAgY2xhc3NOYW1lcy5uYXZfYnV0dG9uX3ByZXZpb3VzXG4gICAgXS5qb2luKCcgJyk7XG4gICAgdmFyIG5leHRMYWJlbCA9IGxhYmVsTmV4dChuZXh0TW9udGgsIHsgbG9jYWxlOiBsb2NhbGUgfSk7XG4gICAgdmFyIG5leHRDbGFzc05hbWUgPSBbXG4gICAgICAgIGNsYXNzTmFtZXMubmF2X2J1dHRvbixcbiAgICAgICAgY2xhc3NOYW1lcy5uYXZfYnV0dG9uX25leHRcbiAgICBdLmpvaW4oJyAnKTtcbiAgICBpZiAoIW5leHRNb250aCAmJiAhcHJldmlvdXNNb250aCkge1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5uYXYsIHN0eWxlOiBzdHlsZXMubmF2IH0sXG4gICAgICAgICFwcm9wcy5oaWRlUHJldmlvdXMgJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCB7IFwiYXJpYS1sYWJlbFwiOiBwcmV2aW91c0xhYmVsLCBjbGFzc05hbWU6IHByZXZpb3VzQ2xhc3NOYW1lLCBzdHlsZTogc3R5bGVzLm5hdl9idXR0b25fbmV4dCwgZGlzYWJsZWQ6ICFwcmV2aW91c01vbnRoLCBvbkNsaWNrOiBkaXIgPT09ICdydGwnID8gb25OZXh0Q2xpY2sgOiBvblByZXZpb3VzQ2xpY2sgfSwgZGlyID09PSAncnRsJyA/IChSZWFjdC5jcmVhdGVFbGVtZW50KEljb25SaWdodCwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMubmF2X2ljb24sIHN0eWxlOiBzdHlsZXMubmF2X2ljb24gfSkpIDogKFJlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvbkxlZnQsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLm5hdl9pY29uLCBzdHlsZTogc3R5bGVzLm5hdl9pY29uIH0pKSkpLFxuICAgICAgICAhcHJvcHMuaGlkZU5leHQgJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uLCB7IFwiYXJpYS1sYWJlbFwiOiBuZXh0TGFiZWwsIGNsYXNzTmFtZTogbmV4dENsYXNzTmFtZSwgc3R5bGU6IHN0eWxlcy5uYXZfYnV0dG9uX25leHQsIGRpc2FibGVkOiAhbmV4dE1vbnRoLCBvbkNsaWNrOiBkaXIgPT09ICdydGwnID8gb25QcmV2aW91c0NsaWNrIDogb25OZXh0Q2xpY2sgfSwgZGlyID09PSAncnRsJyA/IChSZWFjdC5jcmVhdGVFbGVtZW50KEljb25MZWZ0LCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5uYXZfaWNvbiwgc3R5bGU6IHN0eWxlcy5uYXZfaWNvbiB9KSkgOiAoUmVhY3QuY3JlYXRlRWxlbWVudChJY29uUmlnaHQsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLm5hdl9pY29uLCBzdHlsZTogc3R5bGVzLm5hdl9pY29uIH0pKSkpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OYXZpZ2F0aW9uLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBzZXRZZWFyLCBzdGFydE9mWWVhciB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG4vKipcbiAqIFJlbmRlciBhIGRyb3Bkb3duIHRvIGNoYW5nZSB0aGUgeWVhci4gVGFrZSBpbiBhY2NvdW50IHRoZSBgbmF2LmZyb21EYXRlYCBhbmRcbiAqIGB0b0RhdGVgIGZyb20gY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFllYXJzRHJvcGRvd24ocHJvcHMpIHtcbiAgICB2YXIgZGlzcGxheU1vbnRoID0gcHJvcHMuZGlzcGxheU1vbnRoO1xuICAgIHZhciBfYSA9IHVzZURheVBpY2tlcigpLCBmcm9tRGF0ZSA9IF9hLmZyb21EYXRlLCB0b0RhdGUgPSBfYS50b0RhdGUsIGxvY2FsZSA9IF9hLmxvY2FsZSwgc3R5bGVzID0gX2Euc3R5bGVzLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgRHJvcGRvd24gPSBfYS5jb21wb25lbnRzLkRyb3Bkb3duLCBmb3JtYXRZZWFyQ2FwdGlvbiA9IF9hLmZvcm1hdHRlcnMuZm9ybWF0WWVhckNhcHRpb24sIGxhYmVsWWVhckRyb3Bkb3duID0gX2EubGFiZWxzLmxhYmVsWWVhckRyb3Bkb3duO1xuICAgIHZhciB5ZWFycyA9IFtdO1xuICAgIGlmIChmcm9tRGF0ZSAmJiB0b0RhdGUpIHtcbiAgICAgICAgdmFyIGZyb21ZZWFyID0gZnJvbURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgdmFyIHRvWWVhciA9IHRvRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBmb3IgKHZhciB5ZWFyID0gZnJvbVllYXI7IHllYXIgPD0gdG9ZZWFyOyB5ZWFyKyspIHtcbiAgICAgICAgICAgIHllYXJzLnB1c2goc2V0WWVhcihzdGFydE9mWWVhcihuZXcgRGF0ZSgpKSwgeWVhcikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgbmV3TW9udGggPSBzZXRZZWFyKG5ldyBEYXRlKGRpc3BsYXlNb250aCksIE51bWJlcihlLnRhcmdldC52YWx1ZSkpO1xuICAgICAgICBwcm9wcy5vbkNoYW5nZShuZXdNb250aCk7XG4gICAgfTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRHJvcGRvd24sIHsgXCJhcmlhLWxhYmVsXCI6IGxhYmVsWWVhckRyb3Bkb3duKCksIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5kcm9wZG93bl9tb250aCwgc3R5bGU6IHN0eWxlcy5kcm9wZG93bl9tb250aCwgb25DaGFuZ2U6IGhhbmRsZUNoYW5nZSwgdmFsdWU6IGRpc3BsYXlNb250aC5nZXRGdWxsWWVhcigpLCBjYXB0aW9uOiBmb3JtYXRZZWFyQ2FwdGlvbihkaXNwbGF5TW9udGgsIHsgbG9jYWxlOiBsb2NhbGUgfSkgfSwgeWVhcnMubWFwKGZ1bmN0aW9uICh5ZWFyKSB7IHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiLCB7IGtleTogeWVhci5nZXRGdWxsWWVhcigpLCB2YWx1ZTogeWVhci5nZXRGdWxsWWVhcigpIH0sIGZvcm1hdFllYXJDYXB0aW9uKHllYXIsIHsgbG9jYWxlOiBsb2NhbGUgfSkpKTsgfSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVllYXJzRHJvcGRvd24uanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogSGVscGVyIGhvb2sgZm9yIHVzaW5nIGNvbnRyb2xsZWQvdW5jb250cm9sbGVkIHZhbHVlcyBmcm9tIGEgY29tcG9uZW50IHByb3BzLlxuICpcbiAqIFdoZW4gdGhlIHZhbHVlIGlzIG5vdCBjb250cm9sbGVkLCBwYXNzIGB1bmRlZmluZWRgIGFzIGBjb250cm9sbGVkVmFsdWVgIGFuZFxuICogdXNlIHRoZSByZXR1cm5lZCBzZXR0ZXIgdG8gdXBkYXRlIGl0LlxuICpcbiAqIFdoZW4gdGhlIHZhbHVlIGlzIGNvbnRyb2xsZWQsIHBhc3MgdGhlIGNvbnRyb2xsZWQgdmFsdWUgYXMgc2Vjb25kXG4gKiBhcmd1bWVudCwgd2hpY2ggd2lsbCBiZSBhbHdheXMgcmV0dXJuZWQgYXMgYHZhbHVlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbnRyb2xsZWRWYWx1ZShkZWZhdWx0VmFsdWUsIGNvbnRyb2xsZWRWYWx1ZSkge1xuICAgIHZhciBfYSA9IFJlYWN0LnVzZVN0YXRlKGRlZmF1bHRWYWx1ZSksIHVuY29udHJvbGxlZFZhbHVlID0gX2FbMF0sIHNldFZhbHVlID0gX2FbMV07XG4gICAgdmFyIHZhbHVlID0gY29udHJvbGxlZFZhbHVlID09PSB1bmRlZmluZWQgPyB1bmNvbnRyb2xsZWRWYWx1ZSA6IGNvbnRyb2xsZWRWYWx1ZTtcbiAgICByZXR1cm4gW3ZhbHVlLCBzZXRWYWx1ZV07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VDb250cm9sbGVkVmFsdWUuanMubWFwIiwiaW1wb3J0IHsgYWRkTW9udGhzLCBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocywgc3RhcnRPZk1vbnRoIH0gZnJvbSAnZGF0ZS1mbnMnO1xuLyoqIFJldHVybiB0aGUgaW5pdGlhbCBtb250aCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5pdGlhbE1vbnRoKGNvbnRleHQpIHtcbiAgICB2YXIgbW9udGggPSBjb250ZXh0Lm1vbnRoLCBkZWZhdWx0TW9udGggPSBjb250ZXh0LmRlZmF1bHRNb250aCwgdG9kYXkgPSBjb250ZXh0LnRvZGF5O1xuICAgIHZhciBpbml0aWFsTW9udGggPSBtb250aCB8fCBkZWZhdWx0TW9udGggfHwgdG9kYXkgfHwgbmV3IERhdGUoKTtcbiAgICB2YXIgdG9EYXRlID0gY29udGV4dC50b0RhdGUsIGZyb21EYXRlID0gY29udGV4dC5mcm9tRGF0ZSwgX2EgPSBjb250ZXh0Lm51bWJlck9mTW9udGhzLCBudW1iZXJPZk1vbnRocyA9IF9hID09PSB2b2lkIDAgPyAxIDogX2E7XG4gICAgLy8gRml4IHRoZSBpbml0aWFsTW9udGggaWYgaXMgYWZ0ZXIgdGhlIHRvLWRhdGVcbiAgICBpZiAodG9EYXRlICYmIGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKHRvRGF0ZSwgaW5pdGlhbE1vbnRoKSA8IDApIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IC0xICogKG51bWJlck9mTW9udGhzIC0gMSk7XG4gICAgICAgIGluaXRpYWxNb250aCA9IGFkZE1vbnRocyh0b0RhdGUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8vIEZpeCB0aGUgaW5pdGlhbE1vbnRoIGlmIGlzIGJlZm9yZSB0aGUgZnJvbS1kYXRlXG4gICAgaWYgKGZyb21EYXRlICYmIGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzKGluaXRpYWxNb250aCwgZnJvbURhdGUpIDwgMCkge1xuICAgICAgICBpbml0aWFsTW9udGggPSBmcm9tRGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0T2ZNb250aChpbml0aWFsTW9udGgpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0SW5pdGlhbE1vbnRoLmpzLm1hcCIsImltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVkVmFsdWUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VDb250cm9sbGVkVmFsdWUnO1xuaW1wb3J0IHsgZ2V0SW5pdGlhbE1vbnRoIH0gZnJvbSAnLi91dGlscy9nZXRJbml0aWFsTW9udGgnO1xuLyoqIENvbnRyb2xzIHRoZSBuYXZpZ2F0aW9uIHN0YXRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU5hdmlnYXRpb25TdGF0ZSgpIHtcbiAgICB2YXIgY29udGV4dCA9IHVzZURheVBpY2tlcigpO1xuICAgIHZhciBpbml0aWFsTW9udGggPSBnZXRJbml0aWFsTW9udGgoY29udGV4dCk7XG4gICAgdmFyIF9hID0gdXNlQ29udHJvbGxlZFZhbHVlKGluaXRpYWxNb250aCwgY29udGV4dC5tb250aCksIG1vbnRoID0gX2FbMF0sIHNldE1vbnRoID0gX2FbMV07XG4gICAgdmFyIGdvVG9Nb250aCA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIGlmIChjb250ZXh0LmRpc2FibGVOYXZpZ2F0aW9uKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzZXRNb250aChkYXRlKTtcbiAgICB9O1xuICAgIHJldHVybiBbbW9udGgsIGdvVG9Nb250aF07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VOYXZpZ2F0aW9uU3RhdGUuanMubWFwIiwiaW1wb3J0IHsgYWRkTW9udGhzLCBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocywgc3RhcnRPZk1vbnRoIH0gZnJvbSAnZGF0ZS1mbnMnO1xuLyoqXG4gKiBSZXR1cm4gdGhlIG1vbnRocyB0byBkaXNwbGF5IGluIHRoZSBjb21wb25lbnQgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2ZcbiAqIG1vbnRocyBhbmQgdGhlIGZyb20vdG8gZGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3BsYXlNb250aHMobW9udGgsIF9hKSB7XG4gICAgdmFyIHJldmVyc2VNb250aHMgPSBfYS5yZXZlcnNlTW9udGhzLCBudW1iZXJPZk1vbnRocyA9IF9hLm51bWJlck9mTW9udGhzO1xuICAgIHZhciBzdGFydCA9IHN0YXJ0T2ZNb250aChtb250aCk7XG4gICAgdmFyIGVuZCA9IHN0YXJ0T2ZNb250aChhZGRNb250aHMoc3RhcnQsIG51bWJlck9mTW9udGhzKSk7XG4gICAgdmFyIG1vbnRoc0RpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhlbmQsIHN0YXJ0KTtcbiAgICB2YXIgbW9udGhzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb250aHNEaWZmOyBpKyspIHtcbiAgICAgICAgdmFyIG5leHRNb250aCA9IGFkZE1vbnRocyhzdGFydCwgaSk7XG4gICAgICAgIG1vbnRocy5wdXNoKG5leHRNb250aCk7XG4gICAgfVxuICAgIGlmIChyZXZlcnNlTW9udGhzKVxuICAgICAgICBtb250aHMgPSBtb250aHMucmV2ZXJzZSgpO1xuICAgIHJldHVybiBtb250aHM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXREaXNwbGF5TW9udGhzLmpzLm1hcCIsImltcG9ydCB7IGFkZE1vbnRocywgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMsIHN0YXJ0T2ZNb250aCB9IGZyb20gJ2RhdGUtZm5zJztcbi8qKlxuICogUmV0dXJucyB0aGUgbmV4dCBtb250aCB0aGUgdXNlciBjYW4gbmF2aWdhdGUgdG8gYWNjb3JkaW5nIHRvIHRoZSBnaXZlblxuICogb3B0aW9ucy5cbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBuZXh0IG1vbnRoIGlzIG5vdCBhbHdheXMgdGhlIG5leHQgY2FsZW5kYXIgbW9udGg6XG4gKlxuICogLSBpZiBhZnRlciB0aGUgYHRvRGF0ZWAgcmFuZ2UsIGlzIHVuZGVmaW5lZDtcbiAqIC0gaWYgdGhlIG5hdmlnYXRpb24gaXMgcGFnZWQsIGlzIHRoZSBudW1iZXIgb2YgbW9udGhzIGRpc3BsYXllZCBhaGVhZC5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXh0TW9udGgoc3RhcnRpbmdNb250aCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmRpc2FibGVOYXZpZ2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciB0b0RhdGUgPSBvcHRpb25zLnRvRGF0ZSwgcGFnZWROYXZpZ2F0aW9uID0gb3B0aW9ucy5wYWdlZE5hdmlnYXRpb24sIF9hID0gb3B0aW9ucy5udW1iZXJPZk1vbnRocywgbnVtYmVyT2ZNb250aHMgPSBfYSA9PT0gdm9pZCAwID8gMSA6IF9hO1xuICAgIHZhciBvZmZzZXQgPSBwYWdlZE5hdmlnYXRpb24gPyBudW1iZXJPZk1vbnRocyA6IDE7XG4gICAgdmFyIG1vbnRoID0gc3RhcnRPZk1vbnRoKHN0YXJ0aW5nTW9udGgpO1xuICAgIGlmICghdG9EYXRlKSB7XG4gICAgICAgIHJldHVybiBhZGRNb250aHMobW9udGgsIG9mZnNldCk7XG4gICAgfVxuICAgIHZhciBtb250aHNEaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHModG9EYXRlLCBzdGFydGluZ01vbnRoKTtcbiAgICBpZiAobW9udGhzRGlmZiA8IG51bWJlck9mTW9udGhzKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIEp1bXAgZm9yd2FyZCBhcyB0aGUgbnVtYmVyIG9mIG1vbnRocyB3aGVuIHBhZ2VkIG5hdmlnYXRpb25cbiAgICByZXR1cm4gYWRkTW9udGhzKG1vbnRoLCBvZmZzZXQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0TmV4dE1vbnRoLmpzLm1hcCIsImltcG9ydCB7IGFkZE1vbnRocywgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMsIHN0YXJ0T2ZNb250aCB9IGZyb20gJ2RhdGUtZm5zJztcbi8qKlxuICogUmV0dXJucyB0aGUgbmV4dCBwcmV2aW91cyB0aGUgdXNlciBjYW4gbmF2aWdhdGUgdG8sIGFjY29yZGluZyB0byB0aGUgZ2l2ZW5cbiAqIG9wdGlvbnMuXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgcHJldmlvdXMgbW9udGggaXMgbm90IGFsd2F5cyB0aGUgcHJldmlvdXMgY2FsZW5kYXJcbiAqIG1vbnRoOlxuICpcbiAqIC0gaWYgYmVmb3JlIHRoZSBgZnJvbURhdGVgIGRhdGUsIGlzIGB1bmRlZmluZWRgO1xuICogLSBpZiB0aGUgbmF2aWdhdGlvbiBpcyBwYWdlZCwgaXMgdGhlIG51bWJlciBvZiBtb250aHMgZGlzcGxheWVkIGJlZm9yZS5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmV2aW91c01vbnRoKHN0YXJ0aW5nTW9udGgsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5kaXNhYmxlTmF2aWdhdGlvbikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgZnJvbURhdGUgPSBvcHRpb25zLmZyb21EYXRlLCBwYWdlZE5hdmlnYXRpb24gPSBvcHRpb25zLnBhZ2VkTmF2aWdhdGlvbiwgX2EgPSBvcHRpb25zLm51bWJlck9mTW9udGhzLCBudW1iZXJPZk1vbnRocyA9IF9hID09PSB2b2lkIDAgPyAxIDogX2E7XG4gICAgdmFyIG9mZnNldCA9IHBhZ2VkTmF2aWdhdGlvbiA/IG51bWJlck9mTW9udGhzIDogMTtcbiAgICB2YXIgbW9udGggPSBzdGFydE9mTW9udGgoc3RhcnRpbmdNb250aCk7XG4gICAgaWYgKCFmcm9tRGF0ZSkge1xuICAgICAgICByZXR1cm4gYWRkTW9udGhzKG1vbnRoLCAtb2Zmc2V0KTtcbiAgICB9XG4gICAgdmFyIG1vbnRoc0RpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhck1vbnRocyhtb250aCwgZnJvbURhdGUpO1xuICAgIGlmIChtb250aHNEaWZmIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gSnVtcCBiYWNrIGFzIHRoZSBudW1iZXIgb2YgbW9udGhzIHdoZW4gcGFnZWQgbmF2aWdhdGlvblxuICAgIHJldHVybiBhZGRNb250aHMobW9udGgsIC1vZmZzZXQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0UHJldmlvdXNNb250aC5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vRGF5UGlja2VyJztcbmltcG9ydCB7IHVzZU5hdmlnYXRpb25TdGF0ZSB9IGZyb20gJy4vdXNlTmF2aWdhdGlvblN0YXRlJztcbmltcG9ydCB7IGdldERpc3BsYXlNb250aHMgfSBmcm9tICcuL3V0aWxzL2dldERpc3BsYXlNb250aHMnO1xuaW1wb3J0IHsgZ2V0TmV4dE1vbnRoIH0gZnJvbSAnLi91dGlscy9nZXROZXh0TW9udGgnO1xuaW1wb3J0IHsgZ2V0UHJldmlvdXNNb250aCB9IGZyb20gJy4vdXRpbHMvZ2V0UHJldmlvdXNNb250aCc7XG4vKipcbiAqIFRoZSBOYXZpZ2F0aW9uIGNvbnRleHQgc2hhcmVzIGRldGFpbHMgYWJvdXQgdGhlIG1vbnRocyBiZWluZyBuYXZpZ2F0ZWQgaW4gRGF5UGlja2VyLlxuICpcbiAqIEFjY2VzcyB0aGlzIGNvbnRleHQgZnJvbSB0aGUgW1t1c2VOYXZpZ2F0aW9uXV0gaG9vay5cbiAqL1xuZXhwb3J0IHZhciBOYXZpZ2F0aW9uQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbi8qKiBQcm92aWRlcyB0aGUgdmFsdWVzIGZvciB0aGUgW1tOYXZpZ2F0aW9uQ29udGV4dF1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE5hdmlnYXRpb25Qcm92aWRlcihwcm9wcykge1xuICAgIHZhciBjb250ZXh0ID0gdXNlRGF5UGlja2VyKCk7XG4gICAgdmFyIF9hID0gdXNlTmF2aWdhdGlvblN0YXRlKCksIG1vbnRoID0gX2FbMF0sIGdvVG9Nb250aCA9IF9hWzFdO1xuICAgIHZhciBkaXNwbGF5TW9udGhzID0gZ2V0RGlzcGxheU1vbnRocyhtb250aCwgY29udGV4dCk7XG4gICAgdmFyIG5leHRNb250aCA9IGdldE5leHRNb250aChtb250aCwgY29udGV4dCk7XG4gICAgdmFyIHByZXZpb3VzTW9udGggPSBnZXRQcmV2aW91c01vbnRoKG1vbnRoLCBjb250ZXh0KTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoTmF2aWdhdGlvbkNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IHtcbiAgICAgICAgICAgIG1vbnRoOiBtb250aCxcbiAgICAgICAgICAgIGRpc3BsYXlNb250aHM6IGRpc3BsYXlNb250aHMsXG4gICAgICAgICAgICBnb1RvTW9udGg6IGdvVG9Nb250aCxcbiAgICAgICAgICAgIHByZXZpb3VzTW9udGg6IHByZXZpb3VzTW9udGgsXG4gICAgICAgICAgICBuZXh0TW9udGg6IG5leHRNb250aFxuICAgICAgICB9IH0sIHByb3BzLmNoaWxkcmVuKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OYXZpZ2F0aW9uQ29udGV4dC5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkNvbnRleHQgfSBmcm9tICcuL05hdmlnYXRpb25Db250ZXh0Jztcbi8qKiBIb29rIHRvIGFjY2VzcyB0aGUgW1tOYXZpZ2F0aW9uQ29udGV4dF1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU5hdmlnYXRpb24oKSB7XG4gICAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KE5hdmlnYXRpb25Db250ZXh0KTtcbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VOYXZpZ2F0aW9uIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBOYXZpZ2F0aW9uUHJvdmlkZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VOYXZpZ2F0aW9uLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc1NhbWVNb250aCB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IE1vbnRoc0Ryb3Bkb3duIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Nb250aHNEcm9wZG93bic7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9OYXZpZ2F0aW9uJztcbmltcG9ydCB7IFllYXJzRHJvcGRvd24gfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL1llYXJzRHJvcGRvd24nO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbmltcG9ydCB7IHVzZU5hdmlnYXRpb24gfSBmcm9tICcuLi8uLi9jb250ZXh0cy9OYXZpZ2F0aW9uJztcbi8qKlxuICogUmVuZGVyIHRoZSBjYXB0aW9uIG9mIGEgbW9udGgsIHdoaWNoIGluY2x1ZGVzIHRpdGxlIGFuZCBuYXZpZ2F0aW9uIGJ1dHRvbnMuXG4gKiBUaGUgY2FwdGlvbiBoYXMgYSBkaWZmZXJlbnQgbGF5b3V0IHdoZW4gc2V0dGluZyB0aGUgW1tEYXlQaWNrZXJQcm9wcy5jYXB0aW9uTGF5b3V0XV0gcHJvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENhcHRpb24ocHJvcHMpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGRpc3BsYXlNb250aCA9IHByb3BzLmRpc3BsYXlNb250aDtcbiAgICB2YXIgY29udGV4dCA9IHVzZURheVBpY2tlcigpO1xuICAgIHZhciBjbGFzc05hbWVzID0gY29udGV4dC5jbGFzc05hbWVzLCBudW1iZXJPZk1vbnRocyA9IGNvbnRleHQubnVtYmVyT2ZNb250aHMsIGRpc2FibGVOYXZpZ2F0aW9uID0gY29udGV4dC5kaXNhYmxlTmF2aWdhdGlvbiwgc3R5bGVzID0gY29udGV4dC5zdHlsZXMsIGNhcHRpb25MYXlvdXQgPSBjb250ZXh0LmNhcHRpb25MYXlvdXQsIG9uTW9udGhDaGFuZ2UgPSBjb250ZXh0Lm9uTW9udGhDaGFuZ2UsIGRpciA9IGNvbnRleHQuZGlyLCBDYXB0aW9uTGFiZWwgPSBjb250ZXh0LmNvbXBvbmVudHMuQ2FwdGlvbkxhYmVsO1xuICAgIHZhciBfYiA9IHVzZU5hdmlnYXRpb24oKSwgcHJldmlvdXNNb250aCA9IF9iLnByZXZpb3VzTW9udGgsIG5leHRNb250aCA9IF9iLm5leHRNb250aCwgZ29Ub01vbnRoID0gX2IuZ29Ub01vbnRoLCBkaXNwbGF5TW9udGhzID0gX2IuZGlzcGxheU1vbnRocztcbiAgICB2YXIgaGFuZGxlUHJldmlvdXNDbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFwcmV2aW91c01vbnRoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBnb1RvTW9udGgocHJldmlvdXNNb250aCk7XG4gICAgICAgIG9uTW9udGhDaGFuZ2UgPT09IG51bGwgfHwgb25Nb250aENoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25Nb250aENoYW5nZShwcmV2aW91c01vbnRoKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVOZXh0Q2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghbmV4dE1vbnRoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBnb1RvTW9udGgobmV4dE1vbnRoKTtcbiAgICAgICAgb25Nb250aENoYW5nZSA9PT0gbnVsbCB8fCBvbk1vbnRoQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk1vbnRoQ2hhbmdlKG5leHRNb250aCk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlTW9udGhDaGFuZ2UgPSBmdW5jdGlvbiAobmV3TW9udGgpIHtcbiAgICAgICAgZ29Ub01vbnRoKG5ld01vbnRoKTtcbiAgICAgICAgb25Nb250aENoYW5nZSA9PT0gbnVsbCB8fCBvbk1vbnRoQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbk1vbnRoQ2hhbmdlKG5ld01vbnRoKTtcbiAgICB9O1xuICAgIHZhciBkaXNwbGF5SW5kZXggPSBkaXNwbGF5TW9udGhzLmZpbmRJbmRleChmdW5jdGlvbiAobW9udGgpIHtcbiAgICAgICAgcmV0dXJuIGlzU2FtZU1vbnRoKGRpc3BsYXlNb250aCwgbW9udGgpO1xuICAgIH0pO1xuICAgIHZhciBpc0ZpcnN0ID0gZGlzcGxheUluZGV4ID09PSAwO1xuICAgIHZhciBpc0xhc3QgPSBkaXNwbGF5SW5kZXggPT09IGRpc3BsYXlNb250aHMubGVuZ3RoIC0gMTtcbiAgICBpZiAoZGlyID09PSAncnRsJykge1xuICAgICAgICBfYSA9IFtpc0ZpcnN0LCBpc0xhc3RdLCBpc0xhc3QgPSBfYVswXSwgaXNGaXJzdCA9IF9hWzFdO1xuICAgIH1cbiAgICB2YXIgaGlkZU5leHQgPSBudW1iZXJPZk1vbnRocyA+IDEgJiYgKGlzRmlyc3QgfHwgIWlzTGFzdCk7XG4gICAgdmFyIGhpZGVQcmV2aW91cyA9IG51bWJlck9mTW9udGhzID4gMSAmJiAoaXNMYXN0IHx8ICFpc0ZpcnN0KTtcbiAgICB2YXIgY2FwdGlvbkxhYmVsID0gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2FwdGlvbkxhYmVsLCB7IGlkOiBwcm9wcy5pZCwgZGlzcGxheU1vbnRoOiBkaXNwbGF5TW9udGggfSkpO1xuICAgIHZhciBjYXB0aW9uQ29udGVudDtcbiAgICBpZiAoZGlzYWJsZU5hdmlnYXRpb24pIHtcbiAgICAgICAgY2FwdGlvbkNvbnRlbnQgPSBjYXB0aW9uTGFiZWw7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNhcHRpb25MYXlvdXQgPT09ICdkcm9wZG93bicpIHtcbiAgICAgICAgY2FwdGlvbkNvbnRlbnQgPSAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5jYXB0aW9uX2Ryb3Bkb3ducywgc3R5bGU6IHN0eWxlcy5jYXB0aW9uX2Ryb3Bkb3ducyB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy52aGlkZGVuIH0sIGNhcHRpb25MYWJlbCksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KE1vbnRoc0Ryb3Bkb3duLCB7IG9uQ2hhbmdlOiBoYW5kbGVNb250aENoYW5nZSwgZGlzcGxheU1vbnRoOiBkaXNwbGF5TW9udGggfSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFllYXJzRHJvcGRvd24sIHsgb25DaGFuZ2U6IGhhbmRsZU1vbnRoQ2hhbmdlLCBkaXNwbGF5TW9udGg6IGRpc3BsYXlNb250aCB9KSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2FwdGlvbkNvbnRlbnQgPSAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgICAgIGNhcHRpb25MYWJlbCxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTmF2aWdhdGlvbiwgeyBkaXNwbGF5TW9udGg6IGRpc3BsYXlNb250aCwgaGlkZU5leHQ6IGhpZGVOZXh0LCBoaWRlUHJldmlvdXM6IGhpZGVQcmV2aW91cywgbmV4dE1vbnRoOiBuZXh0TW9udGgsIHByZXZpb3VzTW9udGg6IHByZXZpb3VzTW9udGgsIG9uUHJldmlvdXNDbGljazogaGFuZGxlUHJldmlvdXNDbGljaywgb25OZXh0Q2xpY2s6IGhhbmRsZU5leHRDbGljayB9KSkpO1xuICAgIH1cbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMuY2FwdGlvbiwgc3R5bGU6IHN0eWxlcy5jYXB0aW9uIH0sIGNhcHRpb25Db250ZW50KSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYXB0aW9uLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuLyoqIFJlbmRlciB0aGUgY2FwdGlvbiBmb3IgdGhlIGRpc3BsYXllZCBtb250aC4gVGhpcyBjb21wb25lbnQgaXMgdXNlZCB3aGVuIGBjYXB0aW9uTGF5b3V0PVwiYnV0dG9uc1wiYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDYXB0aW9uTGFiZWwocHJvcHMpIHtcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgbG9jYWxlID0gX2EubG9jYWxlLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgc3R5bGVzID0gX2Euc3R5bGVzLCBmb3JtYXRDYXB0aW9uID0gX2EuZm9ybWF0dGVycy5mb3JtYXRDYXB0aW9uO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImgyXCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmNhcHRpb25fbGFiZWwsIHN0eWxlOiBzdHlsZXMuY2FwdGlvbl9sYWJlbCwgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIiwgXCJhcmlhLWF0b21pY1wiOiBcInRydWVcIiwgaWQ6IHByb3BzLmlkIH0sIGZvcm1hdENhcHRpb24ocHJvcHMuZGlzcGxheU1vbnRoLCB7IGxvY2FsZTogbG9jYWxlIH0pKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYXB0aW9uTGFiZWwuanMubWFwIiwiLyoqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBwcm9wcyBhcmUgb2YgdHlwZSBbW0RheVBpY2tlck11bHRpcGxlXV0uICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXlQaWNrZXJNdWx0aXBsZShwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy5tb2RlID09PSAnbXVsdGlwbGUnO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF5UGlja2VyTXVsdGlwbGUuanMubWFwIiwiaW1wb3J0IHsgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzU2FtZURheSB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IGlzRGF5UGlja2VyTXVsdGlwbGUgfSBmcm9tICcuLi8uLi90eXBlcy9EYXlQaWNrZXJNdWx0aXBsZSc7XG4vKipcbiAqIFRoZSBTZWxlY3RNdWx0aXBsZSBjb250ZXh0IHNoYXJlcyBkZXRhaWxzIGFib3V0IHRoZSBzZWxlY3RlZCBkYXlzIHdoZW4gaW5cbiAqIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlLlxuICpcbiAqIEFjY2VzcyB0aGlzIGNvbnRleHQgZnJvbSB0aGUgW1t1c2VTZWxlY3RNdWx0aXBsZV1dIGhvb2suXG4gKi9cbmV4cG9ydCB2YXIgU2VsZWN0TXVsdGlwbGVDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuLyoqIFByb3ZpZGVzIHRoZSB2YWx1ZXMgZm9yIHRoZSBbW1NlbGVjdE11bHRpcGxlQ29udGV4dF1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdE11bHRpcGxlUHJvdmlkZXIocHJvcHMpIHtcbiAgICBpZiAoIWlzRGF5UGlja2VyTXVsdGlwbGUocHJvcHMuaW5pdGlhbFByb3BzKSkge1xuICAgICAgICB2YXIgZW1wdHlDb250ZXh0VmFsdWUgPSB7XG4gICAgICAgICAgICBzZWxlY3RlZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbW9kaWZpZXJzOiB7XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RNdWx0aXBsZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGVtcHR5Q29udGV4dFZhbHVlIH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RNdWx0aXBsZVByb3ZpZGVySW50ZXJuYWwsIHsgaW5pdGlhbFByb3BzOiBwcm9wcy5pbml0aWFsUHJvcHMsIGNoaWxkcmVuOiBwcm9wcy5jaGlsZHJlbiB9KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0TXVsdGlwbGVQcm92aWRlckludGVybmFsKF9hKSB7XG4gICAgdmFyIGluaXRpYWxQcm9wcyA9IF9hLmluaXRpYWxQcm9wcywgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbjtcbiAgICB2YXIgc2VsZWN0ZWQgPSBpbml0aWFsUHJvcHMuc2VsZWN0ZWQ7XG4gICAgdmFyIG9uRGF5Q2xpY2sgPSBmdW5jdGlvbiAoZGF5LCBtb2RpZmllcnMsIGUpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgKF9hID0gaW5pdGlhbFByb3BzLm9uRGF5Q2xpY2spID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGluaXRpYWxQcm9wcywgZGF5LCBtb2RpZmllcnMsIGUpO1xuICAgICAgICB2YXIgaXNNaW5TZWxlY3RlZCA9IEJvb2xlYW4oaW5pdGlhbFByb3BzLm1pbiAmJlxuICAgICAgICAgICAgbW9kaWZpZXJzLnNlbGVjdGVkICYmXG4gICAgICAgICAgICBzZWxlY3RlZCAmJlxuICAgICAgICAgICAgc2VsZWN0ZWQubGVuZ3RoID09PSBpbml0aWFsUHJvcHMubWluKTtcbiAgICAgICAgaWYgKGlzTWluU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaXNNYXhTZWxlY3RlZCA9IEJvb2xlYW4oaW5pdGlhbFByb3BzLm1heCAmJlxuICAgICAgICAgICAgIW1vZGlmaWVycy5zZWxlY3RlZCAmJlxuICAgICAgICAgICAgc2VsZWN0ZWQgJiZcbiAgICAgICAgICAgIHNlbGVjdGVkLmxlbmd0aCA9PT0gaW5pdGlhbFByb3BzLm1heCk7XG4gICAgICAgIGlmIChpc01heFNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRheXMgPSBzZWxlY3RlZCA/IF9fc3ByZWFkQXJyYXkoW10sIHNlbGVjdGVkLCB0cnVlKSA6IFtdO1xuICAgICAgICBpZiAobW9kaWZpZXJzLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBkYXlzLmZpbmRJbmRleChmdW5jdGlvbiAoc2VsZWN0ZWREYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNTYW1lRGF5KGRheSwgc2VsZWN0ZWREYXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkYXlzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkYXlzLnB1c2goZGF5KTtcbiAgICAgICAgfVxuICAgICAgICAoX2IgPSBpbml0aWFsUHJvcHMub25TZWxlY3QpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKGluaXRpYWxQcm9wcywgZGF5cywgZGF5LCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIG1vZGlmaWVycyA9IHtcbiAgICAgICAgZGlzYWJsZWQ6IFtdXG4gICAgfTtcbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgbW9kaWZpZXJzLmRpc2FibGVkID0gW1xuICAgICAgICAgICAgZnVuY3Rpb24gZGlzYWJsZURheShkYXkpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXNNYXhTZWxlY3RlZCA9IGluaXRpYWxQcm9wcy5tYXggJiZcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQubGVuZ3RoID4gaW5pdGlhbFByb3BzLm1heCAtIDE7XG4gICAgICAgICAgICAgICAgdmFyIGlzU2VsZWN0ZWQgPSBzZWxlY3RlZCA9PT0gbnVsbCB8fCBzZWxlY3RlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWQuc29tZShmdW5jdGlvbiAoc2VsZWN0ZWREYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzU2FtZURheShzZWxlY3RlZERheSwgZGF5KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihpc01heFNlbGVjdGVkICYmICFpc1NlbGVjdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICB9XG4gICAgdmFyIGNvbnRleHRWYWx1ZSA9IHsgc2VsZWN0ZWQ6IHNlbGVjdGVkLCBvbkRheUNsaWNrOiBvbkRheUNsaWNrLCBtb2RpZmllcnM6IG1vZGlmaWVycyB9O1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RNdWx0aXBsZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGNvbnRleHRWYWx1ZSB9LCBjaGlsZHJlbikpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VsZWN0TXVsdGlwbGVDb250ZXh0LmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBTZWxlY3RNdWx0aXBsZUNvbnRleHQgfSBmcm9tICcuL1NlbGVjdE11bHRpcGxlQ29udGV4dCc7XG4vKiogSG9vayB0byBhY2Nlc3MgdGhlIFtbU2VsZWN0TXVsdGlwbGVDb250ZXh0XV0uICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU2VsZWN0TXVsdGlwbGUoKSB7XG4gICAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNlbGVjdE11bHRpcGxlQ29udGV4dCk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlU2VsZWN0TXVsdGlwbGUgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIFNlbGVjdE11bHRpcGxlUHJvdmlkZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VTZWxlY3RNdWx0aXBsZS5qcy5tYXAiLCIvKiogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHByb3BzIGFyZSBvZiB0eXBlIFtbRGF5UGlja2VyUmFuZ2VdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RheVBpY2tlclJhbmdlKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLm1vZGUgPT09ICdyYW5nZSc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXlQaWNrZXJSYW5nZS5qcy5tYXAiLCJpbXBvcnQgeyBpc0FmdGVyLCBpc0JlZm9yZSwgaXNTYW1lRGF5IH0gZnJvbSAnZGF0ZS1mbnMnO1xuLyoqXG4gKiBBZGQgYSBkYXkgdG8gYW4gZXhpc3RpbmcgcmFuZ2UuXG4gKlxuICogVGhlIHJldHVybmVkIHJhbmdlIHRha2VzIGluIGFjY291bnQgdGhlIGB1bmRlZmluZWRgIHZhbHVlcyBhbmQgaWYgdGhlIGFkZGVkXG4gKiBkYXkgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSByYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFRvUmFuZ2UoZGF5LCByYW5nZSkge1xuICAgIHZhciBfYSA9IHJhbmdlIHx8IHt9LCBmcm9tID0gX2EuZnJvbSwgdG8gPSBfYS50bztcbiAgICBpZiAoIWZyb20pIHtcbiAgICAgICAgcmV0dXJuIHsgZnJvbTogZGF5LCB0bzogZGF5IH07XG4gICAgfVxuICAgIGlmICghdG8gJiYgaXNTYW1lRGF5KGZyb20sIGRheSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCF0byAmJiBpc0JlZm9yZShkYXksIGZyb20pKSB7XG4gICAgICAgIHJldHVybiB7IGZyb206IGRheSwgdG86IGZyb20gfTtcbiAgICB9XG4gICAgaWYgKCF0bykge1xuICAgICAgICByZXR1cm4geyBmcm9tOiBmcm9tLCB0bzogZGF5IH07XG4gICAgfVxuICAgIGlmIChpc1NhbWVEYXkodG8sIGRheSkgJiYgaXNTYW1lRGF5KGZyb20sIGRheSkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGlzU2FtZURheSh0bywgZGF5KSkge1xuICAgICAgICByZXR1cm4geyBmcm9tOiB0bywgdG86IHRvIH07XG4gICAgfVxuICAgIGlmIChpc1NhbWVEYXkoZnJvbSwgZGF5KSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoaXNBZnRlcihmcm9tLCBkYXkpKSB7XG4gICAgICAgIHJldHVybiB7IGZyb206IGRheSwgdG86IHRvIH07XG4gICAgfVxuICAgIHJldHVybiB7IGZyb206IGZyb20sIHRvOiBkYXkgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkZFRvUmFuZ2UuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cywgaXNBZnRlciwgaXNCZWZvcmUgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBpc0RheVBpY2tlclJhbmdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvRGF5UGlja2VyUmFuZ2UnO1xuaW1wb3J0IHsgYWRkVG9SYW5nZSB9IGZyb20gJy4vdXRpbHMvYWRkVG9SYW5nZSc7XG4vKipcbiAqIFRoZSBTZWxlY3RSYW5nZSBjb250ZXh0IHNoYXJlcyBkZXRhaWxzIGFib3V0IHRoZSBzZWxlY3RlZCBkYXlzIHdoZW4gaW5cbiAqIHJhbmdlIHNlbGVjdGlvbiBtb2RlLlxuICpcbiAqIEFjY2VzcyB0aGlzIGNvbnRleHQgZnJvbSB0aGUgW1t1c2VTZWxlY3RSYW5nZV1dIGhvb2suXG4gKi9cbmV4cG9ydCB2YXIgU2VsZWN0UmFuZ2VDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuLyoqIFByb3ZpZGVzIHRoZSB2YWx1ZXMgZm9yIHRoZSBbW1NlbGVjdFJhbmdlUHJvdmlkZXJdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZWxlY3RSYW5nZVByb3ZpZGVyKHByb3BzKSB7XG4gICAgaWYgKCFpc0RheVBpY2tlclJhbmdlKHByb3BzLmluaXRpYWxQcm9wcykpIHtcbiAgICAgICAgdmFyIGVtcHR5Q29udGV4dFZhbHVlID0ge1xuICAgICAgICAgICAgc2VsZWN0ZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG1vZGlmaWVyczoge1xuICAgICAgICAgICAgICAgIHJhbmdlX3N0YXJ0OiBbXSxcbiAgICAgICAgICAgICAgICByYW5nZV9lbmQ6IFtdLFxuICAgICAgICAgICAgICAgIHJhbmdlX21pZGRsZTogW10sXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RSYW5nZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGVtcHR5Q29udGV4dFZhbHVlIH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RSYW5nZVByb3ZpZGVySW50ZXJuYWwsIHsgaW5pdGlhbFByb3BzOiBwcm9wcy5pbml0aWFsUHJvcHMsIGNoaWxkcmVuOiBwcm9wcy5jaGlsZHJlbiB9KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0UmFuZ2VQcm92aWRlckludGVybmFsKF9hKSB7XG4gICAgdmFyIGluaXRpYWxQcm9wcyA9IF9hLmluaXRpYWxQcm9wcywgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbjtcbiAgICB2YXIgc2VsZWN0ZWQgPSBpbml0aWFsUHJvcHMuc2VsZWN0ZWQ7XG4gICAgdmFyIG1pbiA9IGluaXRpYWxQcm9wcy5taW47XG4gICAgdmFyIG1heCA9IGluaXRpYWxQcm9wcy5tYXg7XG4gICAgdmFyIG9uRGF5Q2xpY2sgPSBmdW5jdGlvbiAoZGF5LCBtb2RpZmllcnMsIGUpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgKF9hID0gaW5pdGlhbFByb3BzLm9uRGF5Q2xpY2spID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGluaXRpYWxQcm9wcywgZGF5LCBtb2RpZmllcnMsIGUpO1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSBhZGRUb1JhbmdlKGRheSwgc2VsZWN0ZWQpO1xuICAgICAgICBpZiAoKG1pbiB8fCBtYXgpICYmXG4gICAgICAgICAgICBzZWxlY3RlZCAmJlxuICAgICAgICAgICAgKG5ld1ZhbHVlID09PSBudWxsIHx8IG5ld1ZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuZXdWYWx1ZS50bykgJiZcbiAgICAgICAgICAgIG5ld1ZhbHVlLmZyb20gJiZcbiAgICAgICAgICAgIG5ld1ZhbHVlLmZyb20gIT09IG5ld1ZhbHVlLnRvKSB7XG4gICAgICAgICAgICB2YXIgZGlmZiA9IE1hdGguYWJzKGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhuZXdWYWx1ZSA9PT0gbnVsbCB8fCBuZXdWYWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmV3VmFsdWUudG8sIG5ld1ZhbHVlID09PSBudWxsIHx8IG5ld1ZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuZXdWYWx1ZS5mcm9tKSk7XG4gICAgICAgICAgICBpZiAobWluICYmIGRpZmYgPCBtaW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF4ICYmIGRpZmYgPj0gbWF4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIChfYiA9IGluaXRpYWxQcm9wcy5vblNlbGVjdCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoaW5pdGlhbFByb3BzLCBuZXdWYWx1ZSwgZGF5LCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIG1vZGlmaWVycyA9IHtcbiAgICAgICAgcmFuZ2Vfc3RhcnQ6IFtdLFxuICAgICAgICByYW5nZV9lbmQ6IFtdLFxuICAgICAgICByYW5nZV9taWRkbGU6IFtdLFxuICAgICAgICBkaXNhYmxlZDogW11cbiAgICB9O1xuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBpZiAoc2VsZWN0ZWQuZnJvbSkge1xuICAgICAgICAgICAgbW9kaWZpZXJzLnJhbmdlX3N0YXJ0ID0gW3NlbGVjdGVkLmZyb21dO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkLnRvKSB7XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJzLnJhbmdlX21pZGRsZSA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXI6IHNlbGVjdGVkLmZyb20sXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmU6IHNlbGVjdGVkLnRvXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGlmIChtYXggfHwgbWluKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycy5kaXNhYmxlZCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC50byAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC5mcm9tICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQmVmb3JlKGRhdGUsIHNlbGVjdGVkLmZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKHNlbGVjdGVkLnRvLCBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPj0gbWF4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLnRvICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLmZyb20gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBZnRlcihkYXRlLCBzZWxlY3RlZC50bykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZGF0ZSwgc2VsZWN0ZWQuZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmID49IG1heCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbiAmJiBzZWxlY3RlZC5mcm9tICYmIGlzQmVmb3JlKGRhdGUsIHNlbGVjdGVkLmZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKHNlbGVjdGVkLmZyb20sIGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA8IG1pbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC50byAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC5mcm9tICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWZ0ZXIoZGF0ZSwgc2VsZWN0ZWQudG8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGRhdGUsIHNlbGVjdGVkLmZyb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA8IG1pbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtb2RpZmllcnMucmFuZ2VfZW5kID0gW3NlbGVjdGVkLnRvXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGlmaWVycy5yYW5nZV9lbmQgPSBbc2VsZWN0ZWQuZnJvbV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdFJhbmdlQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogeyBzZWxlY3RlZDogc2VsZWN0ZWQsIG9uRGF5Q2xpY2s6IG9uRGF5Q2xpY2ssIG1vZGlmaWVyczogbW9kaWZpZXJzIH0gfSwgY2hpbGRyZW4pKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNlbGVjdFJhbmdlQ29udGV4dC5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgU2VsZWN0UmFuZ2VDb250ZXh0IH0gZnJvbSAnLi9TZWxlY3RSYW5nZUNvbnRleHQnO1xuLyoqIEhvb2sgdG8gYWNjZXNzIHRoZSBbW1NlbGVjdFJhbmdlQ29udGV4dF1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVNlbGVjdFJhbmdlKCkge1xuICAgIHZhciBjb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChTZWxlY3RSYW5nZUNvbnRleHQpO1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZVNlbGVjdFJhbmdlIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBTZWxlY3RSYW5nZVByb3ZpZGVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNlU2VsZWN0UmFuZ2UuanMubWFwIiwiLyoqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBwcm9wcyBhcmUgb2YgdHlwZSBbW0RheVBpY2tlclNpbmdsZV1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF5UGlja2VyU2luZ2xlKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLm1vZGUgPT09ICdzaW5nbGUnO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF5UGlja2VyU2luZ2xlLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc0RheVBpY2tlclNpbmdsZSB9IGZyb20gJy4uLy4uL3R5cGVzL0RheVBpY2tlclNpbmdsZSc7XG4vKipcbiAqIFRoZSBTZWxlY3RTaW5nbGUgY29udGV4dCBzaGFyZXMgZGV0YWlscyBhYm91dCB0aGUgc2VsZWN0ZWQgZGF5cyB3aGVuIGluXG4gKiBzaW5nbGUgc2VsZWN0aW9uIG1vZGUuXG4gKlxuICogQWNjZXNzIHRoaXMgY29udGV4dCBmcm9tIHRoZSBbW3VzZVNlbGVjdFNpbmdsZV1dIGhvb2suXG4gKi9cbmV4cG9ydCB2YXIgU2VsZWN0U2luZ2xlQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbi8qKiBQcm92aWRlcyB0aGUgdmFsdWVzIGZvciB0aGUgW1tTZWxlY3RTaW5nbGVQcm92aWRlcl1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdFNpbmdsZVByb3ZpZGVyKHByb3BzKSB7XG4gICAgaWYgKCFpc0RheVBpY2tlclNpbmdsZShwcm9wcy5pbml0aWFsUHJvcHMpKSB7XG4gICAgICAgIHZhciBlbXB0eUNvbnRleHRWYWx1ZSA9IHtcbiAgICAgICAgICAgIHNlbGVjdGVkOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdFNpbmdsZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGVtcHR5Q29udGV4dFZhbHVlIH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RTaW5nbGVQcm92aWRlckludGVybmFsLCB7IGluaXRpYWxQcm9wczogcHJvcHMuaW5pdGlhbFByb3BzLCBjaGlsZHJlbjogcHJvcHMuY2hpbGRyZW4gfSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdFNpbmdsZVByb3ZpZGVySW50ZXJuYWwoX2EpIHtcbiAgICB2YXIgaW5pdGlhbFByb3BzID0gX2EuaW5pdGlhbFByb3BzLCBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuO1xuICAgIHZhciBvbkRheUNsaWNrID0gZnVuY3Rpb24gKGRheSwgZGF5TW9kaWZpZXJzLCBlKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmIChkYXlNb2RpZmllcnMuc2VsZWN0ZWQgJiYgIWluaXRpYWxQcm9wcy5yZXF1aXJlZCkge1xuICAgICAgICAgICAgKF9hID0gaW5pdGlhbFByb3BzLm9uU2VsZWN0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChpbml0aWFsUHJvcHMsIHVuZGVmaW5lZCwgZGF5LCBkYXlNb2RpZmllcnMsIGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIChfYiA9IGluaXRpYWxQcm9wcy5vblNlbGVjdCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoaW5pdGlhbFByb3BzLCBkYXksIGRheSwgZGF5TW9kaWZpZXJzLCBlKTtcbiAgICB9O1xuICAgIHZhciBjb250ZXh0VmFsdWUgPSB7XG4gICAgICAgIHNlbGVjdGVkOiBpbml0aWFsUHJvcHMuc2VsZWN0ZWQsXG4gICAgICAgIG9uRGF5Q2xpY2s6IG9uRGF5Q2xpY2tcbiAgICB9O1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RTaW5nbGVDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBjb250ZXh0VmFsdWUgfSwgY2hpbGRyZW4pKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNlbGVjdFNpbmdsZUNvbnRleHQuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFNlbGVjdFNpbmdsZUNvbnRleHQgfSBmcm9tICcuL1NlbGVjdFNpbmdsZUNvbnRleHQnO1xuLyoqIEhvb2sgdG8gYWNjZXNzIHRoZSBbW1NlbGVjdFNpbmdsZUNvbnRleHRdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTZWxlY3RTaW5nbGUoKSB7XG4gICAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KFNlbGVjdFNpbmdsZUNvbnRleHQpO1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZVNlbGVjdFNpbmdsZSBtdXN0IGJlIHVzZWQgd2l0aGluIGEgU2VsZWN0U2luZ2xlUHJvdmlkZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VTZWxlY3RTaW5nbGUuanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIHRvTWF0Y2hlckFycmF5KG1vZGlmaWVyRnJvbVByb3ApIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RpZmllckZyb21Qcm9wKSkge1xuICAgICAgICByZXR1cm4gbW9kaWZpZXJGcm9tUHJvcDtcbiAgICB9XG4gICAgZWxzZSBpZiAobW9kaWZpZXJGcm9tUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbbW9kaWZpZXJGcm9tUHJvcF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG9NYXRjaGVyQXJyYXkuanMubWFwIiwiaW1wb3J0IHsgdG9NYXRjaGVyQXJyYXkgfSBmcm9tICcuL3RvTWF0Y2hlckFycmF5Jztcbi8qKiBSZXR1cm4gdGhlIFtbQ3VzdG9tTW9kaWZpZXJzXV0gZnJvbSB0aGUgRGF5UGlja2VyIGNvbnRleHQuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VzdG9tTW9kaWZpZXJzKGRheVBpY2tlcikge1xuICAgIHZhciBjdXN0b21Nb2RpZmllcnMgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhkYXlQaWNrZXIubW9kaWZpZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgbW9kaWZpZXIgPSBfYVswXSwgbWF0Y2hlciA9IF9hWzFdO1xuICAgICAgICBjdXN0b21Nb2RpZmllcnNbbW9kaWZpZXJdID0gdG9NYXRjaGVyQXJyYXkobWF0Y2hlcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGN1c3RvbU1vZGlmaWVycztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldEN1c3RvbU1vZGlmaWVycy5qcy5tYXAiLCIvKiogVGhlIG1vZGlmaWVycyB0aGF0IGFyZSB1c2VkIGludGVybmFsbHkgYnkgRGF5UGlja2VyLiAqL1xuZXhwb3J0IHZhciBJbnRlcm5hbE1vZGlmaWVyO1xuKGZ1bmN0aW9uIChJbnRlcm5hbE1vZGlmaWVyKSB7XG4gICAgLyoqIE5hbWUgb2YgdGhlIG1vZGlmaWVyIGFwcGxpZWQgdG8gdGhlIGRpc2FibGVkIGRheXMsIHVzaW5nIHRoZSBgZGlzYWJsZWRgIHByb3AuICovXG4gICAgSW50ZXJuYWxNb2RpZmllcltcIkRpc2FibGVkXCJdID0gXCJkaXNhYmxlZFwiO1xuICAgIC8qKiBOYW1lIG9mIHRoZSBtb2RpZmllciBhcHBsaWVkIHRvIHRoZSBzZWxlY3RlZCBkYXlzIHVzaW5nIHRoZSBgc2VsZWN0ZWRgIHByb3ApLiAqL1xuICAgIEludGVybmFsTW9kaWZpZXJbXCJTZWxlY3RlZFwiXSA9IFwic2VsZWN0ZWRcIjtcbiAgICAvKiogTmFtZSBvZiB0aGUgbW9kaWZpZXIgYXBwbGllZCB0byB0aGUgaGlkZGVuIGRheXMgdXNpbmcgdGhlIGBoaWRkZW5gIHByb3ApLiAqL1xuICAgIEludGVybmFsTW9kaWZpZXJbXCJIaWRkZW5cIl0gPSBcImhpZGRlblwiO1xuICAgIC8qKiBOYW1lIG9mIHRoZSBtb2RpZmllciBhcHBsaWVkIHRvIHRoZSBkYXkgc3BlY2lmaWVkIHVzaW5nIHRoZSBgdG9kYXlgIHByb3ApLiAqL1xuICAgIEludGVybmFsTW9kaWZpZXJbXCJUb2RheVwiXSA9IFwidG9kYXlcIjtcbiAgICAvKiogVGhlIG1vZGlmaWVyIGFwcGxpZWQgdG8gdGhlIGRheSBzdGFydGluZyBhIHNlbGVjdGVkIHJhbmdlLCB3aGVuIGluIHJhbmdlIHNlbGVjdGlvbiBtb2RlLiAgKi9cbiAgICBJbnRlcm5hbE1vZGlmaWVyW1wiUmFuZ2VTdGFydFwiXSA9IFwicmFuZ2Vfc3RhcnRcIjtcbiAgICAvKiogVGhlIG1vZGlmaWVyIGFwcGxpZWQgdG8gdGhlIGRheSBlbmRpbmcgYSBzZWxlY3RlZCByYW5nZSwgd2hlbiBpbiByYW5nZSBzZWxlY3Rpb24gbW9kZS4gICovXG4gICAgSW50ZXJuYWxNb2RpZmllcltcIlJhbmdlRW5kXCJdID0gXCJyYW5nZV9lbmRcIjtcbiAgICAvKiogVGhlIG1vZGlmaWVyIGFwcGxpZWQgdG8gdGhlIGRheXMgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgYSBzZWxlY3RlZCByYW5nZSwgd2hlbiBpbiByYW5nZSBzZWxlY3Rpb24gbW9kZS4gICovXG4gICAgSW50ZXJuYWxNb2RpZmllcltcIlJhbmdlTWlkZGxlXCJdID0gXCJyYW5nZV9taWRkbGVcIjtcbn0pKEludGVybmFsTW9kaWZpZXIgfHwgKEludGVybmFsTW9kaWZpZXIgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TW9kaWZpZXJzLmpzLm1hcCIsImltcG9ydCB7IGlzRGF5UGlja2VyTXVsdGlwbGUgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9EYXlQaWNrZXJNdWx0aXBsZSc7XG5pbXBvcnQgeyBpc0RheVBpY2tlclJhbmdlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvRGF5UGlja2VyUmFuZ2UnO1xuaW1wb3J0IHsgSW50ZXJuYWxNb2RpZmllciB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL01vZGlmaWVycyc7XG5pbXBvcnQgeyB0b01hdGNoZXJBcnJheSB9IGZyb20gJy4vdG9NYXRjaGVyQXJyYXknO1xuLyoqIFJldHVybiB0aGUgW1tJbnRlcm5hbE1vZGlmaWVyc11dIGZyb20gdGhlIERheVBpY2tlciBhbmQgc2VsZWN0IGNvbnRleHRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVybmFsTW9kaWZpZXJzKGRheVBpY2tlciwgc2VsZWN0TXVsdGlwbGUsIHNlbGVjdFJhbmdlKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBpbnRlcm5hbE1vZGlmaWVycyA9IChfYSA9IHt9LFxuICAgICAgICBfYVtJbnRlcm5hbE1vZGlmaWVyLlNlbGVjdGVkXSA9IHRvTWF0Y2hlckFycmF5KGRheVBpY2tlci5zZWxlY3RlZCksXG4gICAgICAgIF9hW0ludGVybmFsTW9kaWZpZXIuRGlzYWJsZWRdID0gdG9NYXRjaGVyQXJyYXkoZGF5UGlja2VyLmRpc2FibGVkKSxcbiAgICAgICAgX2FbSW50ZXJuYWxNb2RpZmllci5IaWRkZW5dID0gdG9NYXRjaGVyQXJyYXkoZGF5UGlja2VyLmhpZGRlbiksXG4gICAgICAgIF9hW0ludGVybmFsTW9kaWZpZXIuVG9kYXldID0gW2RheVBpY2tlci50b2RheV0sXG4gICAgICAgIF9hW0ludGVybmFsTW9kaWZpZXIuUmFuZ2VFbmRdID0gW10sXG4gICAgICAgIF9hW0ludGVybmFsTW9kaWZpZXIuUmFuZ2VNaWRkbGVdID0gW10sXG4gICAgICAgIF9hW0ludGVybmFsTW9kaWZpZXIuUmFuZ2VTdGFydF0gPSBbXSxcbiAgICAgICAgX2EpO1xuICAgIGlmIChkYXlQaWNrZXIuZnJvbURhdGUpIHtcbiAgICAgICAgaW50ZXJuYWxNb2RpZmllcnMuZGlzYWJsZWQucHVzaCh7IGJlZm9yZTogZGF5UGlja2VyLmZyb21EYXRlIH0pO1xuICAgIH1cbiAgICBpZiAoZGF5UGlja2VyLnRvRGF0ZSkge1xuICAgICAgICBpbnRlcm5hbE1vZGlmaWVycy5kaXNhYmxlZC5wdXNoKHsgYWZ0ZXI6IGRheVBpY2tlci50b0RhdGUgfSk7XG4gICAgfVxuICAgIGlmIChpc0RheVBpY2tlck11bHRpcGxlKGRheVBpY2tlcikpIHtcbiAgICAgICAgaW50ZXJuYWxNb2RpZmllcnMuZGlzYWJsZWQgPSBpbnRlcm5hbE1vZGlmaWVycy5kaXNhYmxlZC5jb25jYXQoc2VsZWN0TXVsdGlwbGUubW9kaWZpZXJzLmRpc2FibGVkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNEYXlQaWNrZXJSYW5nZShkYXlQaWNrZXIpKSB7XG4gICAgICAgIGludGVybmFsTW9kaWZpZXJzLmRpc2FibGVkID0gaW50ZXJuYWxNb2RpZmllcnMuZGlzYWJsZWQuY29uY2F0KHNlbGVjdFJhbmdlLm1vZGlmaWVycy5kaXNhYmxlZCk7XG4gICAgICAgIGludGVybmFsTW9kaWZpZXJzLnJhbmdlX3N0YXJ0ID0gc2VsZWN0UmFuZ2UubW9kaWZpZXJzLnJhbmdlX3N0YXJ0O1xuICAgICAgICBpbnRlcm5hbE1vZGlmaWVycy5yYW5nZV9taWRkbGUgPSBzZWxlY3RSYW5nZS5tb2RpZmllcnMucmFuZ2VfbWlkZGxlO1xuICAgICAgICBpbnRlcm5hbE1vZGlmaWVycy5yYW5nZV9lbmQgPSBzZWxlY3RSYW5nZS5tb2RpZmllcnMucmFuZ2VfZW5kO1xuICAgIH1cbiAgICByZXR1cm4gaW50ZXJuYWxNb2RpZmllcnM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRJbnRlcm5hbE1vZGlmaWVycy5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyB1c2VTZWxlY3RNdWx0aXBsZSB9IGZyb20gJy4uLy4uL2NvbnRleHRzL1NlbGVjdE11bHRpcGxlJztcbmltcG9ydCB7IHVzZVNlbGVjdFJhbmdlIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvU2VsZWN0UmFuZ2UnO1xuaW1wb3J0IHsgZ2V0Q3VzdG9tTW9kaWZpZXJzIH0gZnJvbSAnLi91dGlscy9nZXRDdXN0b21Nb2RpZmllcnMnO1xuaW1wb3J0IHsgZ2V0SW50ZXJuYWxNb2RpZmllcnMgfSBmcm9tICcuL3V0aWxzL2dldEludGVybmFsTW9kaWZpZXJzJztcbi8qKiBUaGUgTW9kaWZpZXJzIGNvbnRleHQgc3RvcmUgdGhlIG1vZGlmaWVycyB1c2VkIGluIERheVBpY2tlci4gVG8gYWNjZXNzIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbnRleHQsIHVzZSBbW3VzZU1vZGlmaWVyc11dLiAqL1xuZXhwb3J0IHZhciBNb2RpZmllcnNDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuLyoqIFByb3ZpZGUgdGhlIHZhbHVlIGZvciB0aGUgW1tNb2RpZmllcnNDb250ZXh0XV0uICovXG5leHBvcnQgZnVuY3Rpb24gTW9kaWZpZXJzUHJvdmlkZXIocHJvcHMpIHtcbiAgICB2YXIgZGF5UGlja2VyID0gdXNlRGF5UGlja2VyKCk7XG4gICAgdmFyIHNlbGVjdE11bHRpcGxlID0gdXNlU2VsZWN0TXVsdGlwbGUoKTtcbiAgICB2YXIgc2VsZWN0UmFuZ2UgPSB1c2VTZWxlY3RSYW5nZSgpO1xuICAgIHZhciBpbnRlcm5hbE1vZGlmaWVycyA9IGdldEludGVybmFsTW9kaWZpZXJzKGRheVBpY2tlciwgc2VsZWN0TXVsdGlwbGUsIHNlbGVjdFJhbmdlKTtcbiAgICB2YXIgY3VzdG9tTW9kaWZpZXJzID0gZ2V0Q3VzdG9tTW9kaWZpZXJzKGRheVBpY2tlcik7XG4gICAgdmFyIG1vZGlmaWVycyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBpbnRlcm5hbE1vZGlmaWVycyksIGN1c3RvbU1vZGlmaWVycyk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KE1vZGlmaWVyc0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IG1vZGlmaWVycyB9LCBwcm9wcy5jaGlsZHJlbikpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TW9kaWZpZXJzQ29udGV4dC5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTW9kaWZpZXJzQ29udGV4dCB9IGZyb20gJy4vTW9kaWZpZXJzQ29udGV4dCc7XG4vKiogSG9vayB0byBhY2Nlc3MgdGhlIFtbTW9kaWZpZXJzQ29udGV4dF1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1vZGlmaWVycygpIHtcbiAgICB2YXIgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoTW9kaWZpZXJzQ29udGV4dCk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlTW9kaWZpZXJzIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBNb2RpZmllcnNQcm92aWRlcicpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZU1vZGlmaWVycy5qcy5tYXAiLCIvKiogUmV0dXJucyB0cnVlIGlmIGBtYXRjaGVyYCBpcyBvZiB0eXBlIFtbRGF0ZUludGVydmFsXV0uICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlSW50ZXJ2YWwobWF0Y2hlcikge1xuICAgIHJldHVybiBCb29sZWFuKG1hdGNoZXIgJiZcbiAgICAgICAgdHlwZW9mIG1hdGNoZXIgPT09ICdvYmplY3QnICYmXG4gICAgICAgICdiZWZvcmUnIGluIG1hdGNoZXIgJiZcbiAgICAgICAgJ2FmdGVyJyBpbiBtYXRjaGVyKTtcbn1cbi8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhIFtbRGF0ZVJhbmdlXV0gdHlwZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVSYW5nZSh2YWx1ZSkge1xuICAgIC8vIFRPRE86IENoZWNrIGlmIGRhdGVzPyFcbiAgICByZXR1cm4gQm9vbGVhbih2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICdmcm9tJyBpbiB2YWx1ZSk7XG59XG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgb2YgdHlwZSBbW0RhdGVBZnRlcl1dLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZUFmdGVyVHlwZSh2YWx1ZSkge1xuICAgIHJldHVybiBCb29sZWFuKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgJ2FmdGVyJyBpbiB2YWx1ZSk7XG59XG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgb2YgdHlwZSBbW0RhdGVCZWZvcmVdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVCZWZvcmVUeXBlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAnYmVmb3JlJyBpbiB2YWx1ZSk7XG59XG4vKiogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYSBbW0RheU9mV2Vla11dIHR5cGUuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXlPZldlZWtUeXBlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAnZGF5T2ZXZWVrJyBpbiB2YWx1ZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NYXRjaGVycy5qcy5tYXAiLCJpbXBvcnQgeyBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMsIGlzU2FtZURheSB9IGZyb20gJ2RhdGUtZm5zJztcbi8qKiBSZXR1cm4gYHRydWVgIHdoZXRoZXIgdGhlIGdpdmVuIGRhdGUgaXMgaW5zaWRlIHRoZSByYW5nZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVJblJhbmdlKGRhdGUsIHJhbmdlKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBmcm9tID0gcmFuZ2UuZnJvbSwgdG8gPSByYW5nZS50bztcbiAgICBpZiAoIWZyb20pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXRvICYmIGlzU2FtZURheShmcm9tLCBkYXRlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCF0bykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBpc1RvQmVmb3JlRnJvbSA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyh0bywgZnJvbSkgPCAwO1xuICAgIGlmICh0byAmJiBpc1RvQmVmb3JlRnJvbSkge1xuICAgICAgICBfYSA9IFt0bywgZnJvbV0sIGZyb20gPSBfYVswXSwgdG8gPSBfYVsxXTtcbiAgICB9XG4gICAgcmV0dXJuIChkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoZGF0ZSwgZnJvbSkgPj0gMCAmJlxuICAgICAgICBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXModG8sIGRhdGUpID49IDApO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNEYXRlSW5SYW5nZS5qcy5tYXAiLCJpbXBvcnQgeyBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMsIGlzRGF0ZSwgaXNTYW1lRGF5IH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgaXNEYXRlQWZ0ZXJUeXBlLCBpc0RhdGVCZWZvcmVUeXBlLCBpc0RhdGVJbnRlcnZhbCwgaXNEYXRlUmFuZ2UsIGlzRGF5T2ZXZWVrVHlwZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL01hdGNoZXJzJztcbmltcG9ydCB7IGlzRGF0ZUluUmFuZ2UgfSBmcm9tICcuL2lzRGF0ZUluUmFuZ2UnO1xuLyoqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGEgRGF0ZSB0eXBlLiAqL1xuZnVuY3Rpb24gaXNEYXRlVHlwZSh2YWx1ZSkge1xuICAgIHJldHVybiBpc0RhdGUodmFsdWUpO1xufVxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IG9mIHZhbGlkIGRhdGVzLiAqL1xuZnVuY3Rpb24gaXNBcnJheU9mRGF0ZXModmFsdWUpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoaXNEYXRlKTtcbn1cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgd2hldGhlciB0aGUgZGF5IG1hdGNoZXMgYWdhaW5zdCB0aGUgZ2l2ZW4gbWF0Y2hlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01hdGNoKGRheSwgbWF0Y2hlcnMpIHtcbiAgICByZXR1cm4gbWF0Y2hlcnMuc29tZShmdW5jdGlvbiAobWF0Y2hlcikge1xuICAgICAgICBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGF0ZVR5cGUobWF0Y2hlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBpc1NhbWVEYXkoZGF5LCBtYXRjaGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNBcnJheU9mRGF0ZXMobWF0Y2hlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyLmluY2x1ZGVzKGRheSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGF0ZVJhbmdlKG1hdGNoZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNEYXRlSW5SYW5nZShkYXksIG1hdGNoZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RheU9mV2Vla1R5cGUobWF0Y2hlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyLmRheU9mV2Vlay5pbmNsdWRlcyhkYXkuZ2V0RGF5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RhdGVJbnRlcnZhbChtYXRjaGVyKSkge1xuICAgICAgICAgICAgdmFyIGlzQmVmb3JlID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKG1hdGNoZXIuYmVmb3JlLCBkYXkpID4gMDtcbiAgICAgICAgICAgIHZhciBpc0FmdGVyID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGRheSwgbWF0Y2hlci5hZnRlcikgPiAwO1xuICAgICAgICAgICAgcmV0dXJuIGlzQmVmb3JlICYmIGlzQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGF0ZUFmdGVyVHlwZShtYXRjaGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhkYXksIG1hdGNoZXIuYWZ0ZXIpID4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEYXRlQmVmb3JlVHlwZShtYXRjaGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhtYXRjaGVyLmJlZm9yZSwgZGF5KSA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcihkYXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzTWF0Y2guanMubWFwIiwiaW1wb3J0IHsgaXNNYXRjaCB9IGZyb20gJy4vaXNNYXRjaCc7XG4vKipcbiAqIFJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBtb2RpZmllcnMgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBkYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kaWZpZXJTdGF0dXMoZGF0ZSwgXG4vKiogVGhlIG1vZGlmaWVycyB0byBtYXRjaCBmb3IgdGhlIGdpdmVuIGRhdGUuICovXG5tb2RpZmllcnMpIHtcbiAgICB2YXIgbW9kaWZpZXJzTGlzdCA9IE9iamVjdC5rZXlzKG1vZGlmaWVycykucmVkdWNlKGZ1bmN0aW9uIChwcmV2aW91c1ZhbHVlLCBrZXkpIHtcbiAgICAgICAgdmFyIG1vZGlmaWVyID0gbW9kaWZpZXJzW2tleV07XG4gICAgICAgIGlmIChpc01hdGNoKGRhdGUsIG1vZGlmaWVyKSkge1xuICAgICAgICAgICAgcHJldmlvdXNWYWx1ZS5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZXZpb3VzVmFsdWU7XG4gICAgfSwgW10pO1xuICAgIHZhciBtb2RpZmllcnNTdGF0dXMgPSB7fTtcbiAgICBtb2RpZmllcnNMaXN0LmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7IHJldHVybiAobW9kaWZpZXJzU3RhdHVzW21vZGlmaWVyXSA9IHRydWUpOyB9KTtcbiAgICByZXR1cm4gbW9kaWZpZXJzU3RhdHVzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0TW9kaWZpZXJTdGF0dXMuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyB1c2VNb2RpZmllcnMgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9Nb2RpZmllcnMnO1xuaW1wb3J0IHsgZ2V0TW9kaWZpZXJTdGF0dXMgfSBmcm9tICcuL3V0aWxzL2dldE1vZGlmaWVyU3RhdHVzJztcbi8qKiBSZXR1cm4gdGhlIG1vZGlmaWVycyBhbmQgaXRzIHN0eWxlcyBmb3IgdGhlIHNwZWNpZmllZCBkYXRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURheU1vZGlmaWVycyhkYXRlKSB7XG4gICAgdmFyIGNvbnRleHQgPSB1c2VEYXlQaWNrZXIoKTtcbiAgICB2YXIgbW9kaWZpZXJzQ29udGV4dCA9IHVzZU1vZGlmaWVycygpO1xuICAgIC8vIFRPRE86IElzIHRoZXJlIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSB0eXBlIE1vZGlmaWVyU3RhdHVzP1xuICAgIHZhciBtb2RpZmllcnMgPSBnZXRNb2RpZmllclN0YXR1cyhkYXRlLCBtb2RpZmllcnNDb250ZXh0KTtcbiAgICB2YXIgbW9kaWZpZXJDbGFzc05hbWVzID0gW107XG4gICAgT2JqZWN0LmtleXMobW9kaWZpZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgICB2YXIgY3VzdG9tQ2xhc3NOYW1lID0gY29udGV4dC5tb2RpZmllckNsYXNzTmFtZXNbbW9kaWZpZXJdO1xuICAgICAgICBpZiAoY3VzdG9tQ2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBtb2RpZmllckNsYXNzTmFtZXMucHVzaChjdXN0b21DbGFzc05hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbW9kaWZpZXJDbGFzc05hbWVzLnB1c2goXCJcIiArIGNvbnRleHQubW9kaWZpZXJQcmVmaXggKyBtb2RpZmllcik7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgbW9kaWZpZXJTdHlsZSA9IHt9O1xuICAgIGlmIChjb250ZXh0Lm1vZGlmaWVyU3R5bGVzKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKG1vZGlmaWVycykuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIG1vZGlmaWVyU3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgbW9kaWZpZXJTdHlsZSksIChfYSA9IGNvbnRleHQubW9kaWZpZXJTdHlsZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVttb2RpZmllcl0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbW9kaWZpZXJzOiBtb2RpZmllcnMsXG4gICAgICAgIG1vZGlmaWVyQ2xhc3NOYW1lczogbW9kaWZpZXJDbGFzc05hbWVzLFxuICAgICAgICBtb2RpZmllclN0eWxlOiBtb2RpZmllclN0eWxlXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZURheU1vZGlmaWVycy5qcy5tYXAiLCJpbXBvcnQgeyBhZGREYXlzLCBlbmRPZk1vbnRoLCBzdGFydE9mTW9udGggfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBnZXRNb2RpZmllclN0YXR1cyB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZURheU1vZGlmaWVycy91dGlscy9nZXRNb2RpZmllclN0YXR1cyc7XG52YXIgaXNGb2N1c2FibGUgPSBmdW5jdGlvbiAobW9kaWZpZXJzKSB7XG4gICAgcmV0dXJuICFtb2RpZmllcnMuZGlzYWJsZWQgJiYgIW1vZGlmaWVycy5oaWRkZW47XG59O1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBkYXkgdGhhdCBzaG91bGQgYmUgdGhlIHRhcmdldCBvZiB0aGUgZm9jdXMgd2hlbiBpbml0aWFsbHlcbiAqIHJlbmRlcmVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czpcbiAqICAxLiBpZiB0aGVyZSBpcyBhIHNlbGVjdGVkIGRheSwgZm9jdXMgb24gdGhlIChmaXJzdCkgc2VsZWN0ZWQgZGF5XG4gKiAgMi4gZWxzZSBpZiB0aGUgZGlzcGxheSBtb250aHMgaW5jbHVkZSB0aGUgY3VycmVudCBkYXRlICh0b2RheSkgZm9jdXMgb24gdGhlIGN1cnJlbnQgZGF0ZVxuICogIDMuIGVsc2UgZm9jdXMgb24gdGhlIGZpcnN0IGZvY3VzYWJsZSBkYXlcbiAqICA0LiBlbHNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gZm9jdXMgb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluaXRpYWxGb2N1c1RhcmdldChkaXNwbGF5TW9udGhzLCBtb2RpZmllcnNDb250ZXh0KSB7XG4gICAgdmFyIGZpcnN0RGF5SW5Nb250aCA9IHN0YXJ0T2ZNb250aChkaXNwbGF5TW9udGhzWzBdKTtcbiAgICB2YXIgbGFzdERheUluTW9udGggPSBlbmRPZk1vbnRoKGRpc3BsYXlNb250aHNbZGlzcGxheU1vbnRocy5sZW5ndGggLSAxXSk7XG4gICAgdmFyIGZpcnN0Rm9jdXNhYmxlRGF5O1xuICAgIHZhciB0b2RheTtcbiAgICB2YXIgZGF0ZSA9IGZpcnN0RGF5SW5Nb250aDtcbiAgICB3aGlsZSAoZGF0ZSA8PSBsYXN0RGF5SW5Nb250aCkge1xuICAgICAgICB2YXIgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJTdGF0dXMoZGF0ZSwgbW9kaWZpZXJzQ29udGV4dCk7XG4gICAgICAgIGlmICghaXNGb2N1c2FibGUobW9kaWZpZXJzKSkge1xuICAgICAgICAgICAgZGF0ZSA9IGFkZERheXMoZGF0ZSwgMSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kaWZpZXJzLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kaWZpZXJzLnRvZGF5ICYmICF0b2RheSkge1xuICAgICAgICAgICAgdG9kYXkgPSBkYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZmlyc3RGb2N1c2FibGVEYXkpIHtcbiAgICAgICAgICAgIGZpcnN0Rm9jdXNhYmxlRGF5ID0gZGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBkYXRlID0gYWRkRGF5cyhkYXRlLCAxKTtcbiAgICB9XG4gICAgaWYgKHRvZGF5KSB7XG4gICAgICAgIHJldHVybiB0b2RheTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmaXJzdEZvY3VzYWJsZURheTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRJbml0aWFsRm9jdXNUYXJnZXQuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGFkZERheXMsIGFkZE1vbnRocywgYWRkV2Vla3MsIGFkZFllYXJzLCBlbmRPZldlZWssIGlzU2FtZU1vbnRoLCBzdGFydE9mV2VlayB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uL0RheVBpY2tlcic7XG5pbXBvcnQgeyB1c2VNb2RpZmllcnMgfSBmcm9tICcuLi9Nb2RpZmllcnMnO1xuaW1wb3J0IHsgdXNlTmF2aWdhdGlvbiB9IGZyb20gJy4uL05hdmlnYXRpb24vdXNlTmF2aWdhdGlvbic7XG5pbXBvcnQgeyBnZXRJbml0aWFsRm9jdXNUYXJnZXQgfSBmcm9tICcuL2dldEluaXRpYWxGb2N1c1RhcmdldCc7XG4vKipcbiAqIFRoZSBGb2N1cyBjb250ZXh0IHNoYXJlcyBkZXRhaWxzIGFib3V0IHRoZSBmb2N1c2VkIGRheSBmb3IgdGhlIGtleWJvYXJkIG5hdmlnYXRpb24uXG4gKlxuICogQWNjZXNzIHRoaXMgY29udGV4dCBmcm9tIHRoZSBbW3VzZUZvY3VzXV0gaG9vay5cbiAqL1xuZXhwb3J0IHZhciBGb2N1c0NvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7XG4vKiogVGhlIHByb3ZpZGVyIGZvciB0aGUgW1tGb2N1c0NvbnRleHRdXS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBGb2N1c1Byb3ZpZGVyKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW47XG4gICAgdmFyIF9iID0gUmVhY3QudXNlU3RhdGUoKSwgZm9jdXNlZERheSA9IF9iWzBdLCBzZXREYXkgPSBfYlsxXTtcbiAgICB2YXIgX2MgPSB1c2VOYXZpZ2F0aW9uKCksIGdvVG9Nb250aCA9IF9jLmdvVG9Nb250aCwgZGlzcGxheU1vbnRocyA9IF9jLmRpc3BsYXlNb250aHM7XG4gICAgdmFyIG51bWJlck9mTW9udGhzID0gdXNlRGF5UGlja2VyKCkubnVtYmVyT2ZNb250aHM7XG4gICAgdmFyIG1vZGlmaWVyc0NvbnRleHQgPSB1c2VNb2RpZmllcnMoKTtcbiAgICB2YXIgaW5pdGlhbEZvY3VzVGFyZ2V0ID0gZ2V0SW5pdGlhbEZvY3VzVGFyZ2V0KGRpc3BsYXlNb250aHMsIG1vZGlmaWVyc0NvbnRleHQpO1xuICAgIHZhciBfZCA9IFJlYWN0LnVzZVN0YXRlKCksIGxhc3RGb2N1c2VkRGF5ID0gX2RbMF0sIHNldExhc3RGb2N1c2VkRGF5ID0gX2RbMV07XG4gICAgdmFyIGlzV2l0aGluRGlzcGxheU1vbnRocyA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHJldHVybiBkaXNwbGF5TW9udGhzLnNvbWUoZnVuY3Rpb24gKGRpc3BsYXlNb250aCkgeyByZXR1cm4gaXNTYW1lTW9udGgoZGF0ZSwgZGlzcGxheU1vbnRoKTsgfSk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNUYXJnZXQgPSAoZm9jdXNlZERheSAhPT0gbnVsbCAmJiBmb2N1c2VkRGF5ICE9PSB2b2lkIDAgPyBmb2N1c2VkRGF5IDogKGxhc3RGb2N1c2VkRGF5ICYmIGlzV2l0aGluRGlzcGxheU1vbnRocyhsYXN0Rm9jdXNlZERheSkpKVxuICAgICAgICA/IGxhc3RGb2N1c2VkRGF5XG4gICAgICAgIDogaW5pdGlhbEZvY3VzVGFyZ2V0O1xuICAgIHZhciBibHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRMYXN0Rm9jdXNlZERheShmb2N1c2VkRGF5KTtcbiAgICAgICAgc2V0RGF5KHVuZGVmaW5lZCk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXMgPSBmdW5jdGlvbiAoZGF0ZSkgeyByZXR1cm4gc2V0RGF5KGRhdGUpOyB9O1xuICAgIHZhciBzd2l0Y2hNb250aCA9IGZ1bmN0aW9uIChkYXRlLCBvZmZzZXQpIHtcbiAgICAgICAgaWYgKGRpc3BsYXlNb250aHMuc29tZShmdW5jdGlvbiAobSkgeyByZXR1cm4gaXNTYW1lTW9udGgoZGF0ZSwgbSk7IH0pKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgZ29Ub01vbnRoKGFkZE1vbnRocyhkYXRlLCAxICsgb2Zmc2V0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnb1RvTW9udGgoZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHZhciBmb2N1c0RheUJlZm9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmb2N1c2VkRGF5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgYmVmb3JlID0gYWRkRGF5cyhmb2N1c2VkRGF5LCAtMSk7XG4gICAgICAgIGZvY3VzKGJlZm9yZSk7XG4gICAgICAgIHN3aXRjaE1vbnRoKGJlZm9yZSwgbnVtYmVyT2ZNb250aHMgKiAtMSk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNEYXlBZnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmb2N1c2VkRGF5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgYWZ0ZXIgPSBhZGREYXlzKGZvY3VzZWREYXksIDEpO1xuICAgICAgICBmb2N1cyhhZnRlcik7XG4gICAgICAgIHN3aXRjaE1vbnRoKGFmdGVyLCBudW1iZXJPZk1vbnRocyk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNXZWVrQmVmb3JlRGF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWZvY3VzZWREYXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciB1cCA9IGFkZFdlZWtzKGZvY3VzZWREYXksIC0xKTtcbiAgICAgICAgZm9jdXModXApO1xuICAgICAgICBzd2l0Y2hNb250aCh1cCwgbnVtYmVyT2ZNb250aHMgKiAtMSk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNXZWVrQWZ0ZXJEYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZm9jdXNlZERheSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGRvd24gPSBhZGRXZWVrcyhmb2N1c2VkRGF5LCAxKTtcbiAgICAgICAgZm9jdXMoZG93bik7XG4gICAgICAgIHN3aXRjaE1vbnRoKGRvd24sIG51bWJlck9mTW9udGhzKTtcbiAgICB9O1xuICAgIHZhciBmb2N1c1N0YXJ0T2ZXZWVrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWZvY3VzZWREYXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBkYXlUb0ZvY3VzID0gc3RhcnRPZldlZWsoZm9jdXNlZERheSk7XG4gICAgICAgIHN3aXRjaE1vbnRoKGRheVRvRm9jdXMsIG51bWJlck9mTW9udGhzKTtcbiAgICAgICAgZm9jdXMoZGF5VG9Gb2N1cyk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNFbmRPZldlZWsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZm9jdXNlZERheSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGRheVRvRm9jdXMgPSBlbmRPZldlZWsoZm9jdXNlZERheSk7XG4gICAgICAgIHN3aXRjaE1vbnRoKGRheVRvRm9jdXMsIG51bWJlck9mTW9udGhzKTtcbiAgICAgICAgZm9jdXMoZGF5VG9Gb2N1cyk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNNb250aEJlZm9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmb2N1c2VkRGF5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgbW9udGhCZWZvcmUgPSBhZGRNb250aHMoZm9jdXNlZERheSwgLTEpO1xuICAgICAgICBzd2l0Y2hNb250aChtb250aEJlZm9yZSwgbnVtYmVyT2ZNb250aHMpO1xuICAgICAgICBmb2N1cyhtb250aEJlZm9yZSk7XG4gICAgfTtcbiAgICB2YXIgZm9jdXNNb250aEFmdGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWZvY3VzZWREYXkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBtb250aEFmdGVyID0gYWRkTW9udGhzKGZvY3VzZWREYXksIDEpO1xuICAgICAgICBzd2l0Y2hNb250aChtb250aEFmdGVyLCBudW1iZXJPZk1vbnRocyk7XG4gICAgICAgIGZvY3VzKG1vbnRoQWZ0ZXIpO1xuICAgIH07XG4gICAgdmFyIGZvY3VzWWVhckJlZm9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmb2N1c2VkRGF5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgeWVhckJlZm9yZSA9IGFkZFllYXJzKGZvY3VzZWREYXksIC0xKTtcbiAgICAgICAgc3dpdGNoTW9udGgoeWVhckJlZm9yZSwgbnVtYmVyT2ZNb250aHMpO1xuICAgICAgICBmb2N1cyh5ZWFyQmVmb3JlKTtcbiAgICB9O1xuICAgIHZhciBmb2N1c1llYXJBZnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFmb2N1c2VkRGF5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgeWVhckFmdGVyID0gYWRkWWVhcnMoZm9jdXNlZERheSwgMSk7XG4gICAgICAgIHN3aXRjaE1vbnRoKHllYXJBZnRlciwgbnVtYmVyT2ZNb250aHMpO1xuICAgICAgICBmb2N1cyh5ZWFyQWZ0ZXIpO1xuICAgIH07XG4gICAgdmFyIHZhbHVlID0ge1xuICAgICAgICBmb2N1c2VkRGF5OiBmb2N1c2VkRGF5LFxuICAgICAgICBmb2N1c1RhcmdldDogZm9jdXNUYXJnZXQsXG4gICAgICAgIGJsdXI6IGJsdXIsXG4gICAgICAgIGZvY3VzOiBmb2N1cyxcbiAgICAgICAgZm9jdXNEYXlBZnRlcjogZm9jdXNEYXlBZnRlcixcbiAgICAgICAgZm9jdXNEYXlCZWZvcmU6IGZvY3VzRGF5QmVmb3JlLFxuICAgICAgICBmb2N1c1dlZWtBZnRlckRheTogZm9jdXNXZWVrQWZ0ZXJEYXksXG4gICAgICAgIGZvY3VzV2Vla0JlZm9yZURheTogZm9jdXNXZWVrQmVmb3JlRGF5LFxuICAgICAgICBmb2N1c01vbnRoQmVmb3JlOiBmb2N1c01vbnRoQmVmb3JlLFxuICAgICAgICBmb2N1c01vbnRoQWZ0ZXI6IGZvY3VzTW9udGhBZnRlcixcbiAgICAgICAgZm9jdXNZZWFyQmVmb3JlOiBmb2N1c1llYXJCZWZvcmUsXG4gICAgICAgIGZvY3VzWWVhckFmdGVyOiBmb2N1c1llYXJBZnRlcixcbiAgICAgICAgZm9jdXNTdGFydE9mV2VlazogZm9jdXNTdGFydE9mV2VlayxcbiAgICAgICAgZm9jdXNFbmRPZldlZWs6IGZvY3VzRW5kT2ZXZWVrXG4gICAgfTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRm9jdXNDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiB2YWx1ZSB9LCBjaGlsZHJlbikpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Rm9jdXNDb250ZXh0LmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBGb2N1c0NvbnRleHQgfSBmcm9tICcuL0ZvY3VzQ29udGV4dCc7XG4vKiogSG9vayB0byBhY2Nlc3MgdGhlIFtbRm9jdXNDb250ZXh0XV0uICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRm9jdXMoKSB7XG4gICAgdmFyIGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEZvY3VzQ29udGV4dCk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlRm9jdXMgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIEZvY3VzUHJvdmlkZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VGb2N1cy5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNTYW1lRGF5IH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbmltcG9ydCB7IHVzZUZvY3VzIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dHMvRm9jdXMnO1xuLyoqIEhhbmRsZSB0aGUgZm9jdXMgZm9yIHRoZSBkYXkgZWxlbWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXlGb2N1cyhkYXRlLCBidXR0b25SZWYpIHtcbiAgICB2YXIgX2EgPSB1c2VGb2N1cygpLCBmb2N1c2VkRGF5ID0gX2EuZm9jdXNlZERheSwgZm9jdXNUYXJnZXQgPSBfYS5mb2N1c1RhcmdldCwgZm9jdXNEYXlBZnRlciA9IF9hLmZvY3VzRGF5QWZ0ZXIsIGZvY3VzRGF5QmVmb3JlID0gX2EuZm9jdXNEYXlCZWZvcmUsIGZvY3VzV2Vla0FmdGVyRGF5ID0gX2EuZm9jdXNXZWVrQWZ0ZXJEYXksIGZvY3VzV2Vla0JlZm9yZURheSA9IF9hLmZvY3VzV2Vla0JlZm9yZURheSwgYmx1ciA9IF9hLmJsdXIsIGZvY3VzID0gX2EuZm9jdXMsIGZvY3VzTW9udGhCZWZvcmUgPSBfYS5mb2N1c01vbnRoQmVmb3JlLCBmb2N1c01vbnRoQWZ0ZXIgPSBfYS5mb2N1c01vbnRoQWZ0ZXIsIGZvY3VzWWVhckJlZm9yZSA9IF9hLmZvY3VzWWVhckJlZm9yZSwgZm9jdXNZZWFyQWZ0ZXIgPSBfYS5mb2N1c1llYXJBZnRlciwgZm9jdXNTdGFydE9mV2VlayA9IF9hLmZvY3VzU3RhcnRPZldlZWssIGZvY3VzRW5kT2ZXZWVrID0gX2EuZm9jdXNFbmRPZldlZWs7XG4gICAgdmFyIGRpciA9IHVzZURheVBpY2tlcigpLmRpcjtcbiAgICAvLyBGb2N1cyB0aGUgSFRNTCBlbGVtZW50IGlmIHRoaXMgaXMgdGhlIGZvY3VzZWQgZGF5LlxuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCFmb2N1c2VkRGF5KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoaXNTYW1lRGF5KGZvY3VzZWREYXksIGRhdGUpKSB7XG4gICAgICAgICAgICAoX2EgPSBidXR0b25SZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9LCBbZm9jdXNlZERheSwgZGF0ZSwgYnV0dG9uUmVmXSk7XG4gICAgdmFyIGZvY3VzT25LZXlEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBkaXIgPT09ICdydGwnID8gZm9jdXNEYXlBZnRlcigpIDogZm9jdXNEYXlCZWZvcmUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGRpciA9PT0gJ3J0bCcgPyBmb2N1c0RheUJlZm9yZSgpIDogZm9jdXNEYXlBZnRlcigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBmb2N1c1dlZWtBZnRlckRheSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgZm9jdXNXZWVrQmVmb3JlRGF5KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdQYWdlVXAnOlxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGUuc2hpZnRLZXkgPyBmb2N1c1llYXJCZWZvcmUoKSA6IGZvY3VzTW9udGhCZWZvcmUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnNoaWZ0S2V5ID8gZm9jdXNZZWFyQWZ0ZXIoKSA6IGZvY3VzTW9udGhBZnRlcigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgZm9jdXNTdGFydE9mV2VlaygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRW5kJzpcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBmb2N1c0VuZE9mV2VlaygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2YXIgaXNGb2N1c1RhcmdldCA9IEJvb2xlYW4oZm9jdXNUYXJnZXQgJiYgaXNTYW1lRGF5KGZvY3VzVGFyZ2V0LCBkYXRlKSk7XG4gICAgcmV0dXJuIHsgZm9jdXM6IGZvY3VzLCBibHVyOiBibHVyLCBmb2N1c09uS2V5RG93bjogZm9jdXNPbktleURvd24sIGlzRm9jdXNUYXJnZXQ6IGlzRm9jdXNUYXJnZXQgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZURheUZvY3VzLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNTYW1lTW9udGggfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuaW1wb3J0IHsgdXNlU2VsZWN0TXVsdGlwbGUgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0cy9TZWxlY3RNdWx0aXBsZSc7XG5pbXBvcnQgeyB1c2VTZWxlY3RSYW5nZSB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHRzL1NlbGVjdFJhbmdlJztcbmltcG9ydCB7IHVzZVNlbGVjdFNpbmdsZSB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHRzL1NlbGVjdFNpbmdsZSc7XG5pbXBvcnQgeyB1c2VEYXlNb2RpZmllcnMgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VEYXlNb2RpZmllcnMnO1xuaW1wb3J0IHsgaXNEYXlQaWNrZXJNdWx0aXBsZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0RheVBpY2tlck11bHRpcGxlJztcbmltcG9ydCB7IGlzRGF5UGlja2VyUmFuZ2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9EYXlQaWNrZXJSYW5nZSc7XG5pbXBvcnQgeyBpc0RheVBpY2tlclNpbmdsZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0RheVBpY2tlclNpbmdsZSc7XG5pbXBvcnQgeyB1c2VEYXlGb2N1cyB9IGZyb20gJy4vdXNlRGF5Rm9jdXMnO1xuLyoqXG4gKiBUaGlzIGhvb2sgcmV0dXJucyBkZXRhaWxzIGFib3V0IHRoZSBjb250ZW50IHRvIHJlbmRlciBpbiB0aGUgZGF5IGNlbGwuXG4gKlxuICpcbiAqIFdoZW4gYSBkYXkgY2VsbCBpcyByZW5kZXJlZCBpbiB0aGUgdGFibGUsIERheVBpY2tlciBjYW4gZWl0aGVyOlxuICpcbiAqIC0gcmVuZGVyIG5vdGhpbmc6IHdoZW4gdGhlIGRheSBpcyBvdXRzaWRlIHRoZSBtb250aCBvciBoYXMgbWF0Y2hlZCB0aGVcbiAqICAgXCJoaWRkZW5cIiBtb2RpZmllci5cbiAqIC0gcmVuZGVyIGEgYnV0dG9uLiBXaGVuIGEgc2VsZWN0aW9uIG1vZGUgaXMgc2V0LCBEYXlQaWNrZXIgcmVuZGVycyBhIGJ1dHRvblxuICogICB0byBhbGxvdyB0aGUgZm9jdXMgYW5kIHRoZSBzZWxlY3Rpb24uIEluIGNhc2Ugb2YgYGN1c3RvbWAgc2VsZWN0aW9uXG4gKiAgIG1vZGUsIERheVBpY2tlciBleHBlY3RzIGEgYG9uRGF5Q2xpY2tgIHByb3AgdG8gcmVuZGVyIGEgYnV0dG9uLlxuICogLSByZW5kZXIgYSBub24taW50ZXJhY3RpdmUgZWxlbWVudDogd2hlbiBubyBzZWxlY3Rpb24gbW9kZSBpcyBzZXQsIHRoZSBkYXlcbiAqICAgY2VsbCBzaG91bGRu4oCZdCByZXNwb25kIHRvIGFueSBpbnRlcmFjdGlvbi4gRGF5UGlja2VyIHNob3VsZCByZW5kZXIgYSBgZGl2YFxuICogICBvciBhIGBzcGFuYC5cbiAqXG4gKiAjIyMgVXNhZ2VcbiAqXG4gKiBVc2UgdGhpcyBob29rIHRvIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIFtbRGF5XV0gY29tcG9uZW50LiBDcmVhdGUgYVxuICogbmV3IGBEYXlgIGNvbXBvbmVudCB1c2luZyB0aGlzIGhvb2sgYW5kIHBhc3MgaXQgdG8gdGhlIGBjb21wb25lbnRzYCBwcm9wLlxuICogVGhlIHNvdXJjZSBvZiBbW0RheV1dIGNhbiBiZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuXG4gKlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXkoXG4vKiogVGhlIGRheSByZW5kZXJlZCBpbiB0aGUgbW9udGguICovXG5kYXRlLCBcbi8qKiBUaGUgbW9udGggd2hlcmUgdGhlIGRhdGUgaXMgZGlzcGxheWVkLiBEYXlQaWNrZXIgcmVuZGVycyBkYXlzIG91dHNpZGUgdGhlIGRpc3BsYXkgbW9udGggd2hlbiBgc2hvd091dHNpZGVEYXlzYCBpcyB0cnVlLiAqL1xuZGlzcGxheU1vbnRoLCBcbi8qKiBBIHJlZiB0byB0aGUgYnV0dG9uIGVsZW1lbnQuICovXG5idXR0b25SZWYpIHtcbiAgICB2YXIgY29udGV4dCA9IHVzZURheVBpY2tlcigpO1xuICAgIHZhciBzaW5nbGUgPSB1c2VTZWxlY3RTaW5nbGUoKTtcbiAgICB2YXIgbXVsdGlwbGUgPSB1c2VTZWxlY3RNdWx0aXBsZSgpO1xuICAgIHZhciByYW5nZSA9IHVzZVNlbGVjdFJhbmdlKCk7XG4gICAgdmFyIF9hID0gdXNlRGF5Rm9jdXMoZGF0ZSwgYnV0dG9uUmVmKSwgZm9jdXMgPSBfYS5mb2N1cywgYmx1ciA9IF9hLmJsdXIsIGZvY3VzT25LZXlEb3duID0gX2EuZm9jdXNPbktleURvd24sIGlzRm9jdXNUYXJnZXQgPSBfYS5pc0ZvY3VzVGFyZ2V0O1xuICAgIHZhciBfYiA9IHVzZURheU1vZGlmaWVycyhkYXRlKSwgbW9kaWZpZXJzID0gX2IubW9kaWZpZXJzLCBtb2RpZmllckNsYXNzTmFtZXMgPSBfYi5tb2RpZmllckNsYXNzTmFtZXMsIG1vZGlmaWVyU3R5bGUgPSBfYi5tb2RpZmllclN0eWxlO1xuICAgIHZhciBpc091dHNpZGUgPSAhaXNTYW1lTW9udGgoZGF0ZSwgZGlzcGxheU1vbnRoKTtcbiAgICB2YXIgcmV0dXJuVmFsdWUgPSB7XG4gICAgICAgIGlzT3V0c2lkZTogaXNPdXRzaWRlLFxuICAgICAgICBtb2RpZmllcnM6IG1vZGlmaWVycyxcbiAgICAgICAgc2VsZWN0ZWQ6IGlzRGF5UGlja2VyU2luZ2xlKGNvbnRleHQpXG4gICAgICAgICAgICA/IHNpbmdsZS5zZWxlY3RlZFxuICAgICAgICAgICAgOiBpc0RheVBpY2tlck11bHRpcGxlKGNvbnRleHQpXG4gICAgICAgICAgICAgICAgPyBtdWx0aXBsZS5zZWxlY3RlZFxuICAgICAgICAgICAgICAgIDogaXNEYXlQaWNrZXJSYW5nZShjb250ZXh0KVxuICAgICAgICAgICAgICAgICAgICA/IHJhbmdlLnNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBzaW5nbGU6IHNpbmdsZSxcbiAgICAgICAgbXVsdGlwbGU6IG11bHRpcGxlLFxuICAgICAgICByYW5nZTogcmFuZ2VcbiAgICB9O1xuICAgIGlmIChpc091dHNpZGUgJiYgIWNvbnRleHQuc2hvd091dHNpZGVEYXlzKSB7XG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG4gICAgaWYgKG1vZGlmaWVycy5oaWRkZW4pIHtcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH1cbiAgICB2YXIgY2xhc3NOYW1lcyA9IFtjb250ZXh0LmNsYXNzTmFtZXMuZGF5XS5jb25jYXQobW9kaWZpZXJDbGFzc05hbWVzKTtcbiAgICB2YXIgc3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29udGV4dC5zdHlsZXMuZGF5KSwgbW9kaWZpZXJTdHlsZSk7XG4gICAgaWYgKGlzT3V0c2lkZSkge1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goY29udGV4dC5jbGFzc05hbWVzLmRheV9vdXRzaWRlKTtcbiAgICAgICAgc3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29udGV4dC5zdHlsZXMpLCBjb250ZXh0LnN0eWxlcy5kYXlfb3V0c2lkZSk7XG4gICAgfVxuICAgIHZhciBEYXlDb250ZW50ID0gY29udGV4dC5jb21wb25lbnRzLkRheUNvbnRlbnQ7XG4gICAgdmFyIGNoaWxkcmVuID0gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRGF5Q29udGVudCwgeyBkYXRlOiBkYXRlLCBkaXNwbGF5TW9udGg6IGRpc3BsYXlNb250aCwgbW9kaWZpZXJzOiBtb2RpZmllcnMgfSkpO1xuICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc05hbWVzLmpvaW4oJyAnKTtcbiAgICBpZiAoIWNvbnRleHQubW9kZSAmJiAhY29udGV4dC5vbkRheUNsaWNrKSB7XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcmV0dXJuVmFsdWUpLCB7IG5vbkludGVyYWN0aXZlUHJvcHM6IHtcbiAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgICAgICB9IH0pO1xuICAgIH1cbiAgICAvLyAjcmVnaW9uIEV2ZW50IGhhbmRsZXJzXG4gICAgdmFyIGhhbmRsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBpZiAoaXNEYXlQaWNrZXJTaW5nbGUoY29udGV4dCkpIHtcbiAgICAgICAgICAgIChfYSA9IHNpbmdsZS5vbkRheUNsaWNrKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChzaW5nbGUsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNEYXlQaWNrZXJNdWx0aXBsZShjb250ZXh0KSkge1xuICAgICAgICAgICAgKF9iID0gbXVsdGlwbGUub25EYXlDbGljaykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwobXVsdGlwbGUsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNEYXlQaWNrZXJSYW5nZShjb250ZXh0KSkge1xuICAgICAgICAgICAgKF9jID0gcmFuZ2Uub25EYXlDbGljaykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmNhbGwocmFuZ2UsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgKF9kID0gY29udGV4dC5vbkRheUNsaWNrKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuY2FsbChjb250ZXh0LCBkYXRlLCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZUZvY3VzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBmb2N1cyhkYXRlKTtcbiAgICAgICAgKF9hID0gY29udGV4dC5vbkRheUZvY3VzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChjb250ZXh0LCBkYXRlLCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZUJsdXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGJsdXIoKTtcbiAgICAgICAgKF9hID0gY29udGV4dC5vbkRheUJsdXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNvbnRleHQsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgZm9jdXNPbktleURvd24oZSk7XG4gICAgICAgIChfYSA9IGNvbnRleHQub25EYXlLZXlEb3duKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChjb250ZXh0LCBkYXRlLCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZUtleVVwID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSBjb250ZXh0Lm9uRGF5S2V5VXApID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNvbnRleHQsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlTW91c2VFbnRlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gY29udGV4dC5vbkRheU1vdXNlRW50ZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNvbnRleHQsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlTW91c2VMZWF2ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gY29udGV4dC5vbkRheU1vdXNlTGVhdmUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNvbnRleHQsIGRhdGUsIG1vZGlmaWVycywgZSk7XG4gICAgfTtcbiAgICB2YXIgaGFuZGxlVG91Y2hDYW5jZWwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IGNvbnRleHQub25EYXlUb3VjaENhbmNlbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY29udGV4dCwgZGF0ZSwgbW9kaWZpZXJzLCBlKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVUb3VjaEVuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gY29udGV4dC5vbkRheVRvdWNoRW5kKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChjb250ZXh0LCBkYXRlLCBtb2RpZmllcnMsIGUpO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZVRvdWNoTW92ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gY29udGV4dC5vbkRheVRvdWNoTW92ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY29udGV4dCwgZGF0ZSwgbW9kaWZpZXJzLCBlKTtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVUb3VjaFN0YXJ0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSBjb250ZXh0Lm9uRGF5VG91Y2hTdGFydCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY29udGV4dCwgZGF0ZSwgbW9kaWZpZXJzLCBlKTtcbiAgICB9O1xuICAgIGlmIChpc091dHNpZGUpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKGNvbnRleHQuY2xhc3NOYW1lcy5kYXlfb3V0c2lkZSk7XG4gICAgICAgIHN0eWxlID0gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbnRleHQuc3R5bGVzKSwgY29udGV4dC5zdHlsZXMuZGF5X291dHNpZGUpO1xuICAgIH1cbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWVzLmpvaW4oJyAnKTtcbiAgICB2YXIgc2VsZWN0ZWQgPSBtb2RpZmllcnMuc2VsZWN0ZWQsIGRpc2FibGVkID0gbW9kaWZpZXJzLmRpc2FibGVkO1xuICAgIHZhciB0YWJJbmRleCA9IGlzRm9jdXNUYXJnZXQgPyAwIDogLTE7XG4gICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXR1cm5WYWx1ZSksIHsgYnV0dG9uUHJvcHM6IHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICAgICAgICAgICdhcmlhLXByZXNzZWQnOiBzZWxlY3RlZCxcbiAgICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICAgICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgICAgICAgICAgb25DbGljazogaGFuZGxlQ2xpY2ssXG4gICAgICAgICAgICBvbkZvY3VzOiBoYW5kbGVGb2N1cyxcbiAgICAgICAgICAgIG9uQmx1cjogaGFuZGxlQmx1cixcbiAgICAgICAgICAgIG9uS2V5RG93bjogaGFuZGxlS2V5RG93bixcbiAgICAgICAgICAgIG9uS2V5VXA6IGhhbmRsZUtleVVwLFxuICAgICAgICAgICAgb25Nb3VzZUVudGVyOiBoYW5kbGVNb3VzZUVudGVyLFxuICAgICAgICAgICAgb25Nb3VzZUxlYXZlOiBoYW5kbGVNb3VzZUxlYXZlLFxuICAgICAgICAgICAgb25Ub3VjaENhbmNlbDogaGFuZGxlVG91Y2hDYW5jZWwsXG4gICAgICAgICAgICBvblRvdWNoRW5kOiBoYW5kbGVUb3VjaEVuZCxcbiAgICAgICAgICAgIG9uVG91Y2hNb3ZlOiBoYW5kbGVUb3VjaE1vdmUsXG4gICAgICAgICAgICBvblRvdWNoU3RhcnQ6IGhhbmRsZVRvdWNoU3RhcnRcbiAgICAgICAgfSB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZURheS5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJy4uL0J1dHRvbic7XG5pbXBvcnQgeyB1c2VEYXkgfSBmcm9tICcuL2hvb2tzL3VzZURheSc7XG4vKipcbiAqIFRoZSBjb250ZW50IG9mIGEgZGF5IGNlbGwg4oCTIGFzIGEgYnV0dG9uIG9yIHNwYW4gZWxlbWVudCBhY2NvcmRpbmcgdG8gaXRzXG4gKiBtb2RpZmllcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEYXkocHJvcHMpIHtcbiAgICB2YXIgYnV0dG9uUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIHZhciBkYXkgPSB1c2VEYXkocHJvcHMuZGF0ZSwgcHJvcHMuZGlzcGxheU1vbnRoLCBidXR0b25SZWYpO1xuICAgIHZhciBidXR0b25Qcm9wcyA9IGRheS5idXR0b25Qcm9wcywgbm9uSW50ZXJhY3RpdmVQcm9wcyA9IGRheS5ub25JbnRlcmFjdGl2ZVByb3BzO1xuICAgIGlmICghYnV0dG9uUHJvcHMgJiYgIW5vbkludGVyYWN0aXZlUHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwpO1xuICAgIH1cbiAgICBpZiAobm9uSW50ZXJhY3RpdmVQcm9wcykge1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfX2Fzc2lnbih7fSwgbm9uSW50ZXJhY3RpdmVQcm9wcykpO1xuICAgIH1cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b24sIF9fYXNzaWduKHsgcmVmOiBidXR0b25SZWYgfSwgYnV0dG9uUHJvcHMpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURheS5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbi8qKlxuICogUmVuZGVyIHRoZSBjb250ZW50IG9mIHRoZSBkYXkgY2VsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIERheUNvbnRlbnQocHJvcHMpIHtcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgbG9jYWxlID0gX2EubG9jYWxlLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgc3R5bGVzID0gX2Euc3R5bGVzLCBsYWJlbERheSA9IF9hLmxhYmVscy5sYWJlbERheSwgZm9ybWF0RGF5ID0gX2EuZm9ybWF0dGVycy5mb3JtYXREYXk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIgfSwgZm9ybWF0RGF5KHByb3BzLmRhdGUsIHsgbG9jYWxlOiBsb2NhbGUgfSkpLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy52aGlkZGVuLCBzdHlsZTogc3R5bGVzLnZoaWRkZW4gfSwgbGFiZWxEYXkocHJvcHMuZGF0ZSwgcHJvcHMubW9kaWZpZXJzLCB7IGxvY2FsZTogbG9jYWxlIH0pKSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF5Q29udGVudC5qcy5tYXAiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbi8qKlxuICogUmVuZGVyIGEgc3R5bGVkIHNlbGVjdCBjb21wb25lbnQg4oCTIGRpc3BsYXlpbmcgYSBjYXB0aW9uIGFuZCBhIGN1c3RvbVxuICogZHJvcC1kb3duIGljb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEcm9wZG93bihwcm9wcykge1xuICAgIHZhciBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLCB2YWx1ZSA9IHByb3BzLnZhbHVlLCBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLCBjYXB0aW9uID0gcHJvcHMuY2FwdGlvbiwgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLCBzdHlsZSA9IHByb3BzLnN0eWxlO1xuICAgIHZhciBfYSA9IHVzZURheVBpY2tlcigpLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgc3R5bGVzID0gX2Euc3R5bGVzLCBJY29uRHJvcGRvd24gPSBfYS5jb21wb25lbnRzLkljb25Ecm9wZG93bjtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZSwgc3R5bGU6IHN0eWxlIH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLnZoaWRkZW4gfSwgcHJvcHNbJ2FyaWEtbGFiZWwnXSksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIiwgeyBcImFyaWEtbGFiZWxcIjogcHJvcHNbJ2FyaWEtbGFiZWwnXSwgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmRyb3Bkb3duLCBzdHlsZTogc3R5bGVzLmRyb3Bkb3duLCB2YWx1ZTogdmFsdWUsIG9uQ2hhbmdlOiBvbkNoYW5nZSB9LCBjaGlsZHJlbiksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMuY2FwdGlvbl9sYWJlbCwgc3R5bGU6IHN0eWxlcy5jYXB0aW9uX2xhYmVsLCBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiIH0sXG4gICAgICAgICAgICBjYXB0aW9uLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChJY29uRHJvcGRvd24sIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmRyb3Bkb3duX2ljb24sIHN0eWxlOiBzdHlsZXMuZHJvcGRvd25faWNvbiB9KSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURyb3Bkb3duLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuLyoqIFJlbmRlciB0aGUgRm9vdGVyIGNvbXBvbmVudCAoZW1wdHkgYXMgZGVmYXVsdCkuKi9cbmV4cG9ydCBmdW5jdGlvbiBGb290ZXIoKSB7XG4gICAgdmFyIF9hID0gdXNlRGF5UGlja2VyKCksIGZvb3RlciA9IF9hLmZvb3Rlciwgc3R5bGVzID0gX2Euc3R5bGVzLCB0Zm9vdCA9IF9hLmNsYXNzTmFtZXMudGZvb3Q7XG4gICAgaWYgKCFmb290ZXIpXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0Zm9vdFwiLCB7IGNsYXNzTmFtZTogdGZvb3QsIHN0eWxlOiBzdHlsZXMudGZvb3QgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInRyXCIsIG51bGwsXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwidGRcIiwgeyBjb2xTcGFuOiA4IH0sIGZvb3RlcikpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Gb290ZXIuanMubWFwIiwiaW1wb3J0IHsgYWRkRGF5cywgc3RhcnRPZldlZWsgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIEdlbmVyYXRlIGEgc2VyaWVzIG9mIDcgZGF5cywgc3RhcnRpbmcgZnJvbSB0aGUgd2VlaywgdG8gdXNlIGZvciBmb3JtYXR0aW5nXG4gKiB0aGUgd2Vla2RheSBuYW1lcyAoTW9uZGF5LCBUdWVzZGF5LCBldGMuKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtkYXlzKGxvY2FsZSkge1xuICAgIHZhciBzdGFydCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKCksIHsgbG9jYWxlOiBsb2NhbGUgfSk7XG4gICAgdmFyIGRheXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICB2YXIgZGF5ID0gYWRkRGF5cyhzdGFydCwgaSk7XG4gICAgICAgIGRheXMucHVzaChkYXkpO1xuICAgIH1cbiAgICByZXR1cm4gZGF5cztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldFdlZWtkYXlzLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuaW1wb3J0IHsgZ2V0V2Vla2RheXMgfSBmcm9tICcuL3V0aWxzJztcbi8qKlxuICogUmVuZGVyIHRoZSBIZWFkIGNvbXBvbmVudCAtIGkuZS4gdGhlIHRhYmxlIGhlYWQgd2l0aCB0aGUgd2Vla2RheSBuYW1lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEhlYWQoKSB7XG4gICAgdmFyIF9hID0gdXNlRGF5UGlja2VyKCksIGNsYXNzTmFtZXMgPSBfYS5jbGFzc05hbWVzLCBzdHlsZXMgPSBfYS5zdHlsZXMsIHNob3dXZWVrTnVtYmVyID0gX2Euc2hvd1dlZWtOdW1iZXIsIGxvY2FsZSA9IF9hLmxvY2FsZSwgZm9ybWF0V2Vla2RheU5hbWUgPSBfYS5mb3JtYXR0ZXJzLmZvcm1hdFdlZWtkYXlOYW1lLCBsYWJlbFdlZWtkYXkgPSBfYS5sYWJlbHMubGFiZWxXZWVrZGF5O1xuICAgIHZhciB3ZWVrZGF5cyA9IGdldFdlZWtkYXlzKGxvY2FsZSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwidGhlYWRcIiwgeyBzdHlsZTogc3R5bGVzLmhlYWQsIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5oZWFkIH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7IHN0eWxlOiBzdHlsZXMuaGVhZF9yb3csIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5oZWFkX3JvdyB9LFxuICAgICAgICAgICAgc2hvd1dlZWtOdW1iZXIgJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCB7IHNjb3BlOiBcImNvbFwiLCBzdHlsZTogc3R5bGVzLmhlYWRfY2VsbCwgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmhlYWRfY2VsbCB9KSksXG4gICAgICAgICAgICB3ZWVrZGF5cy5tYXAoZnVuY3Rpb24gKHdlZWtkYXksIGkpIHsgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwidGhcIiwgeyBrZXk6IGksIHNjb3BlOiBcImNvbFwiLCBjbGFzc05hbWU6IGNsYXNzTmFtZXMuaGVhZF9jZWxsLCBzdHlsZTogc3R5bGVzLmhlYWRfY2VsbCB9LFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgXCJhcmlhLWhpZGRlblwiOiB0cnVlIH0sIGZvcm1hdFdlZWtkYXlOYW1lKHdlZWtkYXksIHsgbG9jYWxlOiBsb2NhbGUgfSkpLFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLnZoaWRkZW4gfSwgbGFiZWxXZWVrZGF5KHdlZWtkYXksIHsgbG9jYWxlOiBsb2NhbGUgfSkpKSk7IH0pKSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SGVhZC5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogUmVuZGVyIHRoZSBpY29uIGluIHRoZSBzdHlsZWQgZHJvcC1kb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSWNvbkRyb3Bkb3duKHByb3BzKSB7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9fYXNzaWduKHsgd2lkdGg6IFwiOHB4XCIsIGhlaWdodDogXCI4cHhcIiwgdmlld0JveDogXCIwIDAgMTIwIDEyMFwiLCBcImRhdGEtdGVzdGlkXCI6IFwiaWNvbkRyb3Bkb3duXCIgfSwgcHJvcHMpLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7IGQ6IFwiTTQuMjIxODI1NDEsNDguMjIxODI1NCBDOC40NDIyMjgyOCw0NC4wMDE0MjI1IDE1LjIzODg0OTQsNDMuOTI3MzgwNCAxOS41NDk2NDU5LDQ3Ljk5OTY5ODkgTDE5Ljc3ODE3NDYsNDguMjIxODI1NCBMNjAsODguNDQzIEwxMDAuMjIxODI1LDQ4LjIyMTgyNTQgQzEwNC40NDIyMjgsNDQuMDAxNDIyNSAxMTEuMjM4ODQ5LDQzLjkyNzM4MDQgMTE1LjU0OTY0Niw0Ny45OTk2OTg5IEwxMTUuNzc4MTc1LDQ4LjIyMTgyNTQgQzExOS45OTg1NzcsNTIuNDQyMjI4MyAxMjAuMDcyNjIsNTkuMjM4ODQ5NCAxMTYuMDAwMzAxLDYzLjU0OTY0NTkgTDExNS43NzgxNzUsNjMuNzc4MTc0NiBMNjcuNzc4MTc0NiwxMTEuNzc4MTc1IEM2My41NTc3NzE3LDExNS45OTg1NzcgNTYuNzYxMTUwNiwxMTYuMDcyNjIgNTIuNDUwMzU0MSwxMTIuMDAwMzAxIEw1Mi4yMjE4MjU0LDExMS43NzgxNzUgTDQuMjIxODI1NDEsNjMuNzc4MTc0NiBDLTAuMDczOTQxODAyMyw1OS40ODI0MDc0IC0wLjA3Mzk0MTgwMjMsNTIuNTE3NTkyNiA0LjIyMTgyNTQxLDQ4LjIyMTgyNTQgWlwiLCBmaWxsOiBcImN1cnJlbnRDb2xvclwiLCBmaWxsUnVsZTogXCJub256ZXJvXCIgfSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUljb25Ecm9wZG93bi5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogUmVuZGVyIHRoZSBcInByZXZpb3VzIG1vbnRoXCIgYnV0dG9uIGluIHRoZSBuYXZpZ2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSWNvbkxlZnQocHJvcHMpIHtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX19hc3NpZ24oeyB3aWR0aDogXCIxNnB4XCIsIGhlaWdodDogXCIxNnB4XCIsIHZpZXdCb3g6IFwiMCAwIDEyMCAxMjBcIiwgXCJkYXRhLXRlc3RpZFwiOiBcImljb25MZWZ0XCIgfSwgcHJvcHMpLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7IGQ6IFwiTTY5LjQ5MDMzMiwzLjM0MzE0NTc1IEM3Mi42MTQ1MjYzLDAuMjE4OTUxNDE2IDc3LjY3OTg0NjIsMC4yMTg5NTE0MTYgODAuODA0MDQwNSwzLjM0MzE0NTc1IEM4My44NjE3NjI2LDYuNDAwODY3ODYgODMuOTI2ODIwNSwxMS4zMTc5OTMxIDgwLjk5OTIxNDMsMTQuNDU0ODM4OCBMODAuODA0MDQwNSwxNC42NTY4NTQyIEwzNS40NjEsNjAgTDgwLjgwNDA0MDUsMTA1LjM0MzE0NiBDODMuODYxNzYyNiwxMDguNDAwODY4IDgzLjkyNjgyMDUsMTEzLjMxNzk5MyA4MC45OTkyMTQzLDExNi40NTQ4MzkgTDgwLjgwNDA0MDUsMTE2LjY1Njg1NCBDNzcuNzQ2MzE4NCwxMTkuNzE0NTc2IDcyLjgyOTE5MzEsMTE5Ljc3OTYzNCA2OS42OTIzNDc1LDExNi44NTIwMjggTDY5LjQ5MDMzMiwxMTYuNjU2ODU0IEwxOC40OTAzMzIsNjUuNjU2ODU0MiBDMTUuNDMyNjA5OSw2Mi41OTkxMzIxIDE1LjM2NzU1Miw1Ny42ODIwMDY5IDE4LjI5NTE1ODMsNTQuNTQ1MTYxMiBMMTguNDkwMzMyLDU0LjM0MzE0NTggTDY5LjQ5MDMzMiwzLjM0MzE0NTc1IFpcIiwgZmlsbDogXCJjdXJyZW50Q29sb3JcIiwgZmlsbFJ1bGU6IFwibm9uemVyb1wiIH0pKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JY29uTGVmdC5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogUmVuZGVyIHRoZSBcIm5leHQgbW9udGhcIiBidXR0b24gaW4gdGhlIG5hdmlnYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBJY29uUmlnaHQocHJvcHMpIHtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX19hc3NpZ24oeyB3aWR0aDogXCIxNnB4XCIsIGhlaWdodDogXCIxNnB4XCIsIHZpZXdCb3g6IFwiMCAwIDEyMCAxMjBcIiB9LCBwcm9wcywgeyBcImRhdGEtdGVzdGlkXCI6IFwiaWNvblJpZ2h0XCIgfSksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHsgZDogXCJNNDkuODA0MDQwNSwzLjM0MzE0NTc1IEM0Ni42Nzk4NDYyLDAuMjE4OTUxNDE2IDQxLjYxNDUyNjMsMC4yMTg5NTE0MTYgMzguNDkwMzMyLDMuMzQzMTQ1NzUgQzM1LjQzMjYwOTksNi40MDA4Njc4NiAzNS4zNjc1NTIsMTEuMzE3OTkzMSAzOC4yOTUxNTgzLDE0LjQ1NDgzODggTDM4LjQ5MDMzMiwxNC42NTY4NTQyIEw4My44MzMzNzI1LDYwIEwzOC40OTAzMzIsMTA1LjM0MzE0NiBDMzUuNDMyNjA5OSwxMDguNDAwODY4IDM1LjM2NzU1MiwxMTMuMzE3OTkzIDM4LjI5NTE1ODMsMTE2LjQ1NDgzOSBMMzguNDkwMzMyLDExNi42NTY4NTQgQzQxLjU0ODA1NDEsMTE5LjcxNDU3NiA0Ni40NjUxNzk0LDExOS43Nzk2MzQgNDkuNjAyMDI1LDExNi44NTIwMjggTDQ5LjgwNDA0MDUsMTE2LjY1Njg1NCBMMTAwLjgwNDA0MSw2NS42NTY4NTQyIEMxMDMuODYxNzYzLDYyLjU5OTEzMjEgMTAzLjkyNjgyMSw1Ny42ODIwMDY5IDEwMC45OTkyMTQsNTQuNTQ1MTYxMiBMMTAwLjgwNDA0MSw1NC4zNDMxNDU4IEw0OS44MDQwNDA1LDMuMzQzMTQ1NzUgWlwiLCBmaWxsOiBcImN1cnJlbnRDb2xvclwiIH0pKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JY29uUmlnaHQuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldFVuaXhUaW1lIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgdXNlRGF5UGlja2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvRGF5UGlja2VyJztcbi8qKlxuICogUmVuZGVyIGEgcm93IGluIHRoZSBjYWxlbmRhciwgd2l0aCB0aGUgZGF5cyBhbmQgb3B0aW9uYWxseSB0aGUgd2VlayBudW1iZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSb3cocHJvcHMpIHtcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgc3R5bGVzID0gX2Euc3R5bGVzLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgc2hvd1dlZWtOdW1iZXIgPSBfYS5zaG93V2Vla051bWJlciwgX2IgPSBfYS5jb21wb25lbnRzLCBEYXkgPSBfYi5EYXksIFdlZWtOdW1iZXIgPSBfYi5XZWVrTnVtYmVyO1xuICAgIHZhciB3ZWVrTnVtYmVyQ2VsbDtcbiAgICBpZiAoc2hvd1dlZWtOdW1iZXIpIHtcbiAgICAgICAgd2Vla051bWJlckNlbGwgPSAoUmVhY3QuY3JlYXRlRWxlbWVudChcInRkXCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmNlbGwsIHN0eWxlOiBzdHlsZXMuY2VsbCB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChXZWVrTnVtYmVyLCB7IG51bWJlcjogcHJvcHMud2Vla051bWJlciwgZGF0ZXM6IHByb3BzLmRhdGVzIH0pKSk7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInRyXCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLnJvdywgc3R5bGU6IHN0eWxlcy5yb3cgfSxcbiAgICAgICAgd2Vla051bWJlckNlbGwsXG4gICAgICAgIHByb3BzLmRhdGVzLm1hcChmdW5jdGlvbiAoZGF0ZSkgeyByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5jZWxsLCBzdHlsZTogc3R5bGVzLmNlbGwsIGtleTogZ2V0VW5peFRpbWUoZGF0ZSkgfSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRGF5LCB7IGRpc3BsYXlNb250aDogcHJvcHMuZGlzcGxheU1vbnRoLCBkYXRlOiBkYXRlIH0pKSk7IH0pKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sb3cuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuLi9CdXR0b24nO1xuLyoqXG4gKiBSZW5kZXIgdGhlIHdlZWsgbnVtYmVyIGVsZW1lbnQuIElmIGBvbldlZWtOdW1iZXJDbGlja2AgaXMgcGFzc2VkIHRvIERheVBpY2tlciwgaXRcbiAqIHJlbmRlcnMgYSBidXR0b24sIG90aGVyd2lzZSBhIHNwYW4gZWxlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFdlZWtOdW1iZXIocHJvcHMpIHtcbiAgICB2YXIgd2Vla051bWJlciA9IHByb3BzLm51bWJlciwgZGF0ZXMgPSBwcm9wcy5kYXRlcztcbiAgICB2YXIgX2EgPSB1c2VEYXlQaWNrZXIoKSwgb25XZWVrTnVtYmVyQ2xpY2sgPSBfYS5vbldlZWtOdW1iZXJDbGljaywgc3R5bGVzID0gX2Euc3R5bGVzLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgbG9jYWxlID0gX2EubG9jYWxlLCBsYWJlbFdlZWtOdW1iZXIgPSBfYS5sYWJlbHMubGFiZWxXZWVrTnVtYmVyLCBmb3JtYXRXZWVrTnVtYmVyID0gX2EuZm9ybWF0dGVycy5mb3JtYXRXZWVrTnVtYmVyO1xuICAgIHZhciBoYW5kbGVDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIG9uV2Vla051bWJlckNsaWNrID09PSBudWxsIHx8IG9uV2Vla051bWJlckNsaWNrID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbldlZWtOdW1iZXJDbGljayh3ZWVrTnVtYmVyLCBkYXRlcywgZSk7XG4gICAgfTtcbiAgICB2YXIgY29udGVudCA9IGZvcm1hdFdlZWtOdW1iZXIoTnVtYmVyKHdlZWtOdW1iZXIpLCB7IGxvY2FsZTogbG9jYWxlIH0pO1xuICAgIGlmICghb25XZWVrTnVtYmVyQ2xpY2spIHtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy53ZWVrbnVtYmVyLCBzdHlsZTogc3R5bGVzLndlZWtudW1iZXIgfSwgY29udGVudCkpO1xuICAgIH1cbiAgICB2YXIgbGFiZWwgPSBsYWJlbFdlZWtOdW1iZXIoTnVtYmVyKHdlZWtOdW1iZXIpLCB7IGxvY2FsZTogbG9jYWxlIH0pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b24sIHsgXCJhcmlhLWxhYmVsXCI6IGxhYmVsLCBjbGFzc05hbWU6IGNsYXNzTmFtZXMud2Vla251bWJlciwgc3R5bGU6IHN0eWxlcy53ZWVrbnVtYmVyLCBvbkNsaWNrOiBoYW5kbGVDbGljayB9LCBjb250ZW50KSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XZWVrTnVtYmVyLmpzLm1hcCIsIi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgQ1NTIGNsYXNzZXMuXG4gKi9cbmV4cG9ydCB2YXIgZGVmYXVsdENsYXNzTmFtZXMgPSB7XG4gICAgcm9vdDogJ3JkcCcsXG4gICAgbXVsdGlwbGVfbW9udGhzOiAncmRwLW11bHRpcGxlX21vbnRocycsXG4gICAgd2l0aF93ZWVrbnVtYmVyOiAncmRwLXdpdGhfd2Vla251bWJlcicsXG4gICAgdmhpZGRlbjogJ3JkcC12aGlkZGVuJyxcbiAgICBidXR0b25fcmVzZXQ6ICdyZHAtYnV0dG9uX3Jlc2V0JyxcbiAgICBidXR0b246ICdyZHAtYnV0dG9uJyxcbiAgICBjYXB0aW9uOiAncmRwLWNhcHRpb24nLFxuICAgIGNhcHRpb25fc3RhcnQ6ICdyZHAtY2FwdGlvbl9zdGFydCcsXG4gICAgY2FwdGlvbl9lbmQ6ICdyZHAtY2FwdGlvbl9lbmQnLFxuICAgIGNhcHRpb25fYmV0d2VlbjogJ3JkcC1jYXB0aW9uX2JldHdlZW4nLFxuICAgIGNhcHRpb25fbGFiZWw6ICdyZHAtY2FwdGlvbl9sYWJlbCcsXG4gICAgY2FwdGlvbl9kcm9wZG93bnM6ICdyZHAtY2FwdGlvbl9kcm9wZG93bnMnLFxuICAgIGRyb3Bkb3duOiAncmRwLWRyb3Bkb3duJyxcbiAgICBkcm9wZG93bl9tb250aDogJ3JkcC1kcm9wZG93bl9tb250aCcsXG4gICAgZHJvcGRvd25feWVhcjogJ3JkcC1kcm9wZG93bl95ZWFyJyxcbiAgICBkcm9wZG93bl9pY29uOiAncmRwLWRyb3Bkb3duX2ljb24nLFxuICAgIG1vbnRoczogJ3JkcC1tb250aHMnLFxuICAgIG1vbnRoOiAncmRwLW1vbnRoJyxcbiAgICB0YWJsZTogJ3JkcC10YWJsZScsXG4gICAgdGJvZHk6ICdyZHAtdGJvZHknLFxuICAgIHRmb290OiAncmRwLXRmb290JyxcbiAgICBoZWFkOiAncmRwLWhlYWQnLFxuICAgIGhlYWRfcm93OiAncmRwLWhlYWRfcm93JyxcbiAgICBoZWFkX2NlbGw6ICdyZHAtaGVhZF9jZWxsJyxcbiAgICBuYXY6ICdyZHAtbmF2JyxcbiAgICBuYXZfYnV0dG9uOiAncmRwLW5hdl9idXR0b24nLFxuICAgIG5hdl9idXR0b25fcHJldmlvdXM6ICdyZHAtbmF2X2J1dHRvbl9wcmV2aW91cycsXG4gICAgbmF2X2J1dHRvbl9uZXh0OiAncmRwLW5hdl9idXR0b25fbmV4dCcsXG4gICAgbmF2X2ljb246ICdyZHAtbmF2X2ljb24nLFxuICAgIHJvdzogJ3JkcC1yb3cnLFxuICAgIHdlZWtudW1iZXI6ICdyZHAtd2Vla251bWJlcicsXG4gICAgY2VsbDogJ3JkcC1jZWxsJyxcbiAgICBkYXk6ICdyZHAtZGF5JyxcbiAgICBkYXlfb3V0c2lkZTogJ3JkcC1kYXlfb3V0c2lkZSdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWZhdWx0Q2xhc3NOYW1lcy5qcy5tYXAiLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIFRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgdGhlIGNhcHRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDYXB0aW9uKG1vbnRoLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZvcm1hdChtb250aCwgJ0xMTEwgeScsIG9wdGlvbnMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9ybWF0Q2FwdGlvbi5qcy5tYXAiLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIFRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgdGhlIERheSBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXkoZGF5LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZvcm1hdChkYXksICdkJywgb3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JtYXREYXkuanMubWFwIiwiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnO1xuLyoqXG4gKiBUaGUgZGVmYXVsdCBmb3JtYXR0ZXIgZm9yIHRoZSBNb250aCBjYXB0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TW9udGhDYXB0aW9uKG1vbnRoLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZvcm1hdChtb250aCwgJ0xMTEwnLCBvcHRpb25zKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvcm1hdE1vbnRoQ2FwdGlvbi5qcy5tYXAiLCIvKipcbiAqIFRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgdGhlIHdlZWsgbnVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlcih3ZWVrTnVtYmVyKSB7XG4gICAgcmV0dXJuIFwiXCIgKyB3ZWVrTnVtYmVyO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9ybWF0V2Vla051bWJlci5qcy5tYXAiLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIFRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgdGhlIG5hbWUgb2YgdGhlIHdlZWtkYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRXZWVrZGF5TmFtZSh3ZWVrZGF5LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZvcm1hdCh3ZWVrZGF5LCAnY2NjY2NjJywgb3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JtYXRXZWVrZGF5TmFtZS5qcy5tYXAiLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIFRoZSBkZWZhdWx0IGZvcm1hdHRlciBmb3IgdGhlIFllYXIgY2FwdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFllYXJDYXB0aW9uKHllYXIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZm9ybWF0KHllYXIsICd5eXl5Jywgb3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JtYXRZZWFyQ2FwdGlvbi5qcy5tYXAiLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIFRoZSBkZWZhdWx0IEFSSUEgbGFiZWwgZm9yIHRoZSBkYXkgYnV0dG9uLlxuICovXG5leHBvcnQgdmFyIGxhYmVsRGF5ID0gZnVuY3Rpb24gKGRheSwgbW9kaWZlcnMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZm9ybWF0KGRheSwgJ2RvIE1NTU0gKEVFRUUpJywgb3B0aW9ucyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGFiZWxEYXkuanMubWFwIiwiLyoqXG4gKiBUaGUgZGVmYXVsdCBBUklBIGxhYmVsIGZvciB0aGUgV2Vla051bWJlciBlbGVtZW50LlxuICovXG5leHBvcnQgdmFyIGxhYmVsTW9udGhEcm9wZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gJ01vbnRoOiAnO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhYmVsTW9udGhEcm9wZG93bi5qcy5tYXAiLCIvKipcbiAqIFRoZSBkZWZhdWx0IEFSSUEgbGFiZWwgZm9yIG5leHQgbW9udGggYnV0dG9uIGluIG5hdmlnYXRpb25cbiAqL1xuZXhwb3J0IHZhciBsYWJlbE5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdHbyB0byBuZXh0IG1vbnRoJztcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYWJlbE5leHQuanMubWFwIiwiLyoqXG4gKiBUaGUgZGVmYXVsdCBBUklBIGxhYmVsIGZvciBwcmV2aW91cyBtb250aCBidXR0b24gaW4gbmF2aWdhdGlvblxuICovXG5leHBvcnQgdmFyIGxhYmVsUHJldmlvdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICdHbyB0byBwcmV2aW91cyBtb250aCc7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGFiZWxQcmV2aW91cy5qcy5tYXAiLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIFRoZSBkZWZhdWx0IEFSSUEgbGFiZWwgZm9yIHRoZSBXZWVrZGF5IGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB2YXIgbGFiZWxXZWVrZGF5ID0gZnVuY3Rpb24gKGRheSwgb3B0aW9ucykge1xuICAgIHJldHVybiBmb3JtYXQoZGF5LCAnY2NjYycsIG9wdGlvbnMpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhYmVsV2Vla2RheS5qcy5tYXAiLCIvKipcbiAqIFRoZSBkZWZhdWx0IEFSSUEgbGFiZWwgZm9yIHRoZSBXZWVrTnVtYmVyIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB2YXIgbGFiZWxXZWVrTnVtYmVyID0gZnVuY3Rpb24gKG4pIHtcbiAgICByZXR1cm4gXCJXZWVrIG4uIFwiICsgbjtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYWJlbFdlZWtOdW1iZXIuanMubWFwIiwiLyoqXG4gKiBUaGUgZGVmYXVsdCBBUklBIGxhYmVsIGZvciB0aGUgV2Vla051bWJlciBlbGVtZW50LlxuICovXG5leHBvcnQgdmFyIGxhYmVsWWVhckRyb3Bkb3duID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnWWVhcjogJztcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYWJlbFllYXJEcm9wZG93bi5qcy5tYXAiLCJpbXBvcnQgeyBzdGFydE9mRGF5LCBzdGFydE9mTW9udGggfSBmcm9tICdkYXRlLWZucyc7XG4vKipcbiAqIEJ1aWxkIHRoZSBgZnJvbURhdGVgIGFuZCBgdG9EYXRlYCB2YWx1ZXMsIGdpdmVuIHRoZSBmcm9tTW9udGgvdG9Nb250aFxuICogb3IgZnJvbVllYXIvdG9ZZWFyIHByb3BzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGcm9tVG9Qcm9wcyhwcm9wcykge1xuICAgIHZhciBmcm9tWWVhciA9IHByb3BzLmZyb21ZZWFyLCB0b1llYXIgPSBwcm9wcy50b1llYXIsIGZyb21Nb250aCA9IHByb3BzLmZyb21Nb250aCwgdG9Nb250aCA9IHByb3BzLnRvTW9udGg7XG4gICAgdmFyIGZyb21EYXRlID0gcHJvcHMuZnJvbURhdGUsIHRvRGF0ZSA9IHByb3BzLnRvRGF0ZTtcbiAgICBpZiAoZnJvbU1vbnRoKSB7XG4gICAgICAgIGZyb21EYXRlID0gc3RhcnRPZk1vbnRoKGZyb21Nb250aCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGZyb21ZZWFyKSB7XG4gICAgICAgIGZyb21EYXRlID0gbmV3IERhdGUoZnJvbVllYXIsIDAsIDEpO1xuICAgIH1cbiAgICBpZiAodG9Nb250aCkge1xuICAgICAgICB0b0RhdGUgPSBzdGFydE9mTW9udGgodG9Nb250aCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRvWWVhcikge1xuICAgICAgICB0b0RhdGUgPSBuZXcgRGF0ZSh0b1llYXIsIDExLCAzMSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGZyb21EYXRlOiBmcm9tRGF0ZSA/IHN0YXJ0T2ZEYXkoZnJvbURhdGUpIDogdW5kZWZpbmVkLFxuICAgICAgICB0b0RhdGU6IHRvRGF0ZSA/IHN0YXJ0T2ZEYXkodG9EYXRlKSA6IHVuZGVmaW5lZFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZUZyb21Ub1Byb3BzLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBlblVTIH0gZnJvbSAnZGF0ZS1mbnMvbG9jYWxlJztcbmltcG9ydCB7IENhcHRpb24gfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL0NhcHRpb24nO1xuaW1wb3J0IHsgQ2FwdGlvbkxhYmVsIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9DYXB0aW9uTGFiZWwnO1xuaW1wb3J0IHsgRGF5IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9EYXknO1xuaW1wb3J0IHsgRGF5Q29udGVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvRGF5Q29udGVudCc7XG5pbXBvcnQgeyBEcm9wZG93biB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvRHJvcGRvd24nO1xuaW1wb3J0IHsgRm9vdGVyIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Gb290ZXInO1xuaW1wb3J0IHsgSGVhZCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvSGVhZCc7XG5pbXBvcnQgeyBJY29uRHJvcGRvd24gfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL0ljb25Ecm9wZG93bic7XG5pbXBvcnQgeyBJY29uTGVmdCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvSWNvbkxlZnQnO1xuaW1wb3J0IHsgSWNvblJpZ2h0IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9JY29uUmlnaHQnO1xuaW1wb3J0IHsgUm93IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Sb3cnO1xuaW1wb3J0IHsgV2Vla051bWJlciB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvV2Vla051bWJlcic7XG5pbXBvcnQgeyBkZWZhdWx0Q2xhc3NOYW1lcyB9IGZyb20gJy4vZGVmYXVsdENsYXNzTmFtZXMnO1xuaW1wb3J0ICogYXMgZm9ybWF0dGVycyBmcm9tICcuL2Zvcm1hdHRlcnMnO1xuaW1wb3J0ICogYXMgbGFiZWxzIGZyb20gJy4vbGFiZWxzJztcbmltcG9ydCB7IHBhcnNlRnJvbVRvUHJvcHMgfSBmcm9tICcuL3V0aWxzJztcbi8qKlxuICogVGhlIERheVBpY2tlciBDb250ZXh0IHNoYXJlcyB0aGUgcHJvcHMgcGFzc2VkIHRvIERheVBpY2tlciB3aXRoaW4gaW50ZXJuYWxcbiAqIGFuZCBjdXN0b20gY29tcG9uZW50cy4gSXQgaXMgdXNlZCB0byBzZXQgdGhlIGRlZmF1bHQgdmFsdWVzIGFuZCBwZXJmb3JtXG4gKiBvbmUtdGltZSBjYWxjdWxhdGlvbnMgcmVxdWlyZWQgdG8gcmVuZGVyIHRoZSBkYXlzLlxuICpcbiAqIERldmVsb3BlcnMgbWF5IGFjY2VzcyB0byB0aGlzIGNvbnRleHQgZnJvbSB0aGUgW1t1c2VEYXlQaWNrZXJdXSBob29rIHdoZW5cbiAqIHVzaW5nIGN1c3RvbSBjb21wb25lbnRzLlxuICovXG5leHBvcnQgdmFyIERheVBpY2tlckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KHVuZGVmaW5lZCk7XG4vKipcbiAqIFRoZSBwcm92aWRlciBmb3IgdGhlIFtbRGF5UGlja2VyQ29udGV4dF1dLlxuICpcbiAqIFRoZSBjb250ZXh0IHZhbHVlIGlzIHNldCBieSBhc3NpZ25pbmcgZGVmYXVsdHMgZnJvbSB0aGUgaW5pdGlhbCBEYXlQaWNrZXJcbiAqIHByb3BzLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBEYXlQaWNrZXJQcm92aWRlcihwcm9wcykge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbiwgaW5pdGlhbFByb3BzID0gcHJvcHMuaW5pdGlhbFByb3BzO1xuICAgIHZhciBsb2NhbGUgPSAoX2EgPSBpbml0aWFsUHJvcHMubG9jYWxlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBlblVTO1xuICAgIHZhciBudW1iZXJPZk1vbnRocyA9IChfYiA9IGluaXRpYWxQcm9wcy5udW1iZXJPZk1vbnRocykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMTtcbiAgICB2YXIgdG9kYXkgPSAoX2MgPSBpbml0aWFsUHJvcHMudG9kYXkpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG5ldyBEYXRlKCk7XG4gICAgLy8gTGltaXQgbmF2aWdhdGlvblxuICAgIHZhciBfaCA9IHBhcnNlRnJvbVRvUHJvcHMoaW5pdGlhbFByb3BzKSwgZnJvbURhdGUgPSBfaC5mcm9tRGF0ZSwgdG9EYXRlID0gX2gudG9EYXRlO1xuICAgIC8vIERlZmF1bHQgY2FwdGlvbiBsYXlvdXQuIElmIGNhbGVuZGFyIG5hdmlnYXRpb24gaXMgdW5saW1pdGVkLCBpdCBtdXN0IGJlXG4gICAgLy8gYWx3YXlzIGBidXR0b25zYCDigJMgYXMgd2UgY2Fubm90IGRpc3BsYXkgeWV0IGluZmluaXRlIG9wdGlvbnMgaW4gdGhlIGRyb3Bkb3duLlxuICAgIHZhciBjYXB0aW9uTGF5b3V0ID0gKF9kID0gaW5pdGlhbFByb3BzLmNhcHRpb25MYXlvdXQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6ICdidXR0b25zJztcbiAgICBpZiAoIWZyb21EYXRlICYmICF0b0RhdGUpXG4gICAgICAgIGNhcHRpb25MYXlvdXQgPSAnYnV0dG9ucyc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHZhciB0b1llYXIgPSBpbml0aWFsUHJvcHMudG9ZZWFyLCBmcm9tWWVhciA9IGluaXRpYWxQcm9wcy5mcm9tWWVhciwgdG9Nb250aCA9IGluaXRpYWxQcm9wcy50b01vbnRoLCBmcm9tTW9udGggPSBpbml0aWFsUHJvcHMuZnJvbU1vbnRoLCBjb250ZXh0UHJvcHMgPSBfX3Jlc3QoaW5pdGlhbFByb3BzLCBbXCJ0b1llYXJcIiwgXCJmcm9tWWVhclwiLCBcInRvTW9udGhcIiwgXCJmcm9tTW9udGhcIl0pO1xuICAgIHZhciBjb250ZXh0ID0gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbnRleHRQcm9wcyksIHsgY2FwdGlvbkxheW91dDogY2FwdGlvbkxheW91dCwgZnJvbURhdGU6IGZyb21EYXRlLCB0b0RhdGU6IHRvRGF0ZSwgdG9kYXk6IHRvZGF5LCBsb2NhbGU6IGxvY2FsZSwgbW9kaWZpZXJDbGFzc05hbWVzOiAoX2UgPSBpbml0aWFsUHJvcHMubW9kaWZpZXJDbGFzc05hbWVzKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiB7fSwgXG4gICAgICAgIC8vIFRPRE86IFNob3VsZCB0aGlzIGJlIGluaXRpYWxQcm9wcy5tb2RpZmllclByZWZpeCA/PyAncmRwLWRheV8nP1xuICAgICAgICBtb2RpZmllclByZWZpeDogJ3JkcC1kYXlfJywgbW9kaWZpZXJzOiAoX2YgPSBpbml0aWFsUHJvcHMubW9kaWZpZXJzKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiB7fSwgbnVtYmVyT2ZNb250aHM6IG51bWJlck9mTW9udGhzLCBzdHlsZXM6IChfZyA9IGluaXRpYWxQcm9wcy5zdHlsZXMpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHt9LCBjbGFzc05hbWVzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGVmYXVsdENsYXNzTmFtZXMpLCBpbml0aWFsUHJvcHMuY2xhc3NOYW1lcyksIGZvcm1hdHRlcnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBmb3JtYXR0ZXJzKSwgaW5pdGlhbFByb3BzLmZvcm1hdHRlcnMpLCBsYWJlbHM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBsYWJlbHMpLCBpbml0aWFsUHJvcHMubGFiZWxzKSwgY29tcG9uZW50czogX19hc3NpZ24oeyBDYXB0aW9uOiBDYXB0aW9uLCBDYXB0aW9uTGFiZWw6IENhcHRpb25MYWJlbCwgRGF5OiBEYXksIERheUNvbnRlbnQ6IERheUNvbnRlbnQsIERyb3Bkb3duOiBEcm9wZG93biwgRm9vdGVyOiBGb290ZXIsIEhlYWQ6IEhlYWQsIEljb25Ecm9wZG93bjogSWNvbkRyb3Bkb3duLCBJY29uUmlnaHQ6IEljb25SaWdodCwgSWNvbkxlZnQ6IEljb25MZWZ0LCBSb3c6IFJvdywgV2Vla051bWJlcjogV2Vla051bWJlciB9LCBpbml0aWFsUHJvcHMuY29tcG9uZW50cykgfSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KERheVBpY2tlckNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGNvbnRleHQgfSwgY2hpbGRyZW4pKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURheVBpY2tlckNvbnRleHQuanMubWFwIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IERheVBpY2tlckNvbnRleHQgfSBmcm9tICcuL0RheVBpY2tlckNvbnRleHQnO1xuLyoqXG4gKiBIb29rIHRvIGFjY2VzcyB0aGUgW1tEYXlQaWNrZXJDb250ZXh0XV0uXG4gKlxuICogVG8gdXNlIHRoaXMgaG9vayBtYWtlIHN1cmUgdG8gd3JhcCB0aGUgY29tcG9uZW50cyB3aXRoIGEgb25lXG4gKiBbW0RheVBpY2tlclByb3ZpZGVyXV0uXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURheVBpY2tlcigpIHtcbiAgICB2YXIgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRGF5UGlja2VyQ29udGV4dCk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgaXMgbm90IGRlZmluZWQuIHVzZURheVBpY2tlciBtdXN0IGJlIHVzZWQgd2l0aGluIGEgRGF5UGlja2VyUHJvdmlkZXIgd2l0aCBhIHZhbGlkIHZhbHVlcy5cIik7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNlRGF5UGlja2VyLmpzLm1hcCIsImltcG9ydCB7IGFkZERheXMsIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cywgZW5kT2ZXZWVrIH0gZnJvbSAnZGF0ZS1mbnMnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldE91dHNpZGVFbmREYXlzKG1vbnRoLCBvcHRpb25zKSB7XG4gICAgdmFyIGRheXMgPSBbXTtcbiAgICB2YXIgbGFzdERheU9mV2VlayA9IGVuZE9mV2Vlayhtb250aCwgb3B0aW9ucyk7XG4gICAgdmFyIGVuZERpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMobGFzdERheU9mV2VlaywgbW9udGgpO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IGVuZERpZmY7IGkrKykge1xuICAgICAgICB2YXIgZGF5RGF0ZSA9IGFkZERheXMobW9udGgsIGkpO1xuICAgICAgICBkYXlzLnB1c2goZGF5RGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBkYXlzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0T3V0c2lkZUVuZERheXMuanMubWFwIiwiaW1wb3J0IHsgYWRkRGF5cywgZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzLCBzdGFydE9mV2VlayB9IGZyb20gJ2RhdGUtZm5zJztcbmV4cG9ydCBmdW5jdGlvbiBnZXRPdXRzaWRlU3RhcnREYXlzKG1vbnRoLCBvcHRpb25zKSB7XG4gICAgdmFyIGRheXMgPSBbXTtcbiAgICB2YXIgZmlyc3REYXlPZldlZWsgPSBzdGFydE9mV2Vlayhtb250aCwgb3B0aW9ucyk7XG4gICAgdmFyIHN0YXJ0RGlmZiA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhtb250aCwgZmlyc3REYXlPZldlZWspO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhcnREaWZmOyBpKyspIHtcbiAgICAgICAgdmFyIG5ld0RheSA9IGFkZERheXMoZmlyc3REYXlPZldlZWssIGkpO1xuICAgICAgICBkYXlzLnB1c2gobmV3RGF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGRheXM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRPdXRzaWRlU3RhcnREYXlzLmpzLm1hcCIsImltcG9ydCB7IGFkZERheXMsIGFkZFdlZWtzLCBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMsIGVuZE9mTW9udGgsIGdldFdlZWssIGdldFdlZWtzSW5Nb250aCwgc3RhcnRPZk1vbnRoIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgZ2V0T3V0c2lkZUVuZERheXMgfSBmcm9tICcuL2dldE91dHNpZGVFbmREYXlzJztcbmltcG9ydCB7IGdldE91dHNpZGVTdGFydERheXMgfSBmcm9tICcuL2dldE91dHNpZGVTdGFydERheXMnO1xuLyoqXG4gKiBSZXR1cm4gdGhlIHdlZWtzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gbW9udGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWVrcyhtb250aCwgX2EpIHtcbiAgICB2YXIgbG9jYWxlID0gX2EubG9jYWxlLCBmaXhlZFdlZWtzID0gX2EuZml4ZWRXZWVrcztcbiAgICB2YXIgbW9udGhTdGFydCA9IHN0YXJ0T2ZNb250aChtb250aCk7XG4gICAgdmFyIG1vbnRoRW5kID0gZW5kT2ZNb250aChtb250aCk7XG4gICAgdmFyIGRpZmYgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMobW9udGhFbmQsIG1vbnRoU3RhcnQpO1xuICAgIHZhciB3ZWVrcyA9IFtdO1xuICAgIHZhciBsYXN0V2VlayA9IHsgd2Vla051bWJlcjogMCwgZGF0ZXM6IFtdIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gZGlmZjsgaSsrKSB7XG4gICAgICAgIHZhciBkYXRlID0gYWRkRGF5cyhtb250aFN0YXJ0LCBpKTtcbiAgICAgICAgdmFyIHdlZWsgPSBnZXRXZWVrKGRhdGUsIHsgbG9jYWxlOiBsb2NhbGUgfSk7XG4gICAgICAgIGlmIChsYXN0V2Vlay53ZWVrTnVtYmVyICE9PSB3ZWVrKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgd2VlayBieSBhZGRpbmcgb3V0c2lkZSBzdGFydCBkYXlzXG4gICAgICAgICAgICB2YXIgc3RhcnREYXlzID0gZ2V0T3V0c2lkZVN0YXJ0RGF5cyhkYXRlLCB7IGxvY2FsZTogbG9jYWxlIH0pO1xuICAgICAgICAgICAgbGFzdFdlZWsgPSB7IHdlZWtOdW1iZXI6IHdlZWssIGRhdGVzOiBzdGFydERheXMgfTtcbiAgICAgICAgICAgIHdlZWtzLnB1c2gobGFzdFdlZWspO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RXZWVrLmRhdGVzLnB1c2goZGF0ZSk7XG4gICAgfVxuICAgIHZhciBsYXN0RGF5ID0gbGFzdFdlZWsuZGF0ZXNbbGFzdFdlZWsuZGF0ZXMubGVuZ3RoIC0gMV07XG4gICAgdmFyIGVuZERheXMgPSBnZXRPdXRzaWRlRW5kRGF5cyhsYXN0RGF5LCB7IGxvY2FsZTogbG9jYWxlIH0pO1xuICAgIGxhc3RXZWVrLmRhdGVzID0gbGFzdFdlZWsuZGF0ZXMuY29uY2F0KGVuZERheXMpO1xuICAgIC8vIEFkZCBleHRyYSB3ZWVrcyB0byB0aGUgbW9udGgsIHVwIHRvIDYgd2Vla3NcbiAgICBpZiAoZml4ZWRXZWVrcykge1xuICAgICAgICB2YXIgbGFzdFdlZWtEYXRlID0gbGFzdFdlZWsuZGF0ZXNbbGFzdFdlZWsuZGF0ZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHZhciB3ZWVrc0luTW9udGggPSBnZXRXZWVrc0luTW9udGgobW9udGgsIHsgbG9jYWxlOiBsb2NhbGUgfSk7XG4gICAgICAgIGlmICh3ZWVrc0luTW9udGggPCA2KSB7XG4gICAgICAgICAgICB2YXIgZGlmZkRheXMgPSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMoYWRkV2Vla3MobGFzdFdlZWtEYXRlLCA2IC0gd2Vla3NJbk1vbnRoKSwgbGFzdFdlZWtEYXRlKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlmZkRheXM7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBkYXRlID0gYWRkRGF5cyhsYXN0V2Vla0RhdGUsIGkgKyAxKTtcbiAgICAgICAgICAgICAgICB2YXIgd2VlayA9IGdldFdlZWsoZGF0ZSwgeyBsb2NhbGU6IGxvY2FsZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFdlZWsud2Vla051bWJlciAhPT0gd2Vlaykge1xuICAgICAgICAgICAgICAgICAgICBsYXN0V2VlayA9IHsgd2Vla051bWJlcjogd2VlaywgZGF0ZXM6IFtdIH07XG4gICAgICAgICAgICAgICAgICAgIHdlZWtzLnB1c2gobGFzdFdlZWspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXN0V2Vlay5kYXRlcy5wdXNoKGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3ZWVrcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldFdlZWtzLmpzLm1hcCIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VEYXlQaWNrZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0cy9EYXlQaWNrZXInO1xuaW1wb3J0IHsgZ2V0V2Vla3MgfSBmcm9tICcuL3V0aWxzL2dldFdlZWtzJztcbi8qKlxuICogUmVuZGVyIHRoZSB0YWJsZSB3aXRoIHRoZSBjYWxlbmRhci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFRhYmxlKHByb3BzKSB7XG4gICAgdmFyIF9hID0gdXNlRGF5UGlja2VyKCksIGxvY2FsZSA9IF9hLmxvY2FsZSwgY2xhc3NOYW1lcyA9IF9hLmNsYXNzTmFtZXMsIHN0eWxlcyA9IF9hLnN0eWxlcywgaGlkZUhlYWQgPSBfYS5oaWRlSGVhZCwgZml4ZWRXZWVrcyA9IF9hLmZpeGVkV2Vla3MsIF9iID0gX2EuY29tcG9uZW50cywgSGVhZCA9IF9iLkhlYWQsIFJvdyA9IF9iLlJvdywgRm9vdGVyID0gX2IuRm9vdGVyO1xuICAgIHZhciB3ZWVrcyA9IGdldFdlZWtzKHByb3BzLmRpc3BsYXlNb250aCwgeyBsb2NhbGU6IGxvY2FsZSwgZml4ZWRXZWVrczogZml4ZWRXZWVrcyB9KTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy50YWJsZSwgc3R5bGU6IHN0eWxlcy50YWJsZSwgcm9sZTogXCJncmlkXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IHByb3BzWydhcmlhLWxhYmVsbGVkYnknXSB9LFxuICAgICAgICAhaGlkZUhlYWQgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkLCBudWxsKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInRib2R5XCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLnRib2R5LCBzdHlsZTogc3R5bGVzLnRib2R5IH0sIHdlZWtzLm1hcChmdW5jdGlvbiAod2VlaykgeyByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm93LCB7IGRpc3BsYXlNb250aDogcHJvcHMuZGlzcGxheU1vbnRoLCBrZXk6IHdlZWsud2Vla051bWJlciwgZGF0ZXM6IHdlZWsuZGF0ZXMsIHdlZWtOdW1iZXI6IHdlZWsud2Vla051bWJlciB9KSk7IH0pKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChGb290ZXIsIG51bGwpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UYWJsZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUlkIH0gZnJvbSAnQHJlYWNoL2F1dG8taWQnO1xuaW1wb3J0IHsgVGFibGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL1RhYmxlJztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyB1c2VOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vLi4vY29udGV4dHMvTmF2aWdhdGlvbic7XG4vKiogUmVuZGVyIGEgbW9udGguICovXG5leHBvcnQgZnVuY3Rpb24gTW9udGgocHJvcHMpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIF9iID0gdXNlRGF5UGlja2VyKCksIGRpciA9IF9iLmRpciwgY2xhc3NOYW1lcyA9IF9iLmNsYXNzTmFtZXMsIHN0eWxlcyA9IF9iLnN0eWxlcywgQ2FwdGlvbiA9IF9iLmNvbXBvbmVudHMuQ2FwdGlvbjtcbiAgICB2YXIgZGlzcGxheU1vbnRocyA9IHVzZU5hdmlnYXRpb24oKS5kaXNwbGF5TW9udGhzO1xuICAgIHZhciBjYXB0aW9uSWQgPSB1c2VJZCgpO1xuICAgIHZhciBjbGFzc05hbWUgPSBbY2xhc3NOYW1lcy5tb250aF07XG4gICAgdmFyIHN0eWxlID0gc3R5bGVzLm1vbnRoO1xuICAgIHZhciBpc1N0YXJ0ID0gcHJvcHMuZGlzcGxheUluZGV4ID09PSAwO1xuICAgIHZhciBpc0VuZCA9IHByb3BzLmRpc3BsYXlJbmRleCA9PT0gZGlzcGxheU1vbnRocy5sZW5ndGggLSAxO1xuICAgIHZhciBpc0NlbnRlciA9ICFpc1N0YXJ0ICYmICFpc0VuZDtcbiAgICBpZiAoZGlyID09PSAncnRsJykge1xuICAgICAgICBfYSA9IFtpc1N0YXJ0LCBpc0VuZF0sIGlzRW5kID0gX2FbMF0sIGlzU3RhcnQgPSBfYVsxXTtcbiAgICB9XG4gICAgaWYgKGlzU3RhcnQpIHtcbiAgICAgICAgY2xhc3NOYW1lLnB1c2goY2xhc3NOYW1lcy5jYXB0aW9uX3N0YXJ0KTtcbiAgICAgICAgc3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGUpLCBzdHlsZXMuY2FwdGlvbl9zdGFydCk7XG4gICAgfVxuICAgIGlmIChpc0VuZCkge1xuICAgICAgICBjbGFzc05hbWUucHVzaChjbGFzc05hbWVzLmNhcHRpb25fZW5kKTtcbiAgICAgICAgc3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGUpLCBzdHlsZXMuY2FwdGlvbl9lbmQpO1xuICAgIH1cbiAgICBpZiAoaXNDZW50ZXIpIHtcbiAgICAgICAgY2xhc3NOYW1lLnB1c2goY2xhc3NOYW1lcy5jYXB0aW9uX2JldHdlZW4pO1xuICAgICAgICBzdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZSksIHN0eWxlcy5jYXB0aW9uX2JldHdlZW4pO1xuICAgIH1cbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBrZXk6IHByb3BzLmRpc3BsYXlJbmRleCwgY2xhc3NOYW1lOiBjbGFzc05hbWUuam9pbignICcpLCBzdHlsZTogc3R5bGUgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChDYXB0aW9uLCB7IGlkOiBjYXB0aW9uSWQsIGRpc3BsYXlNb250aDogcHJvcHMuZGlzcGxheU1vbnRoIH0pLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFRhYmxlLCB7IFwiYXJpYS1sYWJlbGxlZGJ5XCI6IGNhcHRpb25JZCwgZGlzcGxheU1vbnRoOiBwcm9wcy5kaXNwbGF5TW9udGggfSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1vbnRoLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTW9udGggfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL01vbnRoJztcbmltcG9ydCB7IHVzZURheVBpY2tlciB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0RheVBpY2tlcic7XG5pbXBvcnQgeyB1c2VGb2N1cyB9IGZyb20gJy4uLy4uL2NvbnRleHRzL0ZvY3VzJztcbmltcG9ydCB7IHVzZU5hdmlnYXRpb24gfSBmcm9tICcuLi8uLi9jb250ZXh0cy9OYXZpZ2F0aW9uJztcbi8qKlxuICogUmVuZGVyIHRoZSBjb250YWluZXIgd2l0aCB0aGUgbW9udGhzIGFuZCB0aGVpciBjYXB0aW9ucy4gVGhlIG51bWJlciBvZiBtb250aHNcbiAqIHJlbmRlcmVkIGRlcGVuZHMgYnkgdGhlIGBudW1iZXJPZk1vbnRoc2AgcHJvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJvb3QoKSB7XG4gICAgdmFyIF9hID0gdXNlRGF5UGlja2VyKCksIGRpciA9IF9hLmRpciwgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLCBjbGFzc05hbWVzID0gX2EuY2xhc3NOYW1lcywgc3R5bGUgPSBfYS5zdHlsZSwgc3R5bGVzID0gX2Euc3R5bGVzLCBudW1iZXJPZk1vbnRocyA9IF9hLm51bWJlck9mTW9udGhzLCBzaG93V2Vla051bWJlciA9IF9hLnNob3dXZWVrTnVtYmVyLCBpbml0aWFsRm9jdXMgPSBfYS5pbml0aWFsRm9jdXM7XG4gICAgdmFyIF9iID0gdXNlRm9jdXMoKSwgZm9jdXNUYXJnZXQgPSBfYi5mb2N1c1RhcmdldCwgZm9jdXMgPSBfYi5mb2N1cztcbiAgICB2YXIgX2MgPSBSZWFjdC51c2VTdGF0ZShmYWxzZSksIGhhc0luaXRpYWxGb2N1cyA9IF9jWzBdLCBzZXRIYXNJbml0aWFsRm9jdXMgPSBfY1sxXTtcbiAgICB2YXIgZGlzcGxheU1vbnRocyA9IHVzZU5hdmlnYXRpb24oKS5kaXNwbGF5TW9udGhzO1xuICAgIHZhciByb290Q2xhc3NOYW1lcyA9IFtjbGFzc05hbWUgIT09IG51bGwgJiYgY2xhc3NOYW1lICE9PSB2b2lkIDAgPyBjbGFzc05hbWUgOiBjbGFzc05hbWVzLnJvb3RdO1xuICAgIGlmIChudW1iZXJPZk1vbnRocyA+IDEpIHtcbiAgICAgICAgcm9vdENsYXNzTmFtZXMucHVzaChjbGFzc05hbWVzLm11bHRpcGxlX21vbnRocyk7XG4gICAgfVxuICAgIGlmIChzaG93V2Vla051bWJlcikge1xuICAgICAgICByb290Q2xhc3NOYW1lcy5wdXNoKGNsYXNzTmFtZXMud2l0aF93ZWVrbnVtYmVyKTtcbiAgICB9XG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGluaXRpYWxGb2N1cyAmJiAhaGFzSW5pdGlhbEZvY3VzICYmIGZvY3VzVGFyZ2V0KSB7XG4gICAgICAgICAgICBmb2N1cyhmb2N1c1RhcmdldCk7XG4gICAgICAgICAgICBzZXRIYXNJbml0aWFsRm9jdXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9LCBbaW5pdGlhbEZvY3VzLCBoYXNJbml0aWFsRm9jdXMsIGZvY3VzLCBmb2N1c1RhcmdldF0pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogcm9vdENsYXNzTmFtZXMuam9pbignICcpLCBzdHlsZTogX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlcy5yb290KSwgc3R5bGUpLCBkaXI6IGRpciB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLm1vbnRocywgc3R5bGU6IHN0eWxlcy5tb250aHMgfSwgZGlzcGxheU1vbnRocy5tYXAoZnVuY3Rpb24gKG1vbnRoLCBpKSB7IHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChNb250aCwgeyBrZXk6IGksIGRpc3BsYXlJbmRleDogaSwgZGlzcGxheU1vbnRoOiBtb250aCB9KSk7IH0pKSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Um9vdC5qcy5tYXAiLCJpbXBvcnQgeyBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBEYXlQaWNrZXJQcm92aWRlciB9IGZyb20gJy4vRGF5UGlja2VyJztcbmltcG9ydCB7IEZvY3VzUHJvdmlkZXIgfSBmcm9tICcuL0ZvY3VzJztcbmltcG9ydCB7IE1vZGlmaWVyc1Byb3ZpZGVyIH0gZnJvbSAnLi9Nb2RpZmllcnMnO1xuaW1wb3J0IHsgTmF2aWdhdGlvblByb3ZpZGVyIH0gZnJvbSAnLi9OYXZpZ2F0aW9uJztcbmltcG9ydCB7IFNlbGVjdE11bHRpcGxlUHJvdmlkZXIgfSBmcm9tICcuL1NlbGVjdE11bHRpcGxlJztcbmltcG9ydCB7IFNlbGVjdFJhbmdlUHJvdmlkZXIgfSBmcm9tICcuL1NlbGVjdFJhbmdlJztcbmltcG9ydCB7IFNlbGVjdFNpbmdsZVByb3ZpZGVyIH0gZnJvbSAnLi9TZWxlY3RTaW5nbGUnO1xuLyoqIFByb3ZpZGUgdGhlIHZhbHVlIGZvciBhbGwgdGhlIGNvbnRleHQgcHJvdmlkZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJvb3RQcm92aWRlcihwcm9wcykge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLCBpbml0aWFsUHJvcHMgPSBfX3Jlc3QocHJvcHMsIFtcImNoaWxkcmVuXCJdKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRGF5UGlja2VyUHJvdmlkZXIsIHsgaW5pdGlhbFByb3BzOiBpbml0aWFsUHJvcHMgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChOYXZpZ2F0aW9uUHJvdmlkZXIsIG51bGwsXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdFNpbmdsZVByb3ZpZGVyLCB7IGluaXRpYWxQcm9wczogaW5pdGlhbFByb3BzIH0sXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3RNdWx0aXBsZVByb3ZpZGVyLCB7IGluaXRpYWxQcm9wczogaW5pdGlhbFByb3BzIH0sXG4gICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VsZWN0UmFuZ2VQcm92aWRlciwgeyBpbml0aWFsUHJvcHM6IGluaXRpYWxQcm9wcyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChNb2RpZmllcnNQcm92aWRlciwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEZvY3VzUHJvdmlkZXIsIG51bGwsIGNoaWxkcmVuKSkpKSkpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Sb290UHJvdmlkZXIuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSb290IH0gZnJvbSAnLi9jb21wb25lbnRzL1Jvb3QnO1xuaW1wb3J0IHsgUm9vdFByb3ZpZGVyIH0gZnJvbSAnLi9jb250ZXh0cy9Sb290UHJvdmlkZXInO1xuLyoqXG4gKiBEYXlQaWNrZXIgcmVuZGVyIGEgZGF0ZSBwaWNrZXIgY29tcG9uZW50IHRvIGxldCB1c2VycyBwaWNrIGRhdGVzIGZyb20gYVxuICogY2FsZW5kYXIuIFNlZSBodHRwOi8vcmVhY3QtZGF5LXBpY2tlci5qcy5vcmcgZm9yIHVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBhbmRcbiAqIGV4YW1wbGVzLlxuICpcbiAqICMjIyBDdXN0b21pemF0aW9uXG4gKlxuICogRGF5UGlja2VyIG9mZmVycyBkaWZmZXJlbnQgY3VzdG9taXphdGlvbiBwcm9wcy4gRm9yIGV4YW1wbGUsXG4gKlxuICogLSBzaG93IG11bHRpcGxlIG1vbnRocyB1c2luZyBgbnVtYmVyT2ZNb250aHNgXG4gKiAtIGRpc3BsYXkgYSBkcm9wZG93biB0byBuYXZpZ2F0ZSB0aGUgbW9udGhzIHZpYSBgY2FwdGlvbkxheW91dGBcbiAqIC0gZGlzcGxheSB0aGUgd2VlayBudW1iZXJzIHdpdGggYHNob3dXZWVrTnVtYmVyc2BcbiAqIC0gZGlzYWJsZSBvciBoaWRlIGRheXMgd2l0aCBgZGlzYWJsZWRgIG9yIGBoaWRkZW5gXG4gKlxuICogIyMjIENvbnRyb2xsaW5nIHRoZSBtb250aHNcbiAqXG4gKiBDaGFuZ2UgdGhlIGluaXRpYWxseSBkaXNwbGF5ZWQgbW9udGggdXNpbmcgdGhlIGBkZWZhdWx0TW9udGhgIHByb3AuIFRoZVxuICogZGlzcGxheWVkIG1vbnRocyBhcmUgY29udHJvbGxlZCBieSBEYXlQaWNrZXIgYW5kIHN0b3JlZCBpbiBpdHMgaW50ZXJuYWxcbiAqIHN0YXRlLiBUbyBjb250cm9sIHRoZSBtb250aHMgeW91cnNlbGYsIHVzZSBgbW9udGhgIGluc3RlYWQgb2YgYGRlZmF1bHRNb250aGBcbiAqIGFuZCB1c2UgdGhlIGBvbk1vbnRoQ2hhbmdlYCBldmVudCB0byBzZXQgaXQuXG4gKlxuICogVG8gbGltaXQgdGhlIG1vbnRocyB0aGUgdXNlciBjYW4gbmF2aWdhdGUgdG8sIHVzZVxuICogYGZyb21EYXRlYC9gZnJvbU1vbnRoYC9gZnJvbVllYXJgIG9yIGB0b0RhdGVgL2B0b01vbnRoYC9gdG9ZZWFyYC5cbiAqXG4gKiAjIyMgU2VsZWN0aW9uIG1vZGVzXG4gKlxuICogRGF5UGlja2VyIHN1cHBvcnRzIGRpZmZlcmVudCBzZWxlY3Rpb24gbW9kZSB0aGF0IGNhbiBiZSB0b2dnbGVkIHVzaW5nIHRoZVxuICogYG1vZGVgIHByb3A6XG4gKlxuICogLSBgbW9kZT1cInNpbmdsZVwiYDogb25seSBvbmUgZGF5IGNhbiBiZSBzZWxlY3RlZC4gVXNlIGByZXF1aXJlZGAgdG8gbWFrZSB0aGVcbiAqICAgc2VsZWN0aW9uIHJlcXVpcmVkLiBVc2UgdGhlIGBvblNlbGVjdGAgZXZlbnQgaGFuZGxlciB0byBnZXQgdGhlIHNlbGVjdGVkXG4gKiAgIGRheXMuXG4gKiAtIGBtb2RlPVwibXVsdGlwbGVcImA6IHVzZXJzIGNhbiBzZWxlY3Qgb25lIG9yIG1vcmUgZGF5cy4gTGltaXQgdGhlIGFtb3VudCBvZlxuICogICBkYXlzIHRoYXQgY2FuIGJlIHNlbGVjdGVkIHdpdGggdGhlIGBtaW5gIG9yIHRoZSBgbWF4YCBwcm9wcy5cbiAqIC0gYG1vZGU9XCJyYW5nZVwiYDogdXNlcnMgY2FuIHNlbGVjdCBhIHJhbmdlIG9mIGRheXMuIExpbWl0IHRoZSBhbW91bnQgb2YgZGF5c1xuICogICBpbiB0aGUgcmFuZ2Ugd2l0aCB0aGUgYG1pbmAgb3IgdGhlIGBtYXhgIHByb3BzLlxuICogLSBgbW9kZT1cImN1c3RvbVwiYDogaW1wbGVtZW50IHlvdXIgb3duIHNlbGVjdGlvbiBtb2RlIHdpdGggYG9uRGF5Q2xpY2tgLlxuICpcbiAqIFRoZXNlIHNlbGVjdGlvbiBtb2RlcyBzaG91bGQgY292ZXIgdGhlIG1vc3QgY29tbW9uIHVzZSBjYXNlcy4gSW4gY2FzZSB5b3VcbiAqIG5lZWQgYSBtb3JlIHJlZmluZWQgd2F5IG9mIHNlbGVjdGluZyBkYXlzLCB1c2UgYG1vZGU9XCJjdXN0b21cImAuIFVzZSB0aGVcbiAqIGBzZWxlY3RlZGAgcHJvcHMgYW5kIGFkZCB0aGUgZGF5IGV2ZW50IGhhbmRsZXJzIHRvIGFkZC9yZW1vdmUgZGF5cyBmcm9tIHRoZVxuICogc2VsZWN0aW9uLlxuICpcbiAqICMjIyBNb2RpZmllcnNcbiAqXG4gKiBBIF9tb2RpZmllcl8gcmVwcmVzZW50cyBkaWZmZXJlbnQgc3R5bGVzIG9yIHN0YXRlcyBmb3IgdGhlIGRheXMgZGlzcGxheWVkIGluXG4gKiB0aGUgY2FsZW5kYXIgKGxpa2UgXCJzZWxlY3RlZFwiIG9yIFwiZGlzYWJsZWRcIikuIERlZmluZSBjdXN0b20gbW9kaWZpZXJzIHVzaW5nXG4gKiB0aGUgYG1vZGlmaWVyc2AgcHJvcC5cbiAqXG4gKiAjIyMgRm9ybWF0dGVycyBhbmQgY3VzdG9tIGNvbXBvbmVudFxuICpcbiAqIFlvdSBjYW4gY3VzdG9taXplIGhvdyB0aGUgY29udGVudCBpcyBkaXNwbGF5ZWQgaW4gdGhlIGRhdGUgcGlja2VyIGJ5IHVzaW5nXG4gKiBlaXRoZXIgdGhlIGZvcm1hdHRlcnMgb3IgcmVwbGFjaW5nIHRoZSBpbnRlcm5hbCBjb21wb25lbnRzLlxuICpcbiAqIEZvciB0aGUgbW9zdCBjb21tb24gY2FzZXMgeW91IHdhbnQgdG8gdXNlIHRoZSBgZm9ybWF0dGVyc2AgcHJvcCB0byBjaGFuZ2UgaG93XG4gKiB0aGUgY29udGVudCBpcyBmb3JtYXR0ZWQgaW4gdGhlIGNhbGVuZGFyLiBVc2UgdGhlIGBjb21wb25lbnRzYCBwcm9wIHRvXG4gKiByZXBsYWNlIHRoZSBpbnRlcm5hbCBjb21wb25lbnRzLCBsaWtlIHRoZSBuYXZpZ2F0aW9uIGljb25zLlxuICpcbiAqICMjIyBTdHlsaW5nXG4gKlxuICogRGF5UGlja2VyIGNvbWVzIHdpdGggYSBkZWZhdWx0LCBiYXNpYyBzdHlsZSBpbiBgcmVhY3QtZGF5LXBpY2tlci9zdHlsZWAg4oCTIHVzZVxuICogaXQgYXMgdGVtcGxhdGUgZm9yIHlvdXIgb3duIHN0eWxlLlxuICpcbiAqIElmIHlvdSBhcmUgdXNpbmcgQ1NTIG1vZHVsZXMsIHBhc3MgdGhlIGltcG9ydGVkIHN0eWxlcyBvYmplY3QgdGhlXG4gKiBgY2xhc3NOYW1lc2AgcHJvcHMuXG4gKlxuICogWW91IGNhbiBhbHNvIHN0eWxlIHRoZSBlbGVtZW50cyB2aWEgaW5saW5lLXN0eWxlcyB1c2luZyB0aGUgYHN0eWxlc2AgcHJvcC5cbiAqXG4gKiAjIyMgRm9ybSBmaWVsZHNcbiAqXG4gKiBJZiB5b3UgbmVlZCB0byBiaW5kIHRoZSBkYXRlIHBpY2tlciB0byBhIGZvcm0gZmllbGQsIHlvdSBjYW4gdXNlIHRoZVxuICogYHVzZUlucHV0YCBob29rcyBmb3IgYSBiYXNpYyBiZWhhdmlvci4gU2VlIHRoZSBgdXNlSW5wdXRgIHNvdXJjZSBhcyBhblxuICogZXhhbXBsZSB0byBiaW5kIHRoZSBkYXRlIHBpY2tlciB3aXRoIGZvcm0gZmllbGRzLlxuICpcbiAqICMjIyBMb2NhbGl6YXRpb25cbiAqXG4gKiBUbyBsb2NhbGl6ZSBEYXlQaWNrZXIsIGltcG9ydCB0aGUgbG9jYWxlIGZyb20gYGRhdGUtZm5zYCBwYWNrYWdlIGFuZCB1c2UgdGhlXG4gKiBgbG9jYWxlYCBwcm9wLlxuICpcbiAqIEZvciBleGFtcGxlLCB0byB1c2UgU3BhbmlzaCBsb2NhbGU6XG4gKlxuICogYGBgXG4gKiBpbXBvcnQgZXMgZnJvbSAnZGF0ZS1mbnMvbG9jYWxlL2VzJztcbiAqIDxEYXlQaWNrZXIgbG9jYWxlPXtlc30gLz5cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gRGF5UGlja2VyKHByb3BzKSB7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFJvb3RQcm92aWRlciwgX19hc3NpZ24oe30sIHByb3BzKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChSb290LCBudWxsKSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF5UGlja2VyLmpzLm1hcCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxuLyoqXG4gKiBUYWtlcyBhbiBhcmd1bWVudCBhbmQgaWYgaXQncyBhbiBhcnJheSwgcmV0dXJucyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgYXJyYXksXG4gKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgYXJndW1lbnQuIFVzZWQgZm9yIFByZWFjdCBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgdmFyIHVud3JhcEFycmF5ID0gZnVuY3Rpb24gdW53cmFwQXJyYXkoYXJnKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyZykgPyBhcmdbMF0gOiBhcmc7XG59O1xuLyoqXG4gKiBUYWtlcyBhIG1heWJlLXVuZGVmaW5lZCBmdW5jdGlvbiBhbmQgYXJiaXRyYXJ5IGFyZ3MgYW5kIGludm9rZXMgdGhlIGZ1bmN0aW9uXG4gKiBvbmx5IGlmIGl0IGlzIGRlZmluZWQuXG4gKi9cblxuZXhwb3J0IHZhciBzYWZlSW52b2tlID0gZnVuY3Rpb24gc2FmZUludm9rZShmbikge1xuICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuLmFwcGx5KHZvaWQgMCwgYXJncyk7XG4gIH1cbn07XG4vKipcbiAqIFNldHMgYSByZWYgdXNpbmcgZWl0aGVyIGEgcmVmIGNhbGxiYWNrIG9yIGEgcmVmIG9iamVjdFxuICovXG5cbmV4cG9ydCB2YXIgc2V0UmVmID0gZnVuY3Rpb24gc2V0UmVmKHJlZiwgbm9kZSkge1xuICAvLyBpZiBpdHMgYSBmdW5jdGlvbiBjYWxsIGl0XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNhZmVJbnZva2UocmVmLCBub2RlKTtcbiAgfSAvLyBvdGhlcndpc2Ugd2Ugc2hvdWxkIHRyZWF0IGl0IGFzIGEgcmVmIG9iamVjdFxuICBlbHNlIGlmIChyZWYgIT0gbnVsbCkge1xuICAgICAgcmVmLmN1cnJlbnQgPSBub2RlO1xuICAgIH1cbn07XG4vKipcbiAqIFNpbXBsZSBwb255ZmlsbCBmb3IgT2JqZWN0LmZyb21FbnRyaWVzXG4gKi9cblxuZXhwb3J0IHZhciBmcm9tRW50cmllcyA9IGZ1bmN0aW9uIGZyb21FbnRyaWVzKGVudHJpZXMpIHtcbiAgcmV0dXJuIGVudHJpZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIF9yZWYpIHtcbiAgICB2YXIga2V5ID0gX3JlZlswXSxcbiAgICAgICAgdmFsdWUgPSBfcmVmWzFdO1xuICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xufTtcbi8qKlxuICogU21hbGwgd3JhcHBlciBhcm91bmQgYHVzZUxheW91dEVmZmVjdGAgdG8gZ2V0IHJpZCBvZiB0aGUgd2FybmluZyBvbiBTU1IgZW52c1xuICovXG5cbmV4cG9ydCB2YXIgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCA/IFJlYWN0LnVzZUxheW91dEVmZmVjdCA6IFJlYWN0LnVzZUVmZmVjdDsiLCJleHBvcnQgdmFyIHRvcCA9ICd0b3AnO1xuZXhwb3J0IHZhciBib3R0b20gPSAnYm90dG9tJztcbmV4cG9ydCB2YXIgcmlnaHQgPSAncmlnaHQnO1xuZXhwb3J0IHZhciBsZWZ0ID0gJ2xlZnQnO1xuZXhwb3J0IHZhciBhdXRvID0gJ2F1dG8nO1xuZXhwb3J0IHZhciBiYXNlUGxhY2VtZW50cyA9IFt0b3AsIGJvdHRvbSwgcmlnaHQsIGxlZnRdO1xuZXhwb3J0IHZhciBzdGFydCA9ICdzdGFydCc7XG5leHBvcnQgdmFyIGVuZCA9ICdlbmQnO1xuZXhwb3J0IHZhciBjbGlwcGluZ1BhcmVudHMgPSAnY2xpcHBpbmdQYXJlbnRzJztcbmV4cG9ydCB2YXIgdmlld3BvcnQgPSAndmlld3BvcnQnO1xuZXhwb3J0IHZhciBwb3BwZXIgPSAncG9wcGVyJztcbmV4cG9ydCB2YXIgcmVmZXJlbmNlID0gJ3JlZmVyZW5jZSc7XG5leHBvcnQgdmFyIHZhcmlhdGlvblBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovYmFzZVBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9bXS5jb25jYXQoYmFzZVBsYWNlbWVudHMsIFthdXRvXSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50LCBwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pOyAvLyBtb2RpZmllcnMgdGhhdCBuZWVkIHRvIHJlYWQgdGhlIERPTVxuXG5leHBvcnQgdmFyIGJlZm9yZVJlYWQgPSAnYmVmb3JlUmVhZCc7XG5leHBvcnQgdmFyIHJlYWQgPSAncmVhZCc7XG5leHBvcnQgdmFyIGFmdGVyUmVhZCA9ICdhZnRlclJlYWQnOyAvLyBwdXJlLWxvZ2ljIG1vZGlmaWVyc1xuXG5leHBvcnQgdmFyIGJlZm9yZU1haW4gPSAnYmVmb3JlTWFpbic7XG5leHBvcnQgdmFyIG1haW4gPSAnbWFpbic7XG5leHBvcnQgdmFyIGFmdGVyTWFpbiA9ICdhZnRlck1haW4nOyAvLyBtb2RpZmllciB3aXRoIHRoZSBwdXJwb3NlIHRvIHdyaXRlIHRvIHRoZSBET00gKG9yIHdyaXRlIGludG8gYSBmcmFtZXdvcmsgc3RhdGUpXG5cbmV4cG9ydCB2YXIgYmVmb3JlV3JpdGUgPSAnYmVmb3JlV3JpdGUnO1xuZXhwb3J0IHZhciB3cml0ZSA9ICd3cml0ZSc7XG5leHBvcnQgdmFyIGFmdGVyV3JpdGUgPSAnYWZ0ZXJXcml0ZSc7XG5leHBvcnQgdmFyIG1vZGlmaWVyUGhhc2VzID0gW2JlZm9yZVJlYWQsIHJlYWQsIGFmdGVyUmVhZCwgYmVmb3JlTWFpbiwgbWFpbiwgYWZ0ZXJNYWluLCBiZWZvcmVXcml0ZSwgd3JpdGUsIGFmdGVyV3JpdGVdOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVOYW1lKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyAoZWxlbWVudC5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA6IG51bGw7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93KG5vZGUpIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICBpZiAobm9kZS50b1N0cmluZygpICE9PSAnW29iamVjdCBXaW5kb3ddJykge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHJldHVybiBvd25lckRvY3VtZW50ID8gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3cgOiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5FbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5IVE1MRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNTaGFkb3dSb290KG5vZGUpIHtcbiAgLy8gSUUgMTEgaGFzIG5vIFNoYWRvd1Jvb3RcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLlNoYWRvd1Jvb3Q7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbn1cblxuZXhwb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfTsiLCJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4uL2RvbS11dGlscy9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiOyAvLyBUaGlzIG1vZGlmaWVyIHRha2VzIHRoZSBzdHlsZXMgcHJlcGFyZWQgYnkgdGhlIGBjb21wdXRlU3R5bGVzYCBtb2RpZmllclxuLy8gYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUgSFRNTEVsZW1lbnRzIHN1Y2ggYXMgcG9wcGVyIGFuZCBhcnJvd1xuXG5mdW5jdGlvbiBhcHBseVN0eWxlcyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGU7XG4gIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIHN0eWxlID0gc3RhdGUuc3R5bGVzW25hbWVdIHx8IHt9O1xuICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdOyAvLyBhcnJvdyBpcyBvcHRpb25hbCArIHZpcnR1YWwgZWxlbWVudHNcblxuICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZsb3cgZG9lc24ndCBzdXBwb3J0IHRvIGV4dGVuZCB0aGlzIHByb3BlcnR5LCBidXQgaXQncyB0aGUgbW9zdFxuICAgIC8vIGVmZmVjdGl2ZSB3YXkgdG8gYXBwbHkgc3R5bGVzIHRvIGFuIEhUTUxFbGVtZW50XG4gICAgLy8gJEZsb3dGaXhNZVtjYW5ub3Qtd3JpdGVdXG5cblxuICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNbbmFtZV07XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSA9PT0gdHJ1ZSA/ICcnIDogdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlO1xuICB2YXIgaW5pdGlhbFN0eWxlcyA9IHtcbiAgICBwb3BwZXI6IHtcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgbGVmdDogJzAnLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICBtYXJnaW46ICcwJ1xuICAgIH0sXG4gICAgYXJyb3c6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgfSxcbiAgICByZWZlcmVuY2U6IHt9XG4gIH07XG4gIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMucG9wcGVyLnN0eWxlLCBpbml0aWFsU3R5bGVzLnBvcHBlcik7XG4gIHN0YXRlLnN0eWxlcyA9IGluaXRpYWxTdHlsZXM7XG5cbiAgaWYgKHN0YXRlLmVsZW1lbnRzLmFycm93KSB7XG4gICAgT2JqZWN0LmFzc2lnbihzdGF0ZS5lbGVtZW50cy5hcnJvdy5zdHlsZSwgaW5pdGlhbFN0eWxlcy5hcnJvdyk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIE9iamVjdC5rZXlzKHN0YXRlLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdO1xuICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzdGF0ZS5hdHRyaWJ1dGVzW25hbWVdIHx8IHt9O1xuICAgICAgdmFyIHN0eWxlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHN0YXRlLnN0eWxlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHN0YXRlLnN0eWxlc1tuYW1lXSA6IGluaXRpYWxTdHlsZXNbbmFtZV0pOyAvLyBTZXQgYWxsIHZhbHVlcyB0byBhbiBlbXB0eSBzdHJpbmcgdG8gdW5zZXQgdGhlbVxuXG4gICAgICB2YXIgc3R5bGUgPSBzdHlsZVByb3BlcnRpZXMucmVkdWNlKGZ1bmN0aW9uIChzdHlsZSwgcHJvcGVydHkpIHtcbiAgICAgICAgc3R5bGVbcHJvcGVydHldID0gJyc7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgIH0sIHt9KTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICAgIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogYXBwbHlTdHlsZXMsXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ11cbn07IiwiaW1wb3J0IHsgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzBdO1xufSIsImV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciByb3VuZCA9IE1hdGgucm91bmQ7IiwiaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBpbmNsdWRlU2NhbGUpIHtcbiAgaWYgKGluY2x1ZGVTY2FsZSA9PT0gdm9pZCAwKSB7XG4gICAgaW5jbHVkZVNjYWxlID0gZmFsc2U7XG4gIH1cblxuICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzY2FsZVggPSAxO1xuICB2YXIgc2NhbGVZID0gMTtcblxuICBpZiAoaXNIVE1MRWxlbWVudChlbGVtZW50KSAmJiBpbmNsdWRlU2NhbGUpIHtcbiAgICB2YXIgb2Zmc2V0SGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgdmFyIG9mZnNldFdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDsgLy8gRG8gbm90IGF0dGVtcHQgdG8gZGl2aWRlIGJ5IDAsIG90aGVyd2lzZSB3ZSBnZXQgYEluZmluaXR5YCBhcyBzY2FsZVxuICAgIC8vIEZhbGxiYWNrIHRvIDEgaW4gY2FzZSBib3RoIHZhbHVlcyBhcmUgYDBgXG5cbiAgICBpZiAob2Zmc2V0V2lkdGggPiAwKSB7XG4gICAgICBzY2FsZVggPSByb3VuZChyZWN0LndpZHRoKSAvIG9mZnNldFdpZHRoIHx8IDE7XG4gICAgfVxuXG4gICAgaWYgKG9mZnNldEhlaWdodCA+IDApIHtcbiAgICAgIHNjYWxlWSA9IHJvdW5kKHJlY3QuaGVpZ2h0KSAvIG9mZnNldEhlaWdodCB8fCAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHJlY3Qud2lkdGggLyBzY2FsZVgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodCAvIHNjYWxlWSxcbiAgICB0b3A6IHJlY3QudG9wIC8gc2NhbGVZLFxuICAgIHJpZ2h0OiByZWN0LnJpZ2h0IC8gc2NhbGVYLFxuICAgIGJvdHRvbTogcmVjdC5ib3R0b20gLyBzY2FsZVksXG4gICAgbGVmdDogcmVjdC5sZWZ0IC8gc2NhbGVYLFxuICAgIHg6IHJlY3QubGVmdCAvIHNjYWxlWCxcbiAgICB5OiByZWN0LnRvcCAvIHNjYWxlWVxuICB9O1xufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7IC8vIFJldHVybnMgdGhlIGxheW91dCByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC4gTGF5b3V0XG4vLyBtZWFucyBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRyYW5zZm9ybXMuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudCkge1xuICB2YXIgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTsgLy8gVXNlIHRoZSBjbGllbnRSZWN0IHNpemVzIGlmIGl0J3Mgbm90IGJlZW4gdHJhbnNmb3JtZWQuXG4gIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTIyM1xuXG4gIHZhciB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC53aWR0aCAtIHdpZHRoKSA8PSAxKSB7XG4gICAgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3QuaGVpZ2h0IC0gaGVpZ2h0KSA8PSAxKSB7XG4gICAgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn0iLCJpbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIHZhciByb290Tm9kZSA9IGNoaWxkLmdldFJvb3ROb2RlICYmIGNoaWxkLmdldFJvb3ROb2RlKCk7IC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcblxuICBpZiAocGFyZW50LmNvbnRhaW5zKGNoaWxkKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIHRoZW4gZmFsbGJhY2sgdG8gY3VzdG9tIGltcGxlbWVudGF0aW9uIHdpdGggU2hhZG93IERPTSBzdXBwb3J0XG4gIGVsc2UgaWYgKHJvb3ROb2RlICYmIGlzU2hhZG93Um9vdChyb290Tm9kZSkpIHtcbiAgICAgIHZhciBuZXh0ID0gY2hpbGQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG5leHQgJiYgcGFyZW50LmlzU2FtZU5vZGUobmV4dCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ106IG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzLi4uXG5cblxuICAgICAgICBuZXh0ID0gbmV4dC5wYXJlbnROb2RlIHx8IG5leHQuaG9zdDtcbiAgICAgIH0gd2hpbGUgKG5leHQpO1xuICAgIH0gLy8gR2l2ZSB1cCwgdGhlIHJlc3VsdCBpcyBmYWxzZVxuXG5cbiAgcmV0dXJuIGZhbHNlO1xufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldFdpbmRvdyhlbGVtZW50KS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xufSIsImltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoZWxlbWVudCkpID49IDA7XG59IiwiaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICByZXR1cm4gKChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50Lm93bmVyRG9jdW1lbnQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgZWxlbWVudC5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG59IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSB7XG4gIGlmIChnZXROb2RlTmFtZShlbGVtZW50KSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gKC8vIHRoaXMgaXMgYSBxdWlja2VyIChidXQgbGVzcyB0eXBlIHNhZmUpIHdheSB0byBzYXZlIHF1aXRlIHNvbWUgYnl0ZXMgZnJvbSB0aGUgYnVuZGxlXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXVxuICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgIGVsZW1lbnQuYXNzaWduZWRTbG90IHx8IC8vIHN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlXG4gICAgZWxlbWVudC5wYXJlbnROb2RlIHx8ICggLy8gRE9NIEVsZW1lbnQgZGV0ZWN0ZWRcbiAgICBpc1NoYWRvd1Jvb3QoZWxlbWVudCkgPyBlbGVtZW50Lmhvc3QgOiBudWxsKSB8fCAvLyBTaGFkb3dSb290IGRldGVjdGVkXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IEhUTUxFbGVtZW50IGlzIGEgTm9kZVxuICAgIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSAvLyBmYWxsYmFja1xuXG4gICk7XG59IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBpc1RhYmxlRWxlbWVudCBmcm9tIFwiLi9pc1RhYmxlRWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvODM3XG4gIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn0gLy8gYC5vZmZzZXRQYXJlbnRgIHJlcG9ydHMgYG51bGxgIGZvciBmaXhlZCBlbGVtZW50cywgd2hpbGUgYWJzb2x1dGUgZWxlbWVudHNcbi8vIHJldHVybiB0aGUgY29udGFpbmluZyBibG9ja1xuXG5cbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB7XG4gIHZhciBpc0ZpcmVmb3ggPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZmlyZWZveCcpICE9PSAtMTtcbiAgdmFyIGlzSUUgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1RyaWRlbnQnKSAhPT0gLTE7XG5cbiAgaWYgKGlzSUUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIEluIElFIDksIDEwIGFuZCAxMSBmaXhlZCBlbGVtZW50cyBjb250YWluaW5nIGJsb2NrIGlzIGFsd2F5cyBlc3RhYmxpc2hlZCBieSB0aGUgdmlld3BvcnRcbiAgICB2YXIgZWxlbWVudENzcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG5cbiAgICBpZiAoZWxlbWVudENzcy5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgWydodG1sJywgJ2JvZHknXS5pbmRleE9mKGdldE5vZGVOYW1lKGN1cnJlbnROb2RlKSkgPCAwKSB7XG4gICAgdmFyIGNzcyA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudE5vZGUpOyAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgICAvLyBjcmVhdGUgYSBjb250YWluaW5nIGJsb2NrLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG5cbiAgICBpZiAoY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IGNzcy5jb250YWluID09PSAncGFpbnQnIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5kZXhPZihjc3Mud2lsbENoYW5nZSkgIT09IC0xIHx8IGlzRmlyZWZveCAmJiBjc3Mud2lsbENoYW5nZSA9PT0gJ2ZpbHRlcicgfHwgaXNGaXJlZm94ICYmIGNzcy5maWx0ZXIgJiYgY3NzLmZpbHRlciAhPT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdodG1sJyB8fCBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luZG93O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSA+PSAwID8gJ3gnIDogJ3knO1xufSIsImltcG9ydCB7IG1heCBhcyBtYXRoTWF4LCBtaW4gYXMgbWF0aE1pbiB9IGZyb20gXCIuL21hdGguanNcIjtcbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KSB7XG4gIHJldHVybiBtYXRoTWF4KG1pbiwgbWF0aE1pbih2YWx1ZSwgbWF4KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gd2l0aGluTWF4Q2xhbXAobWluLCB2YWx1ZSwgbWF4KSB7XG4gIHZhciB2ID0gd2l0aGluKG1pbiwgdmFsdWUsIG1heCk7XG4gIHJldHVybiB2ID4gbWF4ID8gbWF4IDogdjtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRGcmVzaFNpZGVPYmplY3QoKSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwXG4gIH07XG59IiwiaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi9nZXRGcmVzaFNpZGVPYmplY3QuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlUGFkZGluZ09iamVjdChwYWRkaW5nT2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBnZXRGcmVzaFNpZGVPYmplY3QoKSwgcGFkZGluZ09iamVjdCk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhwYW5kVG9IYXNoTWFwKHZhbHVlLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAoaGFzaE1hcCwga2V5KSB7XG4gICAgaGFzaE1hcFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGhhc2hNYXA7XG4gIH0sIHt9KTtcbn0iLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4uL2RvbS11dGlscy9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4gfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuLi91dGlscy9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4uL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qc1wiO1xuaW1wb3J0IHsgbGVmdCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB0b3AsIGJvdHRvbSB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciB0b1BhZGRpbmdPYmplY3QgPSBmdW5jdGlvbiB0b1BhZGRpbmdPYmplY3QocGFkZGluZywgc3RhdGUpIHtcbiAgcGFkZGluZyA9IHR5cGVvZiBwYWRkaW5nID09PSAnZnVuY3Rpb24nID8gcGFkZGluZyhPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHBhZGRpbmc7XG4gIHJldHVybiBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpO1xufTtcblxuZnVuY3Rpb24gYXJyb3coX3JlZikge1xuICB2YXIgX3N0YXRlJG1vZGlmaWVyc0RhdGEkO1xuXG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgaXNWZXJ0aWNhbCA9IFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwO1xuICB2YXIgbGVuID0gaXNWZXJ0aWNhbCA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICBpZiAoIWFycm93RWxlbWVudCB8fCAhcG9wcGVyT2Zmc2V0cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gdG9QYWRkaW5nT2JqZWN0KG9wdGlvbnMucGFkZGluZywgc3RhdGUpO1xuICB2YXIgYXJyb3dSZWN0ID0gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpO1xuICB2YXIgbWluUHJvcCA9IGF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gIHZhciBtYXhQcm9wID0gYXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gIHZhciBlbmREaWZmID0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2xlbl0gKyBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc10gLSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucG9wcGVyW2xlbl07XG4gIHZhciBzdGFydERpZmYgPSBwb3BwZXJPZmZzZXRzW2F4aXNdIC0gc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdO1xuICB2YXIgYXJyb3dPZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoYXJyb3dFbGVtZW50KTtcbiAgdmFyIGNsaWVudFNpemUgPSBhcnJvd09mZnNldFBhcmVudCA/IGF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMCA6IDA7XG4gIHZhciBjZW50ZXJUb1JlZmVyZW5jZSA9IGVuZERpZmYgLyAyIC0gc3RhcnREaWZmIC8gMjsgLy8gTWFrZSBzdXJlIHRoZSBhcnJvdyBkb2Vzbid0IG92ZXJmbG93IHRoZSBwb3BwZXIgaWYgdGhlIGNlbnRlciBwb2ludCBpc1xuICAvLyBvdXRzaWRlIG9mIHRoZSBwb3BwZXIgYm91bmRzXG5cbiAgdmFyIG1pbiA9IHBhZGRpbmdPYmplY3RbbWluUHJvcF07XG4gIHZhciBtYXggPSBjbGllbnRTaXplIC0gYXJyb3dSZWN0W2xlbl0gLSBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICB2YXIgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd1JlY3RbbGVuXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgdmFyIG9mZnNldCA9IHdpdGhpbihtaW4sIGNlbnRlciwgbWF4KTsgLy8gUHJldmVudHMgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy4uLlxuXG4gIHZhciBheGlzUHJvcCA9IGF4aXM7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSAoX3N0YXRlJG1vZGlmaWVyc0RhdGEkID0ge30sIF9zdGF0ZSRtb2RpZmllcnNEYXRhJFtheGlzUHJvcF0gPSBvZmZzZXQsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJC5jZW50ZXJPZmZzZXQgPSBvZmZzZXQgLSBjZW50ZXIsIF9zdGF0ZSRtb2RpZmllcnNEYXRhJCk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudCxcbiAgICAgIGFycm93RWxlbWVudCA9IF9vcHRpb25zJGVsZW1lbnQgPT09IHZvaWQgMCA/ICdbZGF0YS1wb3BwZXItYXJyb3ddJyA6IF9vcHRpb25zJGVsZW1lbnQ7XG5cbiAgaWYgKGFycm93RWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIENTUyBzZWxlY3RvclxuXG5cbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmICghaXNIVE1MRWxlbWVudChhcnJvd0VsZW1lbnQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBcImFycm93XCIgZWxlbWVudCBtdXN0IGJlIGFuIEhUTUxFbGVtZW50IChub3QgYW4gU1ZHRWxlbWVudCkuJywgJ1RvIHVzZSBhbiBTVkcgYXJyb3csIHdyYXAgaXQgaW4gYW4gSFRNTEVsZW1lbnQgdGhhdCB3aWxsIGJlIHVzZWQgYXMnLCAndGhlIGFycm93LiddLmpvaW4oJyAnKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb250YWlucyhzdGF0ZS5lbGVtZW50cy5wb3BwZXIsIGFycm93RWxlbWVudCkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBcImFycm93XCIgbW9kaWZpZXJcXCdzIGBlbGVtZW50YCBtdXN0IGJlIGEgY2hpbGQgb2YgdGhlIHBvcHBlcicsICdlbGVtZW50LiddLmpvaW4oJyAnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3RhdGUuZWxlbWVudHMuYXJyb3cgPSBhcnJvd0VsZW1lbnQ7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdhcnJvdycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBhcnJvdyxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIHJlcXVpcmVzOiBbJ3BvcHBlck9mZnNldHMnXSxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXVxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcbn0iLCJpbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20sIGVuZCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHVuc2V0U2lkZXMgPSB7XG4gIHRvcDogJ2F1dG8nLFxuICByaWdodDogJ2F1dG8nLFxuICBib3R0b206ICdhdXRvJyxcbiAgbGVmdDogJ2F1dG8nXG59OyAvLyBSb3VuZCB0aGUgb2Zmc2V0cyB0byB0aGUgbmVhcmVzdCBzdWl0YWJsZSBzdWJwaXhlbCBiYXNlZCBvbiB0aGUgRFBSLlxuLy8gWm9vbWluZyBjYW4gY2hhbmdlIHRoZSBEUFIsIGJ1dCBpdCBzZWVtcyB0byByZXBvcnQgYSB2YWx1ZSB0aGF0IHdpbGxcbi8vIGNsZWFubHkgZGl2aWRlIHRoZSB2YWx1ZXMgaW50byB0aGUgYXBwcm9wcmlhdGUgc3VicGl4ZWxzLlxuXG5mdW5jdGlvbiByb3VuZE9mZnNldHNCeURQUihfcmVmKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueTtcbiAgdmFyIHdpbiA9IHdpbmRvdztcbiAgdmFyIGRwciA9IHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiB7XG4gICAgeDogcm91bmQoeCAqIGRwcikgLyBkcHIgfHwgMCxcbiAgICB5OiByb3VuZCh5ICogZHByKSAvIGRwciB8fCAwXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1N0eWxlcyhfcmVmMikge1xuICB2YXIgX09iamVjdCRhc3NpZ24yO1xuXG4gIHZhciBwb3BwZXIgPSBfcmVmMi5wb3BwZXIsXG4gICAgICBwb3BwZXJSZWN0ID0gX3JlZjIucG9wcGVyUmVjdCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYyLnBsYWNlbWVudCxcbiAgICAgIHZhcmlhdGlvbiA9IF9yZWYyLnZhcmlhdGlvbixcbiAgICAgIG9mZnNldHMgPSBfcmVmMi5vZmZzZXRzLFxuICAgICAgcG9zaXRpb24gPSBfcmVmMi5wb3NpdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9yZWYyLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGFkYXB0aXZlID0gX3JlZjIuYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHMgPSBfcmVmMi5yb3VuZE9mZnNldHMsXG4gICAgICBpc0ZpeGVkID0gX3JlZjIuaXNGaXhlZDtcbiAgdmFyIF9vZmZzZXRzJHggPSBvZmZzZXRzLngsXG4gICAgICB4ID0gX29mZnNldHMkeCA9PT0gdm9pZCAwID8gMCA6IF9vZmZzZXRzJHgsXG4gICAgICBfb2Zmc2V0cyR5ID0gb2Zmc2V0cy55LFxuICAgICAgeSA9IF9vZmZzZXRzJHkgPT09IHZvaWQgMCA/IDAgOiBfb2Zmc2V0cyR5O1xuXG4gIHZhciBfcmVmMyA9IHR5cGVvZiByb3VuZE9mZnNldHMgPT09ICdmdW5jdGlvbicgPyByb3VuZE9mZnNldHMoe1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9KSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjMueDtcbiAgeSA9IF9yZWYzLnk7XG4gIHZhciBoYXNYID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneCcpO1xuICB2YXIgaGFzWSA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3knKTtcbiAgdmFyIHNpZGVYID0gbGVmdDtcbiAgdmFyIHNpZGVZID0gdG9wO1xuICB2YXIgd2luID0gd2luZG93O1xuXG4gIGlmIChhZGFwdGl2ZSkge1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKTtcbiAgICB2YXIgaGVpZ2h0UHJvcCA9ICdjbGllbnRIZWlnaHQnO1xuICAgIHZhciB3aWR0aFByb3AgPSAnY2xpZW50V2lkdGgnO1xuXG4gICAgaWYgKG9mZnNldFBhcmVudCA9PT0gZ2V0V2luZG93KHBvcHBlcikpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IGdldERvY3VtZW50RWxlbWVudChwb3BwZXIpO1xuXG4gICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uICE9PSAnc3RhdGljJyAmJiBwb3NpdGlvbiA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgICBoZWlnaHRQcm9wID0gJ3Njcm9sbEhlaWdodCc7XG4gICAgICAgIHdpZHRoUHJvcCA9ICdzY3JvbGxXaWR0aCc7XG4gICAgICB9XG4gICAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYXN0XTogZm9yY2UgdHlwZSByZWZpbmVtZW50LCB3ZSBjb21wYXJlIG9mZnNldFBhcmVudCB3aXRoIHdpbmRvdyBhYm92ZSwgYnV0IEZsb3cgZG9lc24ndCBkZXRlY3QgaXRcblxuXG4gICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50O1xuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gdG9wIHx8IChwbGFjZW1lbnQgPT09IGxlZnQgfHwgcGxhY2VtZW50ID09PSByaWdodCkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVZID0gYm90dG9tO1xuICAgICAgdmFyIG9mZnNldFkgPSBpc0ZpeGVkICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFtoZWlnaHRQcm9wXTtcbiAgICAgIHkgLT0gb2Zmc2V0WSAtIHBvcHBlclJlY3QuaGVpZ2h0O1xuICAgICAgeSAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCAocGxhY2VtZW50ID09PSB0b3AgfHwgcGxhY2VtZW50ID09PSBib3R0b20pICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWCA9IHJpZ2h0O1xuICAgICAgdmFyIG9mZnNldFggPSBpc0ZpeGVkICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC53aWR0aCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W3dpZHRoUHJvcF07XG4gICAgICB4IC09IG9mZnNldFggLSBwb3BwZXJSZWN0LndpZHRoO1xuICAgICAgeCAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9LCBhZGFwdGl2ZSAmJiB1bnNldFNpZGVzKTtcblxuICB2YXIgX3JlZjQgPSByb3VuZE9mZnNldHMgPT09IHRydWUgPyByb3VuZE9mZnNldHNCeURQUih7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0pIDoge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xuXG4gIHggPSBfcmVmNC54O1xuICB5ID0gX3JlZjQueTtcblxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uKSB7XG4gICAgdmFyIF9PYmplY3QkYXNzaWduO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduID0ge30sIF9PYmplY3QkYXNzaWduW3NpZGVZXSA9IGhhc1kgPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ25bc2lkZVhdID0gaGFzWCA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbi50cmFuc2Zvcm0gPSAod2luLmRldmljZVBpeGVsUmF0aW8gfHwgMSkgPD0gMSA/IFwidHJhbnNsYXRlKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgpXCIgOiBcInRyYW5zbGF0ZTNkKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgsIDApXCIsIF9PYmplY3QkYXNzaWduKSk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCAoX09iamVjdCRhc3NpZ24yID0ge30sIF9PYmplY3QkYXNzaWduMltzaWRlWV0gPSBoYXNZID8geSArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjJbc2lkZVhdID0gaGFzWCA/IHggKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yLnRyYW5zZm9ybSA9ICcnLCBfT2JqZWN0JGFzc2lnbjIpKTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0eWxlcyhfcmVmNSkge1xuICB2YXIgc3RhdGUgPSBfcmVmNS5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmNS5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID0gb3B0aW9ucy5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRncHVBY2NlbGVyYXQsXG4gICAgICBfb3B0aW9ucyRhZGFwdGl2ZSA9IG9wdGlvbnMuYWRhcHRpdmUsXG4gICAgICBhZGFwdGl2ZSA9IF9vcHRpb25zJGFkYXB0aXZlID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWRhcHRpdmUsXG4gICAgICBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPSBvcHRpb25zLnJvdW5kT2Zmc2V0cyxcbiAgICAgIHJvdW5kT2Zmc2V0cyA9IF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJvdW5kT2Zmc2V0cztcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgdmFyIHRyYW5zaXRpb25Qcm9wZXJ0eSA9IGdldENvbXB1dGVkU3R5bGUoc3RhdGUuZWxlbWVudHMucG9wcGVyKS50cmFuc2l0aW9uUHJvcGVydHkgfHwgJyc7XG5cbiAgICBpZiAoYWRhcHRpdmUgJiYgWyd0cmFuc2Zvcm0nLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10uc29tZShmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICAgIHJldHVybiB0cmFuc2l0aW9uUHJvcGVydHkuaW5kZXhPZihwcm9wZXJ0eSkgPj0gMDtcbiAgICB9KSkge1xuICAgICAgY29uc29sZS53YXJuKFsnUG9wcGVyOiBEZXRlY3RlZCBDU1MgdHJhbnNpdGlvbnMgb24gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcnLCAnQ1NTIHByb3BlcnRpZXM6IFwidHJhbnNmb3JtXCIsIFwidG9wXCIsIFwicmlnaHRcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIuJywgJ1xcblxcbicsICdEaXNhYmxlIHRoZSBcImNvbXB1dGVTdHlsZXNcIiBtb2RpZmllclxcJ3MgYGFkYXB0aXZlYCBvcHRpb24gdG8gYWxsb3cnLCAnZm9yIHNtb290aCB0cmFuc2l0aW9ucywgb3IgcmVtb3ZlIHRoZXNlIHByb3BlcnRpZXMgZnJvbSB0aGUgQ1NTJywgJ3RyYW5zaXRpb24gZGVjbGFyYXRpb24gb24gdGhlIHBvcHBlciBlbGVtZW50IGlmIG9ubHkgdHJhbnNpdGlvbmluZycsICdvcGFjaXR5IG9yIGJhY2tncm91bmQtY29sb3IgZm9yIGV4YW1wbGUuJywgJ1xcblxcbicsICdXZSByZWNvbW1lbmQgdXNpbmcgdGhlIHBvcHBlciBlbGVtZW50IGFzIGEgd3JhcHBlciBhcm91bmQgYW4gaW5uZXInLCAnZWxlbWVudCB0aGF0IGNhbiBoYXZlIGFueSBDU1MgcHJvcGVydHkgdHJhbnNpdGlvbmVkIGZvciBhbmltYXRpb25zLiddLmpvaW4oJyAnKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IHtcbiAgICBwbGFjZW1lbnQ6IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KSxcbiAgICB2YXJpYXRpb246IGdldFZhcmlhdGlvbihzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHBvcHBlcjogc3RhdGUuZWxlbWVudHMucG9wcGVyLFxuICAgIHBvcHBlclJlY3Q6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBncHVBY2NlbGVyYXRpb246IGdwdUFjY2VsZXJhdGlvbixcbiAgICBpc0ZpeGVkOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnXG4gIH07XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyAhPSBudWxsKSB7XG4gICAgc3RhdGUuc3R5bGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5wb3BwZXIsIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywge1xuICAgICAgb2Zmc2V0czogc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLFxuICAgICAgcG9zaXRpb246IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBhZGFwdGl2ZTogYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5hcnJvdyAhPSBudWxsKSB7XG4gICAgc3RhdGUuc3R5bGVzLmFycm93ID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3R5bGVzLmFycm93LCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3csXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGFkYXB0aXZlOiBmYWxzZSxcbiAgICAgIHJvdW5kT2Zmc2V0czogcm91bmRPZmZzZXRzXG4gICAgfSkpKTtcbiAgfVxuXG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICAnZGF0YS1wb3BwZXItcGxhY2VtZW50Jzogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnY29tcHV0ZVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnYmVmb3JlV3JpdGUnLFxuICBmbjogY29tcHV0ZVN0eWxlcyxcbiAgZGF0YToge31cbn07IiwiaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldFdpbmRvdy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbnZhciBwYXNzaXZlID0ge1xuICBwYXNzaXZlOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBlZmZlY3QoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJHNjcm9sbCA9IG9wdGlvbnMuc2Nyb2xsLFxuICAgICAgc2Nyb2xsID0gX29wdGlvbnMkc2Nyb2xsID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkc2Nyb2xsLFxuICAgICAgX29wdGlvbnMkcmVzaXplID0gb3B0aW9ucy5yZXNpemUsXG4gICAgICByZXNpemUgPSBfb3B0aW9ucyRyZXNpemUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRyZXNpemU7XG4gIHZhciB3aW5kb3cgPSBnZXRXaW5kb3coc3RhdGUuZWxlbWVudHMucG9wcGVyKTtcbiAgdmFyIHNjcm9sbFBhcmVudHMgPSBbXS5jb25jYXQoc3RhdGUuc2Nyb2xsUGFyZW50cy5yZWZlcmVuY2UsIHN0YXRlLnNjcm9sbFBhcmVudHMucG9wcGVyKTtcblxuICBpZiAoc2Nyb2xsKSB7XG4gICAgc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JvbGxQYXJlbnQpIHtcbiAgICAgIHNjcm9sbFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKHJlc2l6ZSkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc2Nyb2xsKSB7XG4gICAgICBzY3JvbGxQYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKHNjcm9sbFBhcmVudCkge1xuICAgICAgICBzY3JvbGxQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXNpemUpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgIH1cbiAgfTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2V2ZW50TGlzdGVuZXJzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICd3cml0ZScsXG4gIGZuOiBmdW5jdGlvbiBmbigpIHt9LFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgZGF0YToge31cbn07IiwidmFyIGhhc2ggPSB7XG4gIGxlZnQ6ICdyaWdodCcsXG4gIHJpZ2h0OiAnbGVmdCcsXG4gIGJvdHRvbTogJ3RvcCcsXG4gIHRvcDogJ2JvdHRvbSdcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaFttYXRjaGVkXTtcbiAgfSk7XG59IiwidmFyIGhhc2ggPSB7XG4gIHN0YXJ0OiAnZW5kJyxcbiAgZW5kOiAnc3RhcnQnXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvc3RhcnR8ZW5kL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGwobm9kZSkge1xuICB2YXIgd2luID0gZ2V0V2luZG93KG5vZGUpO1xuICB2YXIgc2Nyb2xsTGVmdCA9IHdpbi5wYWdlWE9mZnNldDtcbiAgdmFyIHNjcm9sbFRvcCA9IHdpbi5wYWdlWU9mZnNldDtcbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBzY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wXG4gIH07XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSB7XG4gIC8vIElmIDxodG1sPiBoYXMgYSBDU1Mgd2lkdGggZ3JlYXRlciB0aGFuIHRoZSB2aWV3cG9ydCwgdGhlbiB0aGlzIHdpbGwgYmVcbiAgLy8gaW5jb3JyZWN0IGZvciBSVEwuXG4gIC8vIFBvcHBlciAxIGlzIGJyb2tlbiBpbiB0aGlzIGNhc2UgYW5kIG5ldmVyIGhhZCBhIGJ1ZyByZXBvcnQgc28gbGV0J3MgYXNzdW1lXG4gIC8vIGl0J3Mgbm90IGFuIGlzc3VlLiBJIGRvbid0IHRoaW5rIGFueW9uZSBldmVyIHNwZWNpZmllcyB3aWR0aCBvbiA8aHRtbD5cbiAgLy8gYW55d2F5LlxuICAvLyBCcm93c2VycyB3aGVyZSB0aGUgbGVmdCBzY3JvbGxiYXIgZG9lc24ndCBjYXVzZSBhbiBpc3N1ZSByZXBvcnQgYDBgIGZvclxuICAvLyB0aGlzIChlLmcuIEVkZ2UgMjAxOSwgSUUxMSwgU2FmYXJpKVxuICByZXR1cm4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkubGVmdCArIGdldFdpbmRvd1Njcm9sbChlbGVtZW50KS5zY3JvbGxMZWZ0O1xufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB2aXN1YWxWaWV3cG9ydCA9IHdpbi52aXN1YWxWaWV3cG9ydDtcbiAgdmFyIHdpZHRoID0gaHRtbC5jbGllbnRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGh0bWwuY2xpZW50SGVpZ2h0O1xuICB2YXIgeCA9IDA7XG4gIHZhciB5ID0gMDsgLy8gTkI6IFRoaXMgaXNuJ3Qgc3VwcG9ydGVkIG9uIGlPUyA8PSAxMi4gSWYgdGhlIGtleWJvYXJkIGlzIG9wZW4sIHRoZSBwb3BwZXJcbiAgLy8gY2FuIGJlIG9ic2N1cmVkIHVuZGVybmVhdGggaXQuXG4gIC8vIEFsc28sIGBodG1sLmNsaWVudEhlaWdodGAgYWRkcyB0aGUgYm90dG9tIGJhciBoZWlnaHQgaW4gU2FmYXJpIGlPUywgZXZlblxuICAvLyBpZiBpdCBpc24ndCBvcGVuLCBzbyBpZiB0aGlzIGlzbid0IGF2YWlsYWJsZSwgdGhlIHBvcHBlciB3aWxsIGJlIGRldGVjdGVkXG4gIC8vIHRvIG92ZXJmbG93IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiB0b28gZWFybHkuXG5cbiAgaWYgKHZpc3VhbFZpZXdwb3J0KSB7XG4gICAgd2lkdGggPSB2aXN1YWxWaWV3cG9ydC53aWR0aDtcbiAgICBoZWlnaHQgPSB2aXN1YWxWaWV3cG9ydC5oZWlnaHQ7IC8vIFVzZXMgTGF5b3V0IFZpZXdwb3J0IChsaWtlIENocm9tZTsgU2FmYXJpIGRvZXMgbm90IGN1cnJlbnRseSlcbiAgICAvLyBJbiBDaHJvbWUsIGl0IHJldHVybnMgYSB2YWx1ZSB2ZXJ5IGNsb3NlIHRvIDAgKCsvLSkgYnV0IGNvbnRhaW5zIHJvdW5kaW5nXG4gICAgLy8gZXJyb3JzIGR1ZSB0byBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHByZWNpc2lvbi5cbiAgICAvLyBTYWZhcmkgcmV0dXJucyBhIG51bWJlciA8PSAwLCB1c3VhbGx5IDwgLTEgd2hlbiBwaW5jaC16b29tZWRcbiAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmYWlscyBpbiBtb2JpbGUgZW11bGF0aW9uIG1vZGUgaW4gQ2hyb21lLlxuICAgIC8vIE1hdGguYWJzKHdpbi5pbm5lcldpZHRoIC8gdmlzdWFsVmlld3BvcnQuc2NhbGUgLSB2aXN1YWxWaWV3cG9ydC53aWR0aCkgPFxuICAgIC8vIDAuMDAxXG4gICAgLy8gRmFsbGJhY2sgaGVyZTogXCJOb3QgU2FmYXJpXCIgdXNlckFnZW50XG5cbiAgICBpZiAoIS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgIHggPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0O1xuICAgICAgeSA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSxcbiAgICB5OiB5XG4gIH07XG59IiwiaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgeyBtYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBHZXRzIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgc2Nyb2xsYWJsZSBkb2N1bWVudCBhcmVhLCBldmVuIGV4dGVuZGluZyBvdXRzaWRlXG4vLyBvZiB0aGUgYDxodG1sPmAgYW5kIGA8Ym9keT5gIHJlY3QgYm91bmRzIGlmIGhvcml6b250YWxseSBzY3JvbGxhYmxlXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERvY3VtZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB3aW5TY3JvbGwgPSBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5O1xuICB2YXIgd2lkdGggPSBtYXgoaHRtbC5zY3JvbGxXaWR0aCwgaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuc2Nyb2xsV2lkdGggOiAwLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApO1xuICB2YXIgaGVpZ2h0ID0gbWF4KGh0bWwuc2Nyb2xsSGVpZ2h0LCBodG1sLmNsaWVudEhlaWdodCwgYm9keSA/IGJvZHkuc2Nyb2xsSGVpZ2h0IDogMCwgYm9keSA/IGJvZHkuY2xpZW50SGVpZ2h0IDogMCk7XG4gIHZhciB4ID0gLXdpblNjcm9sbC5zY3JvbGxMZWZ0ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KTtcbiAgdmFyIHkgPSAtd2luU2Nyb2xsLnNjcm9sbFRvcDtcblxuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShib2R5IHx8IGh0bWwpLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICB4ICs9IG1heChodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApIC0gd2lkdGg7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1Njcm9sbFBhcmVudChlbGVtZW50KSB7XG4gIC8vIEZpcmVmb3ggd2FudHMgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcbiAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSxcbiAgICAgIG92ZXJmbG93ID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1gsXG4gICAgICBvdmVyZmxvd1kgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1k7XG5cbiAgcmV0dXJuIC9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbi8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCk7XG59IiwiaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQobm9kZSkge1xuICBpZiAoWydodG1sJywgJ2JvZHknLCAnI2RvY3VtZW50J10uaW5kZXhPZihnZXROb2RlTmFtZShub2RlKSkgPj0gMCkge1xuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBpZiAoaXNIVE1MRWxlbWVudChub2RlKSAmJiBpc1Njcm9sbFBhcmVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChnZXRQYXJlbnROb2RlKG5vZGUpKTtcbn0iLCJpbXBvcnQgZ2V0U2Nyb2xsUGFyZW50IGZyb20gXCIuL2dldFNjcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuLypcbmdpdmVuIGEgRE9NIGVsZW1lbnQsIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc2Nyb2xsIHBhcmVudHMsIHVwIHRoZSBsaXN0IG9mIGFuY2Vzb3JzXG51bnRpbCB3ZSBnZXQgdG8gdGhlIHRvcCB3aW5kb3cgb2JqZWN0LiBUaGlzIGxpc3QgaXMgd2hhdCB3ZSBhdHRhY2ggc2Nyb2xsIGxpc3RlbmVyc1xudG8sIGJlY2F1c2UgaWYgYW55IG9mIHRoZXNlIHBhcmVudCBlbGVtZW50cyBzY3JvbGwsIHdlJ2xsIG5lZWQgdG8gcmUtY2FsY3VsYXRlIHRoZVxucmVmZXJlbmNlIGVsZW1lbnQncyBwb3NpdGlvbi5cbiovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RTY3JvbGxQYXJlbnRzKGVsZW1lbnQsIGxpc3QpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICBpZiAobGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgbGlzdCA9IFtdO1xuICB9XG5cbiAgdmFyIHNjcm9sbFBhcmVudCA9IGdldFNjcm9sbFBhcmVudChlbGVtZW50KTtcbiAgdmFyIGlzQm9keSA9IHNjcm9sbFBhcmVudCA9PT0gKChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keSk7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsUGFyZW50KTtcbiAgdmFyIHRhcmdldCA9IGlzQm9keSA/IFt3aW5dLmNvbmNhdCh3aW4udmlzdWFsVmlld3BvcnQgfHwgW10sIGlzU2Nyb2xsUGFyZW50KHNjcm9sbFBhcmVudCkgPyBzY3JvbGxQYXJlbnQgOiBbXSkgOiBzY3JvbGxQYXJlbnQ7XG4gIHZhciB1cGRhdGVkTGlzdCA9IGxpc3QuY29uY2F0KHRhcmdldCk7XG4gIHJldHVybiBpc0JvZHkgPyB1cGRhdGVkTGlzdCA6IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhbGxdOiBpc0JvZHkgdGVsbHMgdXMgdGFyZ2V0IHdpbGwgYmUgYW4gSFRNTEVsZW1lbnQgaGVyZVxuICB1cGRhdGVkTGlzdC5jb25jYXQobGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZSh0YXJnZXQpKSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVjdFRvQ2xpZW50UmVjdChyZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCByZWN0LCB7XG4gICAgbGVmdDogcmVjdC54LFxuICAgIHRvcDogcmVjdC55LFxuICAgIHJpZ2h0OiByZWN0LnggKyByZWN0LndpZHRoLFxuICAgIGJvdHRvbTogcmVjdC55ICsgcmVjdC5oZWlnaHRcbiAgfSk7XG59IiwiaW1wb3J0IHsgdmlld3BvcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRWaWV3cG9ydFJlY3QgZnJvbSBcIi4vZ2V0Vmlld3BvcnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRSZWN0IGZyb20gXCIuL2dldERvY3VtZW50UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2xpc3RTY3JvbGxQYXJlbnRzLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgY29udGFpbnMgZnJvbSBcIi4vY29udGFpbnMuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSBcIi4uL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IG1heCwgbWluIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTtcbiAgcmVjdC50b3AgPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50VG9wO1xuICByZWN0LmxlZnQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7XG4gIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3Qud2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LmhlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnggPSByZWN0LmxlZnQ7XG4gIHJlY3QueSA9IHJlY3QudG9wO1xuICByZXR1cm4gcmVjdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQpIHtcbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50ID09PSB2aWV3cG9ydCA/IHJlY3RUb0NsaWVudFJlY3QoZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQpKSA6IGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgPyBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChjbGlwcGluZ1BhcmVudCkgOiByZWN0VG9DbGllbnRSZWN0KGdldERvY3VtZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpKTtcbn0gLy8gQSBcImNsaXBwaW5nIHBhcmVudFwiIGlzIGFuIG92ZXJmbG93YWJsZSBjb250YWluZXIgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWMgb2Zcbi8vIGNsaXBwaW5nIChvciBoaWRpbmcpIG92ZXJmbG93aW5nIGVsZW1lbnRzIHdpdGggYSBwb3NpdGlvbiBkaWZmZXJlbnQgZnJvbVxuLy8gYGluaXRpYWxgXG5cblxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIHtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUoZWxlbWVudCkpO1xuICB2YXIgY2FuRXNjYXBlQ2xpcHBpbmcgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ10uaW5kZXhPZihnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uKSA+PSAwO1xuICB2YXIgY2xpcHBlckVsZW1lbnQgPSBjYW5Fc2NhcGVDbGlwcGluZyAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpID8gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIDogZWxlbWVudDtcblxuICBpZiAoIWlzRWxlbWVudChjbGlwcGVyRWxlbWVudCkpIHtcbiAgICByZXR1cm4gW107XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzE0MTRcblxuXG4gIHJldHVybiBjbGlwcGluZ1BhcmVudHMuZmlsdGVyKGZ1bmN0aW9uIChjbGlwcGluZ1BhcmVudCkge1xuICAgIHJldHVybiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpICYmIGNvbnRhaW5zKGNsaXBwaW5nUGFyZW50LCBjbGlwcGVyRWxlbWVudCkgJiYgZ2V0Tm9kZU5hbWUoY2xpcHBpbmdQYXJlbnQpICE9PSAnYm9keSc7XG4gIH0pO1xufSAvLyBHZXRzIHRoZSBtYXhpbXVtIGFyZWEgdGhhdCB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIGR1ZSB0byBhbnkgbnVtYmVyIG9mXG4vLyBjbGlwcGluZyBwYXJlbnRzXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q2xpcHBpbmdSZWN0KGVsZW1lbnQsIGJvdW5kYXJ5LCByb290Qm91bmRhcnkpIHtcbiAgdmFyIG1haW5DbGlwcGluZ1BhcmVudHMgPSBib3VuZGFyeSA9PT0gJ2NsaXBwaW5nUGFyZW50cycgPyBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkgOiBbXS5jb25jYXQoYm91bmRhcnkpO1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gW10uY29uY2F0KG1haW5DbGlwcGluZ1BhcmVudHMsIFtyb290Qm91bmRhcnldKTtcbiAgdmFyIGZpcnN0Q2xpcHBpbmdQYXJlbnQgPSBjbGlwcGluZ1BhcmVudHNbMF07XG4gIHZhciBjbGlwcGluZ1JlY3QgPSBjbGlwcGluZ1BhcmVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2NSZWN0LCBjbGlwcGluZ1BhcmVudCkge1xuICAgIHZhciByZWN0ID0gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQpO1xuICAgIGFjY1JlY3QudG9wID0gbWF4KHJlY3QudG9wLCBhY2NSZWN0LnRvcCk7XG4gICAgYWNjUmVjdC5yaWdodCA9IG1pbihyZWN0LnJpZ2h0LCBhY2NSZWN0LnJpZ2h0KTtcbiAgICBhY2NSZWN0LmJvdHRvbSA9IG1pbihyZWN0LmJvdHRvbSwgYWNjUmVjdC5ib3R0b20pO1xuICAgIGFjY1JlY3QubGVmdCA9IG1heChyZWN0LmxlZnQsIGFjY1JlY3QubGVmdCk7XG4gICAgcmV0dXJuIGFjY1JlY3Q7XG4gIH0sIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGZpcnN0Q2xpcHBpbmdQYXJlbnQpKTtcbiAgY2xpcHBpbmdSZWN0LndpZHRoID0gY2xpcHBpbmdSZWN0LnJpZ2h0IC0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC5oZWlnaHQgPSBjbGlwcGluZ1JlY3QuYm90dG9tIC0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgY2xpcHBpbmdSZWN0LnggPSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LnkgPSBjbGlwcGluZ1JlY3QudG9wO1xuICByZXR1cm4gY2xpcHBpbmdSZWN0O1xufSIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBzdGFydCwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciByZWZlcmVuY2UgPSBfcmVmLnJlZmVyZW5jZSxcbiAgICAgIGVsZW1lbnQgPSBfcmVmLmVsZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQgPyBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50ID8gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgY29tbW9uWCA9IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoIC8gMiAtIGVsZW1lbnQud2lkdGggLyAyO1xuICB2YXIgY29tbW9uWSA9IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodCAvIDIgLSBlbGVtZW50LmhlaWdodCAvIDI7XG4gIHZhciBvZmZzZXRzO1xuXG4gIHN3aXRjaCAoYmFzZVBsYWNlbWVudCkge1xuICAgIGNhc2UgdG9wOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgLSBlbGVtZW50LmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBib3R0b206XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgcmlnaHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBsZWZ0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBlbGVtZW50LndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG5cbiAgdmFyIG1haW5BeGlzID0gYmFzZVBsYWNlbWVudCA/IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KSA6IG51bGw7XG5cbiAgaWYgKG1haW5BeGlzICE9IG51bGwpIHtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHN3aXRjaCAodmFyaWF0aW9uKSB7XG4gICAgICBjYXNlIHN0YXJ0OlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdIC0gKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBlbmQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gKyAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRzO1xufSIsImltcG9ydCBnZXRDbGlwcGluZ1JlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRDbGlwcGluZ1JlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi9jb21wdXRlT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSBcIi4vcmVjdFRvQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IHsgY2xpcHBpbmdQYXJlbnRzLCByZWZlcmVuY2UsIHBvcHBlciwgYm90dG9tLCB0b3AsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdmlld3BvcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuLi9kb20tdXRpbHMvaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IG1lcmdlUGFkZGluZ09iamVjdCBmcm9tIFwiLi9tZXJnZVBhZGRpbmdPYmplY3QuanNcIjtcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSBcIi4vZXhwYW5kVG9IYXNoTWFwLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBfb3B0aW9ucyRwbGFjZW1lbnQgPSBfb3B0aW9ucy5wbGFjZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfb3B0aW9ucyRwbGFjZW1lbnQgPT09IHZvaWQgMCA/IHN0YXRlLnBsYWNlbWVudCA6IF9vcHRpb25zJHBsYWNlbWVudCxcbiAgICAgIF9vcHRpb25zJGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICBib3VuZGFyeSA9IF9vcHRpb25zJGJvdW5kYXJ5ID09PSB2b2lkIDAgPyBjbGlwcGluZ1BhcmVudHMgOiBfb3B0aW9ucyRib3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9PT0gdm9pZCAwID8gdmlld3BvcnQgOiBfb3B0aW9ucyRyb290Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRlbGVtZW50Q29udGUgPSBfb3B0aW9ucy5lbGVtZW50Q29udGV4dCxcbiAgICAgIGVsZW1lbnRDb250ZXh0ID0gX29wdGlvbnMkZWxlbWVudENvbnRlID09PSB2b2lkIDAgPyBwb3BwZXIgOiBfb3B0aW9ucyRlbGVtZW50Q29udGUsXG4gICAgICBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9IF9vcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zJHBhZGRpbmcgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRwYWRkaW5nO1xuICB2YXIgcGFkZGluZ09iamVjdCA9IG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG4gIHZhciBhbHRDb250ZXh0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHJlZmVyZW5jZSA6IHBvcHBlcjtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbYWx0Qm91bmRhcnkgPyBhbHRDb250ZXh0IDogZWxlbWVudENvbnRleHRdO1xuICB2YXIgY2xpcHBpbmdDbGllbnRSZWN0ID0gZ2V0Q2xpcHBpbmdSZWN0KGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQgOiBlbGVtZW50LmNvbnRleHRFbGVtZW50IHx8IGdldERvY3VtZW50RWxlbWVudChzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5KTtcbiAgdmFyIHJlZmVyZW5jZUNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qoc3RhdGUuZWxlbWVudHMucmVmZXJlbmNlKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiByZWZlcmVuY2VDbGllbnRSZWN0LFxuICAgIGVsZW1lbnQ6IHBvcHBlclJlY3QsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgfSk7XG4gIHZhciBwb3BwZXJDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdChPYmplY3QuYXNzaWduKHt9LCBwb3BwZXJSZWN0LCBwb3BwZXJPZmZzZXRzKSk7XG4gIHZhciBlbGVtZW50Q2xpZW50UmVjdCA9IGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgPyBwb3BwZXJDbGllbnRSZWN0IDogcmVmZXJlbmNlQ2xpZW50UmVjdDsgLy8gcG9zaXRpdmUgPSBvdmVyZmxvd2luZyB0aGUgY2xpcHBpbmcgcmVjdFxuICAvLyAwIG9yIG5lZ2F0aXZlID0gd2l0aGluIHRoZSBjbGlwcGluZyByZWN0XG5cbiAgdmFyIG92ZXJmbG93T2Zmc2V0cyA9IHtcbiAgICB0b3A6IGNsaXBwaW5nQ2xpZW50UmVjdC50b3AgLSBlbGVtZW50Q2xpZW50UmVjdC50b3AgKyBwYWRkaW5nT2JqZWN0LnRvcCxcbiAgICBib3R0b206IGVsZW1lbnRDbGllbnRSZWN0LmJvdHRvbSAtIGNsaXBwaW5nQ2xpZW50UmVjdC5ib3R0b20gKyBwYWRkaW5nT2JqZWN0LmJvdHRvbSxcbiAgICBsZWZ0OiBjbGlwcGluZ0NsaWVudFJlY3QubGVmdCAtIGVsZW1lbnRDbGllbnRSZWN0LmxlZnQgKyBwYWRkaW5nT2JqZWN0LmxlZnQsXG4gICAgcmlnaHQ6IGVsZW1lbnRDbGllbnRSZWN0LnJpZ2h0IC0gY2xpcHBpbmdDbGllbnRSZWN0LnJpZ2h0ICsgcGFkZGluZ09iamVjdC5yaWdodFxuICB9O1xuICB2YXIgb2Zmc2V0RGF0YSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0OyAvLyBPZmZzZXRzIGNhbiBiZSBhcHBsaWVkIG9ubHkgdG8gdGhlIHBvcHBlciBlbGVtZW50XG5cbiAgaWYgKGVsZW1lbnRDb250ZXh0ID09PSBwb3BwZXIgJiYgb2Zmc2V0RGF0YSkge1xuICAgIHZhciBvZmZzZXQgPSBvZmZzZXREYXRhW3BsYWNlbWVudF07XG4gICAgT2JqZWN0LmtleXMob3ZlcmZsb3dPZmZzZXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBtdWx0aXBseSA9IFtyaWdodCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/IDEgOiAtMTtcbiAgICAgIHZhciBheGlzID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/ICd5JyA6ICd4JztcbiAgICAgIG92ZXJmbG93T2Zmc2V0c1trZXldICs9IG9mZnNldFtheGlzXSAqIG11bHRpcGx5O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG92ZXJmbG93T2Zmc2V0cztcbn0iLCJpbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgdmFyaWF0aW9uUGxhY2VtZW50cywgYmFzZVBsYWNlbWVudHMsIHBsYWNlbWVudHMgYXMgYWxsUGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPSBfb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPT09IHZvaWQgMCA/IGFsbFBsYWNlbWVudHMgOiBfb3B0aW9ucyRhbGxvd2VkQXV0b1A7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KTtcbiAgdmFyIHBsYWNlbWVudHMgPSB2YXJpYXRpb24gPyBmbGlwVmFyaWF0aW9ucyA/IHZhcmlhdGlvblBsYWNlbWVudHMgOiB2YXJpYXRpb25QbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSB2YXJpYXRpb247XG4gIH0pIDogYmFzZVBsYWNlbWVudHM7XG4gIHZhciBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWxsb3dlZEF1dG9QbGFjZW1lbnRzLmluZGV4T2YocGxhY2VtZW50KSA+PSAwO1xuICB9KTtcblxuICBpZiAoYWxsb3dlZFBsYWNlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogVGhlIGBhbGxvd2VkQXV0b1BsYWNlbWVudHNgIG9wdGlvbiBkaWQgbm90IGFsbG93IGFueScsICdwbGFjZW1lbnRzLiBFbnN1cmUgdGhlIGBwbGFjZW1lbnRgIG9wdGlvbiBtYXRjaGVzIHRoZSB2YXJpYXRpb24nLCAnb2YgdGhlIGFsbG93ZWQgcGxhY2VtZW50cy4nLCAnRm9yIGV4YW1wbGUsIFwiYXV0b1wiIGNhbm5vdCBiZSB1c2VkIHRvIGFsbG93IFwiYm90dG9tLXN0YXJ0XCIuJywgJ1VzZSBcImF1dG8tc3RhcnRcIiBpbnN0ZWFkLiddLmpvaW4oJyAnKSk7XG4gICAgfVxuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdOiBGbG93IHNlZW1zIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCB0d28gYXJyYXkgdW5pb25zLi4uXG5cblxuICB2YXIgb3ZlcmZsb3dzID0gYWxsb3dlZFBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSlbZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpXTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdmVyZmxvd3MpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dzW2FdIC0gb3ZlcmZsb3dzW2JdO1xuICB9KTtcbn0iLCJpbXBvcnQgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVBdXRvUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgYm90dG9tLCB0b3AsIHN0YXJ0LCByaWdodCwgbGVmdCwgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGlmIChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgb3Bwb3NpdGVQbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICByZXR1cm4gW2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksIG9wcG9zaXRlUGxhY2VtZW50LCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChvcHBvc2l0ZVBsYWNlbWVudCldO1xufVxuXG5mdW5jdGlvbiBmbGlwKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzID0gb3B0aW9ucy5mYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPSBvcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRmbGlwVmFyaWF0aW8sXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBvcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cztcbiAgdmFyIHByZWZlcnJlZFBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcbiAgdmFyIGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwVmFyaWF0aW9ucyA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHByZWZlcnJlZFBsYWNlbWVudCkpO1xuICB2YXIgcGxhY2VtZW50cyA9IFtwcmVmZXJyZWRQbGFjZW1lbnRdLmNvbmNhdChmYWxsYmFja1BsYWNlbWVudHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8gPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9uczogZmxpcFZhcmlhdGlvbnMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IGFsbG93ZWRBdXRvUGxhY2VtZW50c1xuICAgIH0pIDogcGxhY2VtZW50KTtcbiAgfSwgW10pO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBjaGVja3NNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBtYWtlRmFsbGJhY2tDaGVja3MgPSB0cnVlO1xuICB2YXIgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50c1swXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcGxhY2VtZW50c1tpXTtcblxuICAgIHZhciBfYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICAgIHZhciBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIHZhciBpc1ZlcnRpY2FsID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKF9iYXNlUGxhY2VtZW50KSA+PSAwO1xuICAgIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pO1xuICAgIHZhciBtYWluVmFyaWF0aW9uU2lkZSA9IGlzVmVydGljYWwgPyBpc1N0YXJ0VmFyaWF0aW9uID8gcmlnaHQgOiBsZWZ0IDogaXNTdGFydFZhcmlhdGlvbiA/IGJvdHRvbSA6IHRvcDtcblxuICAgIGlmIChyZWZlcmVuY2VSZWN0W2xlbl0gPiBwb3BwZXJSZWN0W2xlbl0pIHtcbiAgICAgIG1haW5WYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIH1cblxuICAgIHZhciBhbHRWYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIHZhciBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tfYmFzZVBsYWNlbWVudF0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICByZXR1cm4gY2hlY2s7XG4gICAgfSkpIHtcbiAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICAgIG1ha2VGYWxsYmFja0NoZWNrcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2hlY2tzTWFwLnNldChwbGFjZW1lbnQsIGNoZWNrcyk7XG4gIH1cblxuICBpZiAobWFrZUZhbGxiYWNrQ2hlY2tzKSB7XG4gICAgLy8gYDJgIG1heSBiZSBkZXNpcmVkIGluIHNvbWUgY2FzZXMg4oCTIHJlc2VhcmNoIGxhdGVyXG4gICAgdmFyIG51bWJlck9mQ2hlY2tzID0gZmxpcFZhcmlhdGlvbnMgPyAzIDogMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9pKSB7XG4gICAgICB2YXIgZml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHMuZmluZChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG5cbiAgICAgICAgaWYgKGNoZWNrcykge1xuICAgICAgICAgIHJldHVybiBjaGVja3Muc2xpY2UoMCwgX2kpLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgX2kgPSBudW1iZXJPZkNoZWNrczsgX2kgPiAwOyBfaS0tKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKF9pKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZmxpcCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBmbGlwLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddLFxuICBkYXRhOiB7XG4gICAgX3NraXA6IGZhbHNlXG4gIH1cbn07IiwiaW1wb3J0IHsgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5cbmZ1bmN0aW9uIGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKSB7XG4gIGlmIChwcmV2ZW50ZWRPZmZzZXRzID09PSB2b2lkIDApIHtcbiAgICBwcmV2ZW50ZWRPZmZzZXRzID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0IC0gcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGggKyBwcmV2ZW50ZWRPZmZzZXRzLngsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCArIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aCAtIHByZXZlbnRlZE9mZnNldHMueFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0FueVNpZGVGdWxseUNsaXBwZWQob3ZlcmZsb3cpIHtcbiAgcmV0dXJuIFt0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnRdLnNvbWUoZnVuY3Rpb24gKHNpZGUpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dbc2lkZV0gPj0gMDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhpZGUoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgcHJldmVudGVkT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucHJldmVudE92ZXJmbG93O1xuICB2YXIgcmVmZXJlbmNlT3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGVsZW1lbnRDb250ZXh0OiAncmVmZXJlbmNlJ1xuICB9KTtcbiAgdmFyIHBvcHBlckFsdE92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBhbHRCb3VuZGFyeTogdHJ1ZVxuICB9KTtcbiAgdmFyIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHJlZmVyZW5jZU92ZXJmbG93LCByZWZlcmVuY2VSZWN0KTtcbiAgdmFyIHBvcHBlckVzY2FwZU9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhwb3BwZXJBbHRPdmVyZmxvdywgcG9wcGVyUmVjdCwgcHJldmVudGVkT2Zmc2V0cyk7XG4gIHZhciBpc1JlZmVyZW5jZUhpZGRlbiA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChyZWZlcmVuY2VDbGlwcGluZ09mZnNldHMpO1xuICB2YXIgaGFzUG9wcGVyRXNjYXBlZCA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChwb3BwZXJFc2NhcGVPZmZzZXRzKTtcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IHtcbiAgICByZWZlcmVuY2VDbGlwcGluZ09mZnNldHM6IHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyxcbiAgICBwb3BwZXJFc2NhcGVPZmZzZXRzOiBwb3BwZXJFc2NhcGVPZmZzZXRzLFxuICAgIGlzUmVmZXJlbmNlSGlkZGVuOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICBoYXNQb3BwZXJFc2NhcGVkOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH07XG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICAnZGF0YS1wb3BwZXItcmVmZXJlbmNlLWhpZGRlbic6IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgICdkYXRhLXBvcHBlci1lc2NhcGVkJzogaGFzUG9wcGVyRXNjYXBlZFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2hpZGUnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddLFxuICBmbjogaGlkZVxufTsiLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgcGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHJlY3RzLCBvZmZzZXQpIHtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHZhciBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICB2YXIgX3JlZiA9IHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicgPyBvZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgcmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KSkgOiBvZmZzZXQsXG4gICAgICBza2lkZGluZyA9IF9yZWZbMF0sXG4gICAgICBkaXN0YW5jZSA9IF9yZWZbMV07XG5cbiAgc2tpZGRpbmcgPSBza2lkZGluZyB8fCAwO1xuICBkaXN0YW5jZSA9IChkaXN0YW5jZSB8fCAwKSAqIGludmVydERpc3RhbmNlO1xuICByZXR1cm4gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyB7XG4gICAgeDogZGlzdGFuY2UsXG4gICAgeTogc2tpZGRpbmdcbiAgfSA6IHtcbiAgICB4OiBza2lkZGluZyxcbiAgICB5OiBkaXN0YW5jZVxuICB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmMi5uYW1lO1xuICB2YXIgX29wdGlvbnMkb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfb3B0aW9ucyRvZmZzZXQgPT09IHZvaWQgMCA/IFswLCAwXSA6IF9vcHRpb25zJG9mZnNldDtcbiAgdmFyIGRhdGEgPSBwbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgc3RhdGUucmVjdHMsIG9mZnNldCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICB2YXIgX2RhdGEkc3RhdGUkcGxhY2VtZW50ID0gZGF0YVtzdGF0ZS5wbGFjZW1lbnRdLFxuICAgICAgeCA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC54LFxuICAgICAgeSA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC55O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy54ICs9IHg7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnkgKz0geTtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0XG59OyIsImltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZU9mZnNldHMuanNcIjtcblxuZnVuY3Rpb24gcG9wcGVyT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICAvLyBPZmZzZXRzIGFyZSB0aGUgYWN0dWFsIHBvc2l0aW9uIHRoZSBwb3BwZXIgbmVlZHMgdG8gaGF2ZSB0byBiZVxuICAvLyBwcm9wZXJseSBwb3NpdGlvbmVkIG5lYXIgaXRzIHJlZmVyZW5jZSBlbGVtZW50XG4gIC8vIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgcGxhY2VtZW50LCBhbmQgd2lsbCBiZSBhZGp1c3RlZCBieVxuICAvLyB0aGUgbW9kaWZpZXJzIGluIHRoZSBuZXh0IHN0ZXBcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHN0YXRlLnJlY3RzLnJlZmVyZW5jZSxcbiAgICBlbGVtZW50OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwb3BwZXJPZmZzZXRzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdyZWFkJyxcbiAgZm46IHBvcHBlck9mZnNldHMsXG4gIGRhdGE6IHt9XG59OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEFsdEF4aXMoYXhpcykge1xuICByZXR1cm4gYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xufSIsImltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgc3RhcnQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRBbHRBeGlzIGZyb20gXCIuLi91dGlscy9nZXRBbHRBeGlzLmpzXCI7XG5pbXBvcnQgeyB3aXRoaW4sIHdpdGhpbk1heENsYW1wIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRMYXlvdXRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjtcbmltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4uL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuaW1wb3J0IHsgbWluIGFzIG1hdGhNaW4sIG1heCBhcyBtYXRoTWF4IH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcblxuZnVuY3Rpb24gcHJldmVudE92ZXJmbG93KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgX29wdGlvbnMkdGV0aGVyID0gb3B0aW9ucy50ZXRoZXIsXG4gICAgICB0ZXRoZXIgPSBfb3B0aW9ucyR0ZXRoZXIgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyR0ZXRoZXIsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPSBvcHRpb25zLnRldGhlck9mZnNldCxcbiAgICAgIHRldGhlck9mZnNldCA9IF9vcHRpb25zJHRldGhlck9mZnNldCA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHRldGhlck9mZnNldDtcbiAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgcGFkZGluZzogcGFkZGluZyxcbiAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnlcbiAgfSk7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciBpc0Jhc2VQbGFjZW1lbnQgPSAhdmFyaWF0aW9uO1xuICB2YXIgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIHZhciBhbHRBeGlzID0gZ2V0QWx0QXhpcyhtYWluQXhpcyk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciB0ZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXQgPT09ICdmdW5jdGlvbicgPyB0ZXRoZXJPZmZzZXQoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiB0ZXRoZXJPZmZzZXQ7XG4gIHZhciBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0VmFsdWUgPT09ICdudW1iZXInID8ge1xuICAgIG1haW5BeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZSxcbiAgICBhbHRBeGlzOiB0ZXRoZXJPZmZzZXRWYWx1ZVxuICB9IDogT2JqZWN0LmFzc2lnbih7XG4gICAgbWFpbkF4aXM6IDAsXG4gICAgYWx0QXhpczogMFxuICB9LCB0ZXRoZXJPZmZzZXRWYWx1ZSk7XG4gIHZhciBvZmZzZXRNb2RpZmllclN0YXRlID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdIDogbnVsbDtcbiAgdmFyIGRhdGEgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKCFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkO1xuXG4gICAgdmFyIG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgdmFyIGFsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuICAgIHZhciBtaW4gPSBvZmZzZXQgKyBvdmVyZmxvd1ttYWluU2lkZV07XG4gICAgdmFyIG1heCA9IG9mZnNldCAtIG92ZXJmbG93W2FsdFNpZGVdO1xuICAgIHZhciBhZGRpdGl2ZSA9IHRldGhlciA/IC1wb3BwZXJSZWN0W2xlbl0gLyAyIDogMDtcbiAgICB2YXIgbWluTGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IHJlZmVyZW5jZVJlY3RbbGVuXSA6IHBvcHBlclJlY3RbbGVuXTtcbiAgICB2YXIgbWF4TGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IC1wb3BwZXJSZWN0W2xlbl0gOiAtcmVmZXJlbmNlUmVjdFtsZW5dOyAvLyBXZSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFycm93IGluIHRoZSBjYWxjdWxhdGlvbiBzbyB0aGUgYXJyb3cgZG9lc24ndCBnb1xuICAgIC8vIG91dHNpZGUgdGhlIHJlZmVyZW5jZSBib3VuZHNcblxuICAgIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgICB2YXIgYXJyb3dSZWN0ID0gdGV0aGVyICYmIGFycm93RWxlbWVudCA/IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KSA6IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nT2JqZWN0ID0gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddID8gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddLnBhZGRpbmcgOiBnZXRGcmVzaFNpZGVPYmplY3QoKTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWluID0gYXJyb3dQYWRkaW5nT2JqZWN0W21haW5TaWRlXTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWF4ID0gYXJyb3dQYWRkaW5nT2JqZWN0W2FsdFNpZGVdOyAvLyBJZiB0aGUgcmVmZXJlbmNlIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gdGhlIGFycm93IGxlbmd0aCwgd2UgZG9uJ3Qgd2FudFxuICAgIC8vIHRvIGluY2x1ZGUgaXRzIGZ1bGwgc2l6ZSBpbiB0aGUgY2FsY3VsYXRpb24uIElmIHRoZSByZWZlcmVuY2UgaXMgc21hbGxcbiAgICAvLyBhbmQgbmVhciB0aGUgZWRnZSBvZiBhIGJvdW5kYXJ5LCB0aGUgcG9wcGVyIGNhbiBvdmVyZmxvdyBldmVuIGlmIHRoZVxuICAgIC8vIHJlZmVyZW5jZSBpcyBub3Qgb3ZlcmZsb3dpbmcgYXMgd2VsbCAoZS5nLiB2aXJ0dWFsIGVsZW1lbnRzIHdpdGggbm9cbiAgICAvLyB3aWR0aCBvciBoZWlnaHQpXG5cbiAgICB2YXIgYXJyb3dMZW4gPSB3aXRoaW4oMCwgcmVmZXJlbmNlUmVjdFtsZW5dLCBhcnJvd1JlY3RbbGVuXSk7XG4gICAgdmFyIG1pbk9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IHJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgLSBhZGRpdGl2ZSAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWluTGVuIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIG1heE9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IC1yZWZlcmVuY2VSZWN0W2xlbl0gLyAyICsgYWRkaXRpdmUgKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcyA6IG1heExlbiArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIHZhciBhcnJvd09mZnNldFBhcmVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93ICYmIGdldE9mZnNldFBhcmVudChzdGF0ZS5lbGVtZW50cy5hcnJvdyk7XG4gICAgdmFyIGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50ID8gbWFpbkF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFRvcCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50TGVmdCB8fCAwIDogMDtcbiAgICB2YXIgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQgPSBvZmZzZXRNb2RpZmllclN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBvZmZzZXRNb2RpZmllclN0YXRlW21haW5BeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJCA6IDA7XG4gICAgdmFyIHRldGhlck1pbiA9IG9mZnNldCArIG1pbk9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWUgLSBjbGllbnRPZmZzZXQ7XG4gICAgdmFyIHRldGhlck1heCA9IG9mZnNldCArIG1heE9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWU7XG4gICAgdmFyIHByZXZlbnRlZE9mZnNldCA9IHdpdGhpbih0ZXRoZXIgPyBtYXRoTWluKG1pbiwgdGV0aGVyTWluKSA6IG1pbiwgb2Zmc2V0LCB0ZXRoZXIgPyBtYXRoTWF4KG1heCwgdGV0aGVyTWF4KSA6IG1heCk7XG4gICAgcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQgLSBvZmZzZXQ7XG4gIH1cblxuICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgdmFyIF9vZmZzZXRNb2RpZmllclN0YXRlJDI7XG5cbiAgICB2YXIgX21haW5TaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IHRvcCA6IGxlZnQ7XG5cbiAgICB2YXIgX2FsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gYm90dG9tIDogcmlnaHQ7XG5cbiAgICB2YXIgX29mZnNldCA9IHBvcHBlck9mZnNldHNbYWx0QXhpc107XG5cbiAgICB2YXIgX2xlbiA9IGFsdEF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHZhciBfbWluID0gX29mZnNldCArIG92ZXJmbG93W19tYWluU2lkZV07XG5cbiAgICB2YXIgX21heCA9IF9vZmZzZXQgLSBvdmVyZmxvd1tfYWx0U2lkZV07XG5cbiAgICB2YXIgaXNPcmlnaW5TaWRlID0gW3RvcCwgbGVmdF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgICB2YXIgX29mZnNldE1vZGlmaWVyVmFsdWUgPSAoX29mZnNldE1vZGlmaWVyU3RhdGUkMiA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbYWx0QXhpc10pICE9IG51bGwgPyBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyIDogMDtcblxuICAgIHZhciBfdGV0aGVyTWluID0gaXNPcmlnaW5TaWRlID8gX21pbiA6IF9vZmZzZXQgLSByZWZlcmVuY2VSZWN0W19sZW5dIC0gcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXM7XG5cbiAgICB2YXIgX3RldGhlck1heCA9IGlzT3JpZ2luU2lkZSA/IF9vZmZzZXQgKyByZWZlcmVuY2VSZWN0W19sZW5dICsgcG9wcGVyUmVjdFtfbGVuXSAtIF9vZmZzZXRNb2RpZmllclZhbHVlIC0gbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXMgOiBfbWF4O1xuXG4gICAgdmFyIF9wcmV2ZW50ZWRPZmZzZXQgPSB0ZXRoZXIgJiYgaXNPcmlnaW5TaWRlID8gd2l0aGluTWF4Q2xhbXAoX3RldGhlck1pbiwgX29mZnNldCwgX3RldGhlck1heCkgOiB3aXRoaW4odGV0aGVyID8gX3RldGhlck1pbiA6IF9taW4sIF9vZmZzZXQsIHRldGhlciA/IF90ZXRoZXJNYXggOiBfbWF4KTtcblxuICAgIHBvcHBlck9mZnNldHNbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbYWx0QXhpc10gPSBfcHJldmVudGVkT2Zmc2V0IC0gX29mZnNldDtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IHByZXZlbnRPdmVyZmxvdyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXVxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRIVE1MRWxlbWVudFNjcm9sbChlbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93U2Nyb2xsIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0SFRNTEVsZW1lbnRTY3JvbGwgZnJvbSBcIi4vZ2V0SFRNTEVsZW1lbnRTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVTY3JvbGwobm9kZSkge1xuICBpZiAobm9kZSA9PT0gZ2V0V2luZG93KG5vZGUpIHx8ICFpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIGdldFdpbmRvd1Njcm9sbChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRTY3JvbGwobm9kZSk7XG4gIH1cbn0iLCJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldE5vZGVTY3JvbGwgZnJvbSBcIi4vZ2V0Tm9kZVNjcm9sbC5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnRTY2FsZWQoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzY2FsZVggPSByb3VuZChyZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMTtcbiAgdmFyIHNjYWxlWSA9IHJvdW5kKHJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDE7XG4gIHJldHVybiBzY2FsZVggIT09IDEgfHwgc2NhbGVZICE9PSAxO1xufSAvLyBSZXR1cm5zIHRoZSBjb21wb3NpdGUgcmVjdCBvZiBhbiBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBvZmZzZXRQYXJlbnQuXG4vLyBDb21wb3NpdGUgbWVhbnMgaXQgdGFrZXMgaW50byBhY2NvdW50IHRyYW5zZm9ybXMgYXMgd2VsbCBhcyBsYXlvdXQuXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29tcG9zaXRlUmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50LCBpc0ZpeGVkKSB7XG4gIGlmIChpc0ZpeGVkID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkID0gZmFsc2U7XG4gIH1cblxuICB2YXIgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciBvZmZzZXRQYXJlbnRJc1NjYWxlZCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBpc0VsZW1lbnRTY2FsZWQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50SXNTY2FsZWQpO1xuICB2YXIgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIHZhciBvZmZzZXRzID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTA3OFxuICAgIGlzU2Nyb2xsUGFyZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICBvZmZzZXRzID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCwgdHJ1ZSk7XG4gICAgICBvZmZzZXRzLnggKz0gb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgKz0gb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWxlbWVudCkge1xuICAgICAgb2Zmc2V0cy54ID0gZ2V0V2luZG93U2Nyb2xsQmFyWChkb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogcmVjdC5sZWZ0ICsgc2Nyb2xsLnNjcm9sbExlZnQgLSBvZmZzZXRzLngsXG4gICAgeTogcmVjdC50b3AgKyBzY3JvbGwuc2Nyb2xsVG9wIC0gb2Zmc2V0cy55LFxuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgfTtcbn0iLCJpbXBvcnQgeyBtb2RpZmllclBoYXNlcyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBzb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ5ODc1MjU1XG5cbmZ1bmN0aW9uIG9yZGVyKG1vZGlmaWVycykge1xuICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBtYXAuc2V0KG1vZGlmaWVyLm5hbWUsIG1vZGlmaWVyKTtcbiAgfSk7IC8vIE9uIHZpc2l0aW5nIG9iamVjdCwgY2hlY2sgZm9yIGl0cyBkZXBlbmRlbmNpZXMgYW5kIHZpc2l0IHRoZW0gcmVjdXJzaXZlbHlcblxuICBmdW5jdGlvbiBzb3J0KG1vZGlmaWVyKSB7XG4gICAgdmlzaXRlZC5hZGQobW9kaWZpZXIubmFtZSk7XG4gICAgdmFyIHJlcXVpcmVzID0gW10uY29uY2F0KG1vZGlmaWVyLnJlcXVpcmVzIHx8IFtdLCBtb2RpZmllci5yZXF1aXJlc0lmRXhpc3RzIHx8IFtdKTtcbiAgICByZXF1aXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChkZXApIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMoZGVwKSkge1xuICAgICAgICB2YXIgZGVwTW9kaWZpZXIgPSBtYXAuZ2V0KGRlcCk7XG5cbiAgICAgICAgaWYgKGRlcE1vZGlmaWVyKSB7XG4gICAgICAgICAgc29ydChkZXBNb2RpZmllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXN1bHQucHVzaChtb2RpZmllcik7XG4gIH1cblxuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBpZiAoIXZpc2l0ZWQuaGFzKG1vZGlmaWVyLm5hbWUpKSB7XG4gICAgICAvLyBjaGVjayBmb3IgdmlzaXRlZCBvYmplY3RcbiAgICAgIHNvcnQobW9kaWZpZXIpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9yZGVyTW9kaWZpZXJzKG1vZGlmaWVycykge1xuICAvLyBvcmRlciBiYXNlZCBvbiBkZXBlbmRlbmNpZXNcbiAgdmFyIG9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcihtb2RpZmllcnMpOyAvLyBvcmRlciBiYXNlZCBvbiBwaGFzZVxuXG4gIHJldHVybiBtb2RpZmllclBoYXNlcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGhhc2UpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgIHJldHVybiBtb2RpZmllci5waGFzZSA9PT0gcGhhc2U7XG4gICAgfSkpO1xuICB9LCBbXSk7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVib3VuY2UoZm4pIHtcbiAgdmFyIHBlbmRpbmc7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXNvbHZlKGZuKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwZW5kaW5nO1xuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQnlOYW1lKG1vZGlmaWVycykge1xuICB2YXIgbWVyZ2VkID0gbW9kaWZpZXJzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkLCBjdXJyZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZyA/IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLCBjdXJyZW50LCB7XG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5vcHRpb25zLCBjdXJyZW50Lm9wdGlvbnMpLFxuICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcuZGF0YSwgY3VycmVudC5kYXRhKVxuICAgIH0pIDogY3VycmVudDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9LCB7fSk7IC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCBPYmplY3QudmFsdWVzXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkW2tleV07XG4gIH0pO1xufSIsImltcG9ydCBnZXRDb21wb3NpdGVSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IG9yZGVyTW9kaWZpZXJzIGZyb20gXCIuL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzXCI7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSBcIi4vdXRpbHMvZGVib3VuY2UuanNcIjtcbmltcG9ydCB2YWxpZGF0ZU1vZGlmaWVycyBmcm9tIFwiLi91dGlscy92YWxpZGF0ZU1vZGlmaWVycy5qc1wiO1xuaW1wb3J0IHVuaXF1ZUJ5IGZyb20gXCIuL3V0aWxzL3VuaXF1ZUJ5LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgbWVyZ2VCeU5hbWUgZnJvbSBcIi4vdXRpbHMvbWVyZ2VCeU5hbWUuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCB7IGF1dG8gfSBmcm9tIFwiLi9lbnVtcy5qc1wiO1xudmFyIElOVkFMSURfRUxFTUVOVF9FUlJPUiA9ICdQb3BwZXI6IEludmFsaWQgcmVmZXJlbmNlIG9yIHBvcHBlciBhcmd1bWVudCBwcm92aWRlZC4gVGhleSBtdXN0IGJlIGVpdGhlciBhIERPTSBlbGVtZW50IG9yIHZpcnR1YWwgZWxlbWVudC4nO1xudmFyIElORklOSVRFX0xPT1BfRVJST1IgPSAnUG9wcGVyOiBBbiBpbmZpbml0ZSBsb29wIGluIHRoZSBtb2RpZmllcnMgY3ljbGUgaGFzIGJlZW4gZGV0ZWN0ZWQhIFRoZSBjeWNsZSBoYXMgYmVlbiBpbnRlcnJ1cHRlZCB0byBwcmV2ZW50IGEgYnJvd3NlciBjcmFzaC4nO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgbW9kaWZpZXJzOiBbXSxcbiAgc3RyYXRlZ3k6ICdhYnNvbHV0ZSdcbn07XG5cbmZ1bmN0aW9uIGFyZVZhbGlkRWxlbWVudHMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gIWFyZ3Muc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHJldHVybiAhKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID09PSAnZnVuY3Rpb24nKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3BwZXJHZW5lcmF0b3IoZ2VuZXJhdG9yT3B0aW9ucykge1xuICBpZiAoZ2VuZXJhdG9yT3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgZ2VuZXJhdG9yT3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9nZW5lcmF0b3JPcHRpb25zID0gZ2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRNb2RpZmllcnMsXG4gICAgICBkZWZhdWx0TW9kaWZpZXJzID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmID09PSB2b2lkIDAgPyBbXSA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZixcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIGRlZmF1bHRPcHRpb25zID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9PT0gdm9pZCAwID8gREVGQVVMVF9PUFRJT05TIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmMjtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVBvcHBlcihyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICB9XG5cbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICAgICAgb3JkZXJlZE1vZGlmaWVyczogW10sXG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIGRlZmF1bHRPcHRpb25zKSxcbiAgICAgIG1vZGlmaWVyc0RhdGE6IHt9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlcjogcG9wcGVyXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBzdHlsZXM6IHt9XG4gICAgfTtcbiAgICB2YXIgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIHZhciBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoc2V0T3B0aW9uc0FjdGlvbikge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzZXRPcHRpb25zQWN0aW9uID09PSAnZnVuY3Rpb24nID8gc2V0T3B0aW9uc0FjdGlvbihzdGF0ZS5vcHRpb25zKSA6IHNldE9wdGlvbnNBY3Rpb247XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgc3RhdGUub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBzdGF0ZS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGlzRWxlbWVudChyZWZlcmVuY2UpID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlKSA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkgOiBbXSxcbiAgICAgICAgICBwb3BwZXI6IGxpc3RTY3JvbGxQYXJlbnRzKHBvcHBlcilcbiAgICAgICAgfTsgLy8gT3JkZXJzIHRoZSBtb2RpZmllcnMgYmFzZWQgb24gdGhlaXIgZGVwZW5kZW5jaWVzIGFuZCBgcGhhc2VgXG4gICAgICAgIC8vIHByb3BlcnRpZXNcblxuICAgICAgICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyTW9kaWZpZXJzKG1lcmdlQnlOYW1lKFtdLmNvbmNhdChkZWZhdWx0TW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycykpKTsgLy8gU3RyaXAgb3V0IGRpc2FibGVkIG1vZGlmaWVyc1xuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgICAgIHJldHVybiBtLmVuYWJsZWQ7XG4gICAgICAgIH0pOyAvLyBWYWxpZGF0ZSB0aGUgcHJvdmlkZWQgbW9kaWZpZXJzIHNvIHRoYXQgdGhlIGNvbnN1bWVyIHdpbGwgZ2V0IHdhcm5lZFxuICAgICAgICAvLyBpZiBvbmUgb2YgdGhlIG1vZGlmaWVycyBpcyBpbnZhbGlkIGZvciBhbnkgcmVhc29uXG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIHZhciBtb2RpZmllcnMgPSB1bmlxdWVCeShbXS5jb25jYXQob3JkZXJlZE1vZGlmaWVycywgc3RhdGUub3B0aW9ucy5tb2RpZmllcnMpLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSBfcmVmLm5hbWU7XG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YWxpZGF0ZU1vZGlmaWVycyhtb2RpZmllcnMpO1xuXG4gICAgICAgICAgaWYgKGdldEJhc2VQbGFjZW1lbnQoc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgICAgICAgICB2YXIgZmxpcE1vZGlmaWVyID0gc3RhdGUub3JkZXJlZE1vZGlmaWVycy5maW5kKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgICAgICB2YXIgbmFtZSA9IF9yZWYyLm5hbWU7XG4gICAgICAgICAgICAgIHJldHVybiBuYW1lID09PSAnZmxpcCc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFmbGlwTW9kaWZpZXIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhdXRvXCIgcGxhY2VtZW50cyByZXF1aXJlIHRoZSBcImZsaXBcIiBtb2RpZmllciBiZScsICdwcmVzZW50IGFuZCBlbmFibGVkIHRvIHdvcmsuJ10uam9pbignICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX2dldENvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHBvcHBlciksXG4gICAgICAgICAgICAgIG1hcmdpblRvcCA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpblRvcCxcbiAgICAgICAgICAgICAgbWFyZ2luUmlnaHQgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5SaWdodCxcbiAgICAgICAgICAgICAgbWFyZ2luQm90dG9tID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luQm90dG9tLFxuICAgICAgICAgICAgICBtYXJnaW5MZWZ0ID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luTGVmdDsgLy8gV2Ugbm8gbG9uZ2VyIHRha2UgaW50byBhY2NvdW50IGBtYXJnaW5zYCBvbiB0aGUgcG9wcGVyLCBhbmQgaXQgY2FuXG4gICAgICAgICAgLy8gY2F1c2UgYnVncyB3aXRoIHBvc2l0aW9uaW5nLCBzbyB3ZSdsbCB3YXJuIHRoZSBjb25zdW1lclxuXG5cbiAgICAgICAgICBpZiAoW21hcmdpblRvcCwgbWFyZ2luUmlnaHQsIG1hcmdpbkJvdHRvbSwgbWFyZ2luTGVmdF0uc29tZShmdW5jdGlvbiAobWFyZ2luKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChtYXJnaW4pO1xuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oWydQb3BwZXI6IENTUyBcIm1hcmdpblwiIHN0eWxlcyBjYW5ub3QgYmUgdXNlZCB0byBhcHBseSBwYWRkaW5nJywgJ2JldHdlZW4gdGhlIHBvcHBlciBhbmQgaXRzIHJlZmVyZW5jZSBlbGVtZW50IG9yIGJvdW5kYXJ5LicsICdUbyByZXBsaWNhdGUgbWFyZ2luLCB1c2UgdGhlIGBvZmZzZXRgIG1vZGlmaWVyLCBhcyB3ZWxsIGFzJywgJ3RoZSBgcGFkZGluZ2Agb3B0aW9uIGluIHRoZSBgcHJldmVudE92ZXJmbG93YCBhbmQgYGZsaXBgJywgJ21vZGlmaWVycy4nXS5qb2luKCcgJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bk1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgLy8gU3luYyB1cGRhdGUg4oCTIGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBldmVuIGlmIG5vdCBuZWNlc3NhcnkuIFRoaXNcbiAgICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG93IGZyZXF1ZW5jeSB1cGRhdGVzIHdoZXJlIHN5bmMgYmVoYXZpb3Igc2ltcGxpZmllcyB0aGVcbiAgICAgIC8vIGxvZ2ljLlxuICAgICAgLy8gRm9yIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgKGUuZy4gYHJlc2l6ZWAgYW5kIGBzY3JvbGxgIGV2ZW50cyksIGFsd2F5c1xuICAgICAgLy8gcHJlZmVyIHRoZSBhc3luYyBQb3BwZXIjdXBkYXRlIG1ldGhvZFxuICAgICAgZm9yY2VVcGRhdGU6IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKCkge1xuICAgICAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3N0YXRlJGVsZW1lbnRzID0gc3RhdGUuZWxlbWVudHMsXG4gICAgICAgICAgICByZWZlcmVuY2UgPSBfc3RhdGUkZWxlbWVudHMucmVmZXJlbmNlLFxuICAgICAgICAgICAgcG9wcGVyID0gX3N0YXRlJGVsZW1lbnRzLnBvcHBlcjsgLy8gRG9uJ3QgcHJvY2VlZCBpZiBgcmVmZXJlbmNlYCBvciBgcG9wcGVyYCBhcmUgbm90IHZhbGlkIGVsZW1lbnRzXG4gICAgICAgIC8vIGFueW1vcmVcblxuICAgICAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTlZBTElEX0VMRU1FTlRfRVJST1IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIGFuZCBwb3BwZXIgcmVjdHMgdG8gYmUgcmVhZCBieSBtb2RpZmllcnNcblxuXG4gICAgICAgIHN0YXRlLnJlY3RzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogZ2V0Q29tcG9zaXRlUmVjdChyZWZlcmVuY2UsIGdldE9mZnNldFBhcmVudChwb3BwZXIpLCBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnKSxcbiAgICAgICAgICBwb3BwZXI6IGdldExheW91dFJlY3QocG9wcGVyKVxuICAgICAgICB9OyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUuIFRoZVxuICAgICAgICAvLyBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGUgYGZsaXBgIG1vZGlmaWVyIGNoYW5naW5nIHRoZVxuICAgICAgICAvLyBwbGFjZW1lbnQsIHdoaWNoIHRoZW4gbmVlZHMgdG8gcmUtcnVuIGFsbCB0aGUgbW9kaWZpZXJzLCBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBsb2dpYyB3YXMgcHJldmlvdXNseSByYW4gZm9yIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQgYW5kIGlzIHRoZXJlZm9yZVxuICAgICAgICAvLyBzdGFsZS9pbmNvcnJlY3RcblxuICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5wbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDsgLy8gT24gZWFjaCB1cGRhdGUgY3ljbGUsIHRoZSBgbW9kaWZpZXJzRGF0YWAgcHJvcGVydHkgZm9yIGVhY2ggbW9kaWZpZXJcbiAgICAgICAgLy8gaXMgZmlsbGVkIHdpdGggdGhlIGluaXRpYWwgZGF0YSBzcGVjaWZpZWQgYnkgdGhlIG1vZGlmaWVyLiBUaGlzIG1lYW5zXG4gICAgICAgIC8vIGl0IGRvZXNuJ3QgcGVyc2lzdCBhbmQgaXMgZnJlc2ggb24gZWFjaCB1cGRhdGUuXG4gICAgICAgIC8vIFRvIGVuc3VyZSBwZXJzaXN0ZW50IGRhdGEsIHVzZSBgJHtuYW1lfSNwZXJzaXN0ZW50YFxuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUubW9kaWZpZXJzRGF0YVttb2RpZmllci5uYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGlmaWVyLmRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIF9fZGVidWdfbG9vcHNfXyA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHN0YXRlLm9yZGVyZWRNb2RpZmllcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgX19kZWJ1Z19sb29wc19fICs9IDE7XG5cbiAgICAgICAgICAgIGlmIChfX2RlYnVnX2xvb3BzX18gPiAxMDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTkZJTklURV9MT09QX0VSUk9SKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0YXRlLnJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfc3RhdGUkb3JkZXJlZE1vZGlmaWUgPSBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzW2luZGV4XSxcbiAgICAgICAgICAgICAgZm4gPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUuZm4sXG4gICAgICAgICAgICAgIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUub3B0aW9ucyxcbiAgICAgICAgICAgICAgX29wdGlvbnMgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID09PSB2b2lkIDAgPyB7fSA6IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIsXG4gICAgICAgICAgICAgIG5hbWUgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUubmFtZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN0YXRlID0gZm4oe1xuICAgICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IF9vcHRpb25zLFxuICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2VcbiAgICAgICAgICAgIH0pIHx8IHN0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIEFzeW5jIGFuZCBvcHRpbWlzdGljYWxseSBvcHRpbWl6ZWQgdXBkYXRlIOKAkyBpdCB3aWxsIG5vdCBiZSBleGVjdXRlZCBpZlxuICAgICAgLy8gbm90IG5lY2Vzc2FyeSAoZGVib3VuY2VkIHRvIHJ1biBhdCBtb3N0IG9uY2UtcGVyLXRpY2spXG4gICAgICB1cGRhdGU6IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgaW5zdGFuY2UuZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgICByZXNvbHZlKHN0YXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoSU5WQUxJRF9FTEVNRU5UX0VSUk9SKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIGluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucykudGhlbihmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIGlmICghaXNEZXN0cm95ZWQgJiYgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKSB7XG4gICAgICAgIG9wdGlvbnMub25GaXJzdFVwZGF0ZShzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgYmVmb3JlIHRoZSBmaXJzdFxuICAgIC8vIHVwZGF0ZSBjeWNsZSBydW5zLiBUaGV5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHVwZGF0ZVxuICAgIC8vIGN5Y2xlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgbW9kaWZpZXIgYWRkcyBzb21lIHBlcnNpc3RlbnQgZGF0YSB0aGF0XG4gICAgLy8gb3RoZXIgbW9kaWZpZXJzIG5lZWQgdG8gdXNlLCBidXQgdGhlIG1vZGlmaWVyIGlzIHJ1biBhZnRlciB0aGUgZGVwZW5kZW50XG4gICAgLy8gb25lLlxuXG4gICAgZnVuY3Rpb24gcnVuTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYzLm5hbWUsXG4gICAgICAgICAgICBfcmVmMyRvcHRpb25zID0gX3JlZjMub3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfcmVmMyRvcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9yZWYzJG9wdGlvbnMsXG4gICAgICAgICAgICBlZmZlY3QgPSBfcmVmMy5lZmZlY3Q7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlZmZlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2xlYW51cEZuID0gZWZmZWN0KHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgbm9vcEZuID0gZnVuY3Rpb24gbm9vcEZuKCkge307XG5cbiAgICAgICAgICBlZmZlY3RDbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuIHx8IG5vb3BGbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSk7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuZXhwb3J0IHZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKCk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgZGV0ZWN0T3ZlcmZsb3cgfTsiLCJpbXBvcnQgeyBwb3BwZXJHZW5lcmF0b3IsIGRldGVjdE92ZXJmbG93IH0gZnJvbSBcIi4vY3JlYXRlUG9wcGVyLmpzXCI7XG5pbXBvcnQgZXZlbnRMaXN0ZW5lcnMgZnJvbSBcIi4vbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzXCI7XG5pbXBvcnQgcG9wcGVyT2Zmc2V0cyBmcm9tIFwiLi9tb2RpZmllcnMvcG9wcGVyT2Zmc2V0cy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanNcIjtcbmltcG9ydCBhcHBseVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvYXBwbHlTdHlsZXMuanNcIjtcbmltcG9ydCBvZmZzZXQgZnJvbSBcIi4vbW9kaWZpZXJzL29mZnNldC5qc1wiO1xuaW1wb3J0IGZsaXAgZnJvbSBcIi4vbW9kaWZpZXJzL2ZsaXAuanNcIjtcbmltcG9ydCBwcmV2ZW50T3ZlcmZsb3cgZnJvbSBcIi4vbW9kaWZpZXJzL3ByZXZlbnRPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGFycm93IGZyb20gXCIuL21vZGlmaWVycy9hcnJvdy5qc1wiO1xuaW1wb3J0IGhpZGUgZnJvbSBcIi4vbW9kaWZpZXJzL2hpZGUuanNcIjtcbnZhciBkZWZhdWx0TW9kaWZpZXJzID0gW2V2ZW50TGlzdGVuZXJzLCBwb3BwZXJPZmZzZXRzLCBjb21wdXRlU3R5bGVzLCBhcHBseVN0eWxlcywgb2Zmc2V0LCBmbGlwLCBwcmV2ZW50T3ZlcmZsb3csIGFycm93LCBoaWRlXTtcbnZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKHtcbiAgZGVmYXVsdE1vZGlmaWVyczogZGVmYXVsdE1vZGlmaWVyc1xufSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyLCBwb3BwZXJHZW5lcmF0b3IsIGRlZmF1bHRNb2RpZmllcnMsIGRldGVjdE92ZXJmbG93IH07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyIGFzIGNyZWF0ZVBvcHBlckxpdGUgfSBmcm9tIFwiLi9wb3BwZXItbGl0ZS5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCAqIGZyb20gXCIuL21vZGlmaWVycy9pbmRleC5qc1wiOyIsIi8qIGdsb2JhbCBNYXA6cmVhZG9ubHksIFNldDpyZWFkb25seSwgQXJyYXlCdWZmZXI6cmVhZG9ubHkgKi9cblxudmFyIGhhc0VsZW1lbnRUeXBlID0gdHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnO1xudmFyIGhhc01hcCA9IHR5cGVvZiBNYXAgPT09ICdmdW5jdGlvbic7XG52YXIgaGFzU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJztcbnZhciBoYXNBcnJheUJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiAhIUFycmF5QnVmZmVyLmlzVmlldztcblxuLy8gTm90ZTogV2UgKipkb24ndCoqIG5lZWQgYGVudkhhc0JpZ0ludDY0QXJyYXlgIGluIGZkZSBlczYvaW5kZXguanNcblxuZnVuY3Rpb24gZXF1YWwoYSwgYikge1xuICAvLyBTVEFSVDogZmFzdC1kZWVwLWVxdWFsIGVzNi9pbmRleC5qcyAzLjEuMVxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgaWYgKGEgJiYgYiAmJiB0eXBlb2YgYSA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PSAnb2JqZWN0Jykge1xuICAgIGlmIChhLmNvbnN0cnVjdG9yICE9PSBiLmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgbGVuZ3RoLCBpLCBrZXlzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOylcbiAgICAgICAgaWYgKCFlcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU1RBUlQ6IE1vZGlmaWNhdGlvbnM6XG4gICAgLy8gMS4gRXh0cmEgYGhhczxUeXBlPiAmJmAgaGVscGVycyBpbiBpbml0aWFsIGNvbmRpdGlvbiBhbGxvdyBlczYgY29kZVxuICAgIC8vICAgIHRvIGNvLWV4aXN0IHdpdGggZXM1LlxuICAgIC8vIDIuIFJlcGxhY2UgYGZvciBvZmAgd2l0aCBlczUgY29tcGxpYW50IGl0ZXJhdGlvbiB1c2luZyBgZm9yYC5cbiAgICAvLyAgICBCYXNpY2FsbHksIHRha2U6XG4gICAgLy9cbiAgICAvLyAgICBgYGBqc1xuICAgIC8vICAgIGZvciAoaSBvZiBhLmVudHJpZXMoKSlcbiAgICAvLyAgICAgIGlmICghYi5oYXMoaVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyAgICBgYGBcbiAgICAvL1xuICAgIC8vICAgIC4uLiBhbmQgY29udmVydCB0bzpcbiAgICAvL1xuICAgIC8vICAgIGBgYGpzXG4gICAgLy8gICAgaXQgPSBhLmVudHJpZXMoKTtcbiAgICAvLyAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgIC8vICAgICAgaWYgKCFiLmhhcyhpLnZhbHVlWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vICAgIGBgYFxuICAgIC8vXG4gICAgLy8gICAgKipOb3RlKio6IGBpYCBhY2Nlc3Mgc3dpdGNoZXMgdG8gYGkudmFsdWVgLlxuICAgIHZhciBpdDtcbiAgICBpZiAoaGFzTWFwICYmIChhIGluc3RhbmNlb2YgTWFwKSAmJiAoYiBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaXQgPSBhLmVudHJpZXMoKTtcbiAgICAgIHdoaWxlICghKGkgPSBpdC5uZXh0KCkpLmRvbmUpXG4gICAgICAgIGlmICghYi5oYXMoaS52YWx1ZVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgICAgICBpZiAoIWVxdWFsKGkudmFsdWVbMV0sIGIuZ2V0KGkudmFsdWVbMF0pKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGhhc1NldCAmJiAoYSBpbnN0YW5jZW9mIFNldCkgJiYgKGIgaW5zdGFuY2VvZiBTZXQpKSB7XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRU5EOiBNb2RpZmljYXRpb25zXG5cbiAgICBpZiAoaGFzQXJyYXlCdWZmZXIgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGEpICYmIEFycmF5QnVmZmVyLmlzVmlldyhiKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoYS5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwKSByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG4gICAgaWYgKGEudmFsdWVPZiAhPT0gT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mKSByZXR1cm4gYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpO1xuICAgIGlmIChhLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSByZXR1cm4gYS50b1N0cmluZygpID09PSBiLnRvU3RyaW5nKCk7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXlzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIEVORDogZmFzdC1kZWVwLWVxdWFsXG5cbiAgICAvLyBTVEFSVDogcmVhY3QtZmFzdC1jb21wYXJlXG4gICAgLy8gY3VzdG9tIGhhbmRsaW5nIGZvciBET00gZWxlbWVudHNcbiAgICBpZiAoaGFzRWxlbWVudFR5cGUgJiYgYSBpbnN0YW5jZW9mIEVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIGN1c3RvbSBoYW5kbGluZyBmb3IgUmVhY3QvUHJlYWN0XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICBpZiAoKGtleXNbaV0gPT09ICdfb3duZXInIHx8IGtleXNbaV0gPT09ICdfX3YnIHx8IGtleXNbaV0gPT09ICdfX28nKSAmJiBhLiQkdHlwZW9mKSB7XG4gICAgICAgIC8vIFJlYWN0LXNwZWNpZmljOiBhdm9pZCB0cmF2ZXJzaW5nIFJlYWN0IGVsZW1lbnRzJyBfb3duZXJcbiAgICAgICAgLy8gUHJlYWN0LXNwZWNpZmljOiBhdm9pZCB0cmF2ZXJzaW5nIFByZWFjdCBlbGVtZW50cycgX192IGFuZCBfX29cbiAgICAgICAgLy8gICAgX192ID0gJF9vcmlnaW5hbCAvICRfdm5vZGVcbiAgICAgICAgLy8gICAgX19vID0gJF9vd25lclxuICAgICAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGNvbnRhaW4gY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgYXJlIG5vdCBuZWVkZWQgd2hlblxuICAgICAgICAvLyBjb21wYXJpbmcgdGhlIGFjdHVhbCBlbGVtZW50cyAoYW5kIG5vdCB0aGVpciBvd25lcnMpXG4gICAgICAgIC8vIC4kJHR5cGVvZiBhbmQgLl9zdG9yZSBvbiBqdXN0IHJlYXNvbmFibGUgbWFya2VycyBvZiBlbGVtZW50c1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBhbGwgb3RoZXIgcHJvcGVydGllcyBzaG91bGQgYmUgdHJhdmVyc2VkIGFzIHVzdWFsXG4gICAgICBpZiAoIWVxdWFsKGFba2V5c1tpXV0sIGJba2V5c1tpXV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIEVORDogcmVhY3QtZmFzdC1jb21wYXJlXG5cbiAgICAvLyBTVEFSVDogZmFzdC1kZWVwLWVxdWFsXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gYSAhPT0gYSAmJiBiICE9PSBiO1xufVxuLy8gZW5kIGZhc3QtZGVlcC1lcXVhbFxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRXF1YWwoYSwgYikge1xuICB0cnkge1xuICAgIHJldHVybiBlcXVhbChhLCBiKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKChlcnJvci5tZXNzYWdlIHx8ICcnKS5tYXRjaCgvc3RhY2t8cmVjdXJzaW9uL2kpKSkge1xuICAgICAgLy8gd2FybiBvbiBjaXJjdWxhciByZWZlcmVuY2VzLCBkb24ndCBjcmFzaFxuICAgICAgLy8gYnJvd3NlcnMgZ2l2ZSB0aGlzIGRpZmZlcmVudCBlcnJvcnMgbmFtZSBhbmQgbWVzc2FnZXM6XG4gICAgICAvLyBjaHJvbWUvc2FmYXJpOiBcIlJhbmdlRXJyb3JcIiwgXCJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiXG4gICAgICAvLyBmaXJlZm94OiBcIkludGVybmFsRXJyb3JcIiwgdG9vIG11Y2ggcmVjdXJzaW9uXCJcbiAgICAgIC8vIGVkZ2U6IFwiRXJyb3JcIiwgXCJPdXQgb2Ygc3RhY2sgc3BhY2VcIlxuICAgICAgY29uc29sZS53YXJuKCdyZWFjdC1mYXN0LWNvbXBhcmUgY2Fubm90IGhhbmRsZSBjaXJjdWxhciByZWZzJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIHNvbWUgb3RoZXIgZXJyb3IuIHdlIHNob3VsZCBkZWZpbml0ZWx5IGtub3cgYWJvdXQgdGhlc2VcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVBvcHBlciBhcyBkZWZhdWx0Q3JlYXRlUG9wcGVyIH0gZnJvbSAnQHBvcHBlcmpzL2NvcmUnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAncmVhY3QtZmFzdC1jb21wYXJlJztcbmltcG9ydCB7IGZyb21FbnRyaWVzLCB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0IH0gZnJvbSAnLi91dGlscyc7XG52YXIgRU1QVFlfTU9ESUZJRVJTID0gW107XG5leHBvcnQgdmFyIHVzZVBvcHBlciA9IGZ1bmN0aW9uIHVzZVBvcHBlcihyZWZlcmVuY2VFbGVtZW50LCBwb3BwZXJFbGVtZW50LCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgcHJldk9wdGlvbnMgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBvcHRpb25zV2l0aERlZmF1bHRzID0ge1xuICAgIG9uRmlyc3RVcGRhdGU6IG9wdGlvbnMub25GaXJzdFVwZGF0ZSxcbiAgICBwbGFjZW1lbnQ6IG9wdGlvbnMucGxhY2VtZW50IHx8ICdib3R0b20nLFxuICAgIHN0cmF0ZWd5OiBvcHRpb25zLnN0cmF0ZWd5IHx8ICdhYnNvbHV0ZScsXG4gICAgbW9kaWZpZXJzOiBvcHRpb25zLm1vZGlmaWVycyB8fCBFTVBUWV9NT0RJRklFUlNcbiAgfTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoe1xuICAgIHN0eWxlczoge1xuICAgICAgcG9wcGVyOiB7XG4gICAgICAgIHBvc2l0aW9uOiBvcHRpb25zV2l0aERlZmF1bHRzLnN0cmF0ZWd5LFxuICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgIHRvcDogJzAnXG4gICAgICB9LFxuICAgICAgYXJyb3c6IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICAgIH1cbiAgICB9LFxuICAgIGF0dHJpYnV0ZXM6IHt9XG4gIH0pLFxuICAgICAgc3RhdGUgPSBfUmVhY3QkdXNlU3RhdGVbMF0sXG4gICAgICBzZXRTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZVsxXTtcblxuICB2YXIgdXBkYXRlU3RhdGVNb2RpZmllciA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAndXBkYXRlU3RhdGUnLFxuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIHBoYXNlOiAnd3JpdGUnLFxuICAgICAgZm46IGZ1bmN0aW9uIGZuKF9yZWYpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZTtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gT2JqZWN0LmtleXMoc3RhdGUuZWxlbWVudHMpO1xuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgc3R5bGVzOiBmcm9tRW50cmllcyhlbGVtZW50cy5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbZWxlbWVudCwgc3RhdGUuc3R5bGVzW2VsZW1lbnRdIHx8IHt9XTtcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgYXR0cmlidXRlczogZnJvbUVudHJpZXMoZWxlbWVudHMubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gW2VsZW1lbnQsIHN0YXRlLmF0dHJpYnV0ZXNbZWxlbWVudF1dO1xuICAgICAgICAgIH0pKVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ11cbiAgICB9O1xuICB9LCBbXSk7XG4gIHZhciBwb3BwZXJPcHRpb25zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5ld09wdGlvbnMgPSB7XG4gICAgICBvbkZpcnN0VXBkYXRlOiBvcHRpb25zV2l0aERlZmF1bHRzLm9uRmlyc3RVcGRhdGUsXG4gICAgICBwbGFjZW1lbnQ6IG9wdGlvbnNXaXRoRGVmYXVsdHMucGxhY2VtZW50LFxuICAgICAgc3RyYXRlZ3k6IG9wdGlvbnNXaXRoRGVmYXVsdHMuc3RyYXRlZ3ksXG4gICAgICBtb2RpZmllcnM6IFtdLmNvbmNhdChvcHRpb25zV2l0aERlZmF1bHRzLm1vZGlmaWVycywgW3VwZGF0ZVN0YXRlTW9kaWZpZXIsIHtcbiAgICAgICAgbmFtZTogJ2FwcGx5U3R5bGVzJyxcbiAgICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICAgIH1dKVxuICAgIH07XG5cbiAgICBpZiAoaXNFcXVhbChwcmV2T3B0aW9ucy5jdXJyZW50LCBuZXdPcHRpb25zKSkge1xuICAgICAgcmV0dXJuIHByZXZPcHRpb25zLmN1cnJlbnQgfHwgbmV3T3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgcHJldk9wdGlvbnMuY3VycmVudCA9IG5ld09wdGlvbnM7XG4gICAgICByZXR1cm4gbmV3T3B0aW9ucztcbiAgICB9XG4gIH0sIFtvcHRpb25zV2l0aERlZmF1bHRzLm9uRmlyc3RVcGRhdGUsIG9wdGlvbnNXaXRoRGVmYXVsdHMucGxhY2VtZW50LCBvcHRpb25zV2l0aERlZmF1bHRzLnN0cmF0ZWd5LCBvcHRpb25zV2l0aERlZmF1bHRzLm1vZGlmaWVycywgdXBkYXRlU3RhdGVNb2RpZmllcl0pO1xuICB2YXIgcG9wcGVySW5zdGFuY2VSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQuc2V0T3B0aW9ucyhwb3BwZXJPcHRpb25zKTtcbiAgICB9XG4gIH0sIFtwb3BwZXJPcHRpb25zXSk7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChyZWZlcmVuY2VFbGVtZW50ID09IG51bGwgfHwgcG9wcGVyRWxlbWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNyZWF0ZVBvcHBlciA9IG9wdGlvbnMuY3JlYXRlUG9wcGVyIHx8IGRlZmF1bHRDcmVhdGVQb3BwZXI7XG4gICAgdmFyIHBvcHBlckluc3RhbmNlID0gY3JlYXRlUG9wcGVyKHJlZmVyZW5jZUVsZW1lbnQsIHBvcHBlckVsZW1lbnQsIHBvcHBlck9wdGlvbnMpO1xuICAgIHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQgPSBwb3BwZXJJbnN0YW5jZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcG9wcGVySW5zdGFuY2UuZGVzdHJveSgpO1xuICAgICAgcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfTtcbiAgfSwgW3JlZmVyZW5jZUVsZW1lbnQsIHBvcHBlckVsZW1lbnQsIG9wdGlvbnMuY3JlYXRlUG9wcGVyXSk7XG4gIHJldHVybiB7XG4gICAgc3RhdGU6IHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQgPyBwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50LnN0YXRlIDogbnVsbCxcbiAgICBzdHlsZXM6IHN0YXRlLnN0eWxlcyxcbiAgICBhdHRyaWJ1dGVzOiBzdGF0ZS5hdHRyaWJ1dGVzLFxuICAgIHVwZGF0ZTogcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCA/IHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQudXBkYXRlIDogbnVsbCxcbiAgICBmb3JjZVVwZGF0ZTogcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCA/IHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQuZm9yY2VVcGRhdGUgOiBudWxsXG4gIH07XG59OyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG5cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb24oKSB7fVxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvbldpdGhSZXNldCgpIHt9XG5lbXB0eUZ1bmN0aW9uV2l0aFJlc2V0LnJlc2V0V2FybmluZ0NhY2hlID0gZW1wdHlGdW5jdGlvbjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gc2hpbShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgIGlmIChzZWNyZXQgPT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAvLyBJdCBpcyBzdGlsbCBzYWZlIHdoZW4gY2FsbGVkIGZyb20gUmVhY3QuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAnVXNlIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICApO1xuICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIHRocm93IGVycjtcbiAgfTtcbiAgc2hpbS5pc1JlcXVpcmVkID0gc2hpbTtcbiAgZnVuY3Rpb24gZ2V0U2hpbSgpIHtcbiAgICByZXR1cm4gc2hpbTtcbiAgfTtcbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBzaGltLFxuICAgIGJpZ2ludDogc2hpbSxcbiAgICBib29sOiBzaGltLFxuICAgIGZ1bmM6IHNoaW0sXG4gICAgbnVtYmVyOiBzaGltLFxuICAgIG9iamVjdDogc2hpbSxcbiAgICBzdHJpbmc6IHNoaW0sXG4gICAgc3ltYm9sOiBzaGltLFxuXG4gICAgYW55OiBzaGltLFxuICAgIGFycmF5T2Y6IGdldFNoaW0sXG4gICAgZWxlbWVudDogc2hpbSxcbiAgICBlbGVtZW50VHlwZTogc2hpbSxcbiAgICBpbnN0YW5jZU9mOiBnZXRTaGltLFxuICAgIG5vZGU6IHNoaW0sXG4gICAgb2JqZWN0T2Y6IGdldFNoaW0sXG4gICAgb25lT2Y6IGdldFNoaW0sXG4gICAgb25lT2ZUeXBlOiBnZXRTaGltLFxuICAgIHNoYXBlOiBnZXRTaGltLFxuICAgIGV4YWN0OiBnZXRTaGltLFxuXG4gICAgY2hlY2tQcm9wVHlwZXM6IGVtcHR5RnVuY3Rpb25XaXRoUmVzZXQsXG4gICAgcmVzZXRXYXJuaW5nQ2FjaGU6IGVtcHR5RnVuY3Rpb25cbiAgfTtcblxuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgZGV2ZWxvcG1lbnQgYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSB0cnVlO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShSZWFjdElzLmlzRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59IGVsc2Uge1xuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBwcm9kdWN0aW9uIGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMnKSgpO1xufVxuIiwiLyohXG4qIHRhYmJhYmxlIDUuMi4xXG4qIEBsaWNlbnNlIE1JVCwgaHR0cHM6Ly9naXRodWIuY29tL2ZvY3VzLXRyYXAvdGFiYmFibGUvYmxvYi9tYXN0ZXIvTElDRU5TRVxuKi9cbnZhciBjYW5kaWRhdGVTZWxlY3RvcnMgPSBbJ2lucHV0JywgJ3NlbGVjdCcsICd0ZXh0YXJlYScsICdhW2hyZWZdJywgJ2J1dHRvbicsICdbdGFiaW5kZXhdJywgJ2F1ZGlvW2NvbnRyb2xzXScsICd2aWRlb1tjb250cm9sc10nLCAnW2NvbnRlbnRlZGl0YWJsZV06bm90KFtjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiXSknLCAnZGV0YWlscz5zdW1tYXJ5OmZpcnN0LW9mLXR5cGUnLCAnZGV0YWlscyddO1xudmFyIGNhbmRpZGF0ZVNlbGVjdG9yID0gLyogI19fUFVSRV9fICovY2FuZGlkYXRlU2VsZWN0b3JzLmpvaW4oJywnKTtcbnZhciBtYXRjaGVzID0gdHlwZW9mIEVsZW1lbnQgPT09ICd1bmRlZmluZWQnID8gZnVuY3Rpb24gKCkge30gOiBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzIHx8IEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yIHx8IEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3RvcjtcblxudmFyIGdldENhbmRpZGF0ZXMgPSBmdW5jdGlvbiBnZXRDYW5kaWRhdGVzKGVsLCBpbmNsdWRlQ29udGFpbmVyLCBmaWx0ZXIpIHtcbiAgdmFyIGNhbmRpZGF0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoZWwucXVlcnlTZWxlY3RvckFsbChjYW5kaWRhdGVTZWxlY3RvcikpO1xuXG4gIGlmIChpbmNsdWRlQ29udGFpbmVyICYmIG1hdGNoZXMuY2FsbChlbCwgY2FuZGlkYXRlU2VsZWN0b3IpKSB7XG4gICAgY2FuZGlkYXRlcy51bnNoaWZ0KGVsKTtcbiAgfVxuXG4gIGNhbmRpZGF0ZXMgPSBjYW5kaWRhdGVzLmZpbHRlcihmaWx0ZXIpO1xuICByZXR1cm4gY2FuZGlkYXRlcztcbn07XG5cbnZhciBpc0NvbnRlbnRFZGl0YWJsZSA9IGZ1bmN0aW9uIGlzQ29udGVudEVkaXRhYmxlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuY29udGVudEVkaXRhYmxlID09PSAndHJ1ZSc7XG59O1xuXG52YXIgZ2V0VGFiaW5kZXggPSBmdW5jdGlvbiBnZXRUYWJpbmRleChub2RlKSB7XG4gIHZhciB0YWJpbmRleEF0dHIgPSBwYXJzZUludChub2RlLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSwgMTApO1xuXG4gIGlmICghaXNOYU4odGFiaW5kZXhBdHRyKSkge1xuICAgIHJldHVybiB0YWJpbmRleEF0dHI7XG4gIH0gLy8gQnJvd3NlcnMgZG8gbm90IHJldHVybiBgdGFiSW5kZXhgIGNvcnJlY3RseSBmb3IgY29udGVudEVkaXRhYmxlIG5vZGVzO1xuICAvLyBzbyBpZiB0aGV5IGRvbid0IGhhdmUgYSB0YWJpbmRleCBhdHRyaWJ1dGUgc3BlY2lmaWNhbGx5IHNldCwgYXNzdW1lIGl0J3MgMC5cblxuXG4gIGlmIChpc0NvbnRlbnRFZGl0YWJsZShub2RlKSkge1xuICAgIHJldHVybiAwO1xuICB9IC8vIGluIENocm9tZSwgPGRldGFpbHMvPiwgPGF1ZGlvIGNvbnRyb2xzLz4gYW5kIDx2aWRlbyBjb250cm9scy8+IGVsZW1lbnRzIGdldCBhIGRlZmF1bHRcbiAgLy8gIGB0YWJJbmRleGAgb2YgLTEgd2hlbiB0aGUgJ3RhYmluZGV4JyBhdHRyaWJ1dGUgaXNuJ3Qgc3BlY2lmaWVkIGluIHRoZSBET00sXG4gIC8vICB5ZXQgdGhleSBhcmUgc3RpbGwgcGFydCBvZiB0aGUgcmVndWxhciB0YWIgb3JkZXI7IGluIEZGLCB0aGV5IGdldCBhIGRlZmF1bHRcbiAgLy8gIGB0YWJJbmRleGAgb2YgMDsgc2luY2UgQ2hyb21lIHN0aWxsIHB1dHMgdGhvc2UgZWxlbWVudHMgaW4gdGhlIHJlZ3VsYXIgdGFiXG4gIC8vICBvcmRlciwgY29uc2lkZXIgdGhlaXIgdGFiIGluZGV4IHRvIGJlIDAuXG5cblxuICBpZiAoKG5vZGUubm9kZU5hbWUgPT09ICdBVURJTycgfHwgbm9kZS5ub2RlTmFtZSA9PT0gJ1ZJREVPJyB8fCBub2RlLm5vZGVOYW1lID09PSAnREVUQUlMUycpICYmIG5vZGUuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpID09PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gbm9kZS50YWJJbmRleDtcbn07XG5cbnZhciBzb3J0T3JkZXJlZFRhYmJhYmxlcyA9IGZ1bmN0aW9uIHNvcnRPcmRlcmVkVGFiYmFibGVzKGEsIGIpIHtcbiAgcmV0dXJuIGEudGFiSW5kZXggPT09IGIudGFiSW5kZXggPyBhLmRvY3VtZW50T3JkZXIgLSBiLmRvY3VtZW50T3JkZXIgOiBhLnRhYkluZGV4IC0gYi50YWJJbmRleDtcbn07XG5cbnZhciBpc0lucHV0ID0gZnVuY3Rpb24gaXNJbnB1dChub2RlKSB7XG4gIHJldHVybiBub2RlLnRhZ05hbWUgPT09ICdJTlBVVCc7XG59O1xuXG52YXIgaXNIaWRkZW5JbnB1dCA9IGZ1bmN0aW9uIGlzSGlkZGVuSW5wdXQobm9kZSkge1xuICByZXR1cm4gaXNJbnB1dChub2RlKSAmJiBub2RlLnR5cGUgPT09ICdoaWRkZW4nO1xufTtcblxudmFyIGlzRGV0YWlsc1dpdGhTdW1tYXJ5ID0gZnVuY3Rpb24gaXNEZXRhaWxzV2l0aFN1bW1hcnkobm9kZSkge1xuICB2YXIgciA9IG5vZGUudGFnTmFtZSA9PT0gJ0RFVEFJTFMnICYmIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShub2RlLmNoaWxkcmVuKS5zb21lKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC50YWdOYW1lID09PSAnU1VNTUFSWSc7XG4gIH0pO1xuICByZXR1cm4gcjtcbn07XG5cbnZhciBnZXRDaGVja2VkUmFkaW8gPSBmdW5jdGlvbiBnZXRDaGVja2VkUmFkaW8obm9kZXMsIGZvcm0pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChub2Rlc1tpXS5jaGVja2VkICYmIG5vZGVzW2ldLmZvcm0gPT09IGZvcm0pIHtcbiAgICAgIHJldHVybiBub2Rlc1tpXTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBpc1RhYmJhYmxlUmFkaW8gPSBmdW5jdGlvbiBpc1RhYmJhYmxlUmFkaW8obm9kZSkge1xuICBpZiAoIW5vZGUubmFtZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIHJhZGlvU2NvcGUgPSBub2RlLmZvcm0gfHwgbm9kZS5vd25lckRvY3VtZW50O1xuXG4gIHZhciBxdWVyeVJhZGlvcyA9IGZ1bmN0aW9uIHF1ZXJ5UmFkaW9zKG5hbWUpIHtcbiAgICByZXR1cm4gcmFkaW9TY29wZS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwicmFkaW9cIl1bbmFtZT1cIicgKyBuYW1lICsgJ1wiXScpO1xuICB9O1xuXG4gIHZhciByYWRpb1NldDtcblxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5DU1MgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuQ1NTLmVzY2FwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJhZGlvU2V0ID0gcXVlcnlSYWRpb3Mod2luZG93LkNTUy5lc2NhcGUobm9kZS5uYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHJhZGlvU2V0ID0gcXVlcnlSYWRpb3Mobm9kZS5uYW1lKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKCdMb29rcyBsaWtlIHlvdSBoYXZlIGEgcmFkaW8gYnV0dG9uIHdpdGggYSBuYW1lIGF0dHJpYnV0ZSBjb250YWluaW5nIGludmFsaWQgQ1NTIHNlbGVjdG9yIGNoYXJhY3RlcnMgYW5kIG5lZWQgdGhlIENTUy5lc2NhcGUgcG9seWZpbGw6ICVzJywgZXJyLm1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjaGVja2VkID0gZ2V0Q2hlY2tlZFJhZGlvKHJhZGlvU2V0LCBub2RlLmZvcm0pO1xuICByZXR1cm4gIWNoZWNrZWQgfHwgY2hlY2tlZCA9PT0gbm9kZTtcbn07XG5cbnZhciBpc1JhZGlvID0gZnVuY3Rpb24gaXNSYWRpbyhub2RlKSB7XG4gIHJldHVybiBpc0lucHV0KG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ3JhZGlvJztcbn07XG5cbnZhciBpc05vblRhYmJhYmxlUmFkaW8gPSBmdW5jdGlvbiBpc05vblRhYmJhYmxlUmFkaW8obm9kZSkge1xuICByZXR1cm4gaXNSYWRpbyhub2RlKSAmJiAhaXNUYWJiYWJsZVJhZGlvKG5vZGUpO1xufTtcblxudmFyIGlzSGlkZGVuID0gZnVuY3Rpb24gaXNIaWRkZW4obm9kZSwgZGlzcGxheUNoZWNrKSB7XG4gIGlmIChnZXRDb21wdXRlZFN0eWxlKG5vZGUpLnZpc2liaWxpdHkgPT09ICdoaWRkZW4nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgaXNEaXJlY3RTdW1tYXJ5ID0gbWF0Y2hlcy5jYWxsKG5vZGUsICdkZXRhaWxzPnN1bW1hcnk6Zmlyc3Qtb2YtdHlwZScpO1xuICB2YXIgbm9kZVVuZGVyRGV0YWlscyA9IGlzRGlyZWN0U3VtbWFyeSA/IG5vZGUucGFyZW50RWxlbWVudCA6IG5vZGU7XG5cbiAgaWYgKG1hdGNoZXMuY2FsbChub2RlVW5kZXJEZXRhaWxzLCAnZGV0YWlsczpub3QoW29wZW5dKSAqJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghZGlzcGxheUNoZWNrIHx8IGRpc3BsYXlDaGVjayA9PT0gJ2Z1bGwnKSB7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKG5vZGUpLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50RWxlbWVudDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZGlzcGxheUNoZWNrID09PSAnbm9uLXplcm8tYXJlYScpIHtcbiAgICB2YXIgX25vZGUkZ2V0Qm91bmRpbmdDbGllID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgd2lkdGggPSBfbm9kZSRnZXRCb3VuZGluZ0NsaWUud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9ub2RlJGdldEJvdW5kaW5nQ2xpZS5oZWlnaHQ7XG5cbiAgICByZXR1cm4gd2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTsgLy8gZm9ybSBmaWVsZHMgKG5lc3RlZCkgaW5zaWRlIGEgZGlzYWJsZWQgZmllbGRzZXQgYXJlIG5vdCBmb2N1c2FibGUvdGFiYmFibGVcbi8vICB1bmxlc3MgdGhleSBhcmUgaW4gdGhlIF9maXJzdF8gPGxlZ2VuZD4gZWxlbWVudCBvZiB0aGUgdG9wLW1vc3QgZGlzYWJsZWRcbi8vICBmaWVsZHNldFxuXG5cbnZhciBpc0Rpc2FibGVkRnJvbUZpZWxkc2V0ID0gZnVuY3Rpb24gaXNEaXNhYmxlZEZyb21GaWVsZHNldChub2RlKSB7XG4gIGlmIChpc0lucHV0KG5vZGUpIHx8IG5vZGUudGFnTmFtZSA9PT0gJ1NFTEVDVCcgfHwgbm9kZS50YWdOYW1lID09PSAnVEVYVEFSRUEnIHx8IG5vZGUudGFnTmFtZSA9PT0gJ0JVVFRPTicpIHtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IG5vZGUucGFyZW50RWxlbWVudDtcblxuICAgIHdoaWxlIChwYXJlbnROb2RlKSB7XG4gICAgICBpZiAocGFyZW50Tm9kZS50YWdOYW1lID09PSAnRklFTERTRVQnICYmIHBhcmVudE5vZGUuZGlzYWJsZWQpIHtcbiAgICAgICAgLy8gbG9vayBmb3IgdGhlIGZpcnN0IDxsZWdlbmQ+IGFzIGFuIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGUgZGlzYWJsZWRcbiAgICAgICAgLy8gIDxmaWVsZHNldD46IGlmIHRoZSBub2RlIGlzIGluIHRoYXQgbGVnZW5kLCBpdCdsbCBiZSBlbmFibGVkIGV2ZW5cbiAgICAgICAgLy8gIHRob3VnaCB0aGUgZmllbGRzZXQgaXMgZGlzYWJsZWQ7IG90aGVyd2lzZSwgdGhlIG5vZGUgaXMgaW4gYVxuICAgICAgICAvLyAgc2Vjb25kYXJ5L3N1YnNlcXVlbnQgbGVnZW5kLCBvciBzb21ld2hlcmUgZWxzZSB3aXRoaW4gdGhlIGZpZWxkc2V0XG4gICAgICAgIC8vICAoaG93ZXZlciBkZWVwIG5lc3RlZCkgYW5kIGl0J2xsIGJlIGRpc2FibGVkXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50Tm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBjaGlsZCA9IHBhcmVudE5vZGUuY2hpbGRyZW4uaXRlbShpKTtcblxuICAgICAgICAgIGlmIChjaGlsZC50YWdOYW1lID09PSAnTEVHRU5EJykge1xuICAgICAgICAgICAgaWYgKGNoaWxkLmNvbnRhaW5zKG5vZGUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gLy8gdGhlIG5vZGUgaXNuJ3QgaW4gdGhlIGZpcnN0IGxlZ2VuZCAoaW4gZG9jIG9yZGVyKSwgc28gbm8gbWF0dGVyXG4gICAgICAgICAgICAvLyAgd2hlcmUgaXQgaXMgbm93LCBpdCdsbCBiZSBkaXNhYmxlZFxuXG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyB0aGUgbm9kZSBpc24ndCBpbiBhIGxlZ2VuZCwgc28gbm8gbWF0dGVyIHdoZXJlIGl0IGlzIG5vdywgaXQnbGwgYmUgZGlzYWJsZWRcblxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgfSAvLyBlbHNlLCBub2RlJ3MgdGFiYmFibGUvZm9jdXNhYmxlIHN0YXRlIHNob3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgYSBmaWVsZHNldCdzXG4gIC8vICBlbmFibGVkL2Rpc2FibGVkIHN0YXRlXG5cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG52YXIgaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZSA9IGZ1bmN0aW9uIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUob3B0aW9ucywgbm9kZSkge1xuICBpZiAobm9kZS5kaXNhYmxlZCB8fCBpc0hpZGRlbklucHV0KG5vZGUpIHx8IGlzSGlkZGVuKG5vZGUsIG9wdGlvbnMuZGlzcGxheUNoZWNrKSB8fCAvLyBGb3IgYSBkZXRhaWxzIGVsZW1lbnQgd2l0aCBhIHN1bW1hcnksIHRoZSBzdW1tYXJ5IGVsZW1lbnQgZ2V0cyB0aGUgZm9jdXNcbiAgaXNEZXRhaWxzV2l0aFN1bW1hcnkobm9kZSkgfHwgaXNEaXNhYmxlZEZyb21GaWVsZHNldChub2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZSA9IGZ1bmN0aW9uIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZShvcHRpb25zLCBub2RlKSB7XG4gIGlmICghaXNOb2RlTWF0Y2hpbmdTZWxlY3RvckZvY3VzYWJsZShvcHRpb25zLCBub2RlKSB8fCBpc05vblRhYmJhYmxlUmFkaW8obm9kZSkgfHwgZ2V0VGFiaW5kZXgobm9kZSkgPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgdGFiYmFibGUgPSBmdW5jdGlvbiB0YWJiYWJsZShlbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJlZ3VsYXJUYWJiYWJsZXMgPSBbXTtcbiAgdmFyIG9yZGVyZWRUYWJiYWJsZXMgPSBbXTtcbiAgdmFyIGNhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzKGVsLCBvcHRpb25zLmluY2x1ZGVDb250YWluZXIsIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JUYWJiYWJsZS5iaW5kKG51bGwsIG9wdGlvbnMpKTtcbiAgY2FuZGlkYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChjYW5kaWRhdGUsIGkpIHtcbiAgICB2YXIgY2FuZGlkYXRlVGFiaW5kZXggPSBnZXRUYWJpbmRleChjYW5kaWRhdGUpO1xuXG4gICAgaWYgKGNhbmRpZGF0ZVRhYmluZGV4ID09PSAwKSB7XG4gICAgICByZWd1bGFyVGFiYmFibGVzLnB1c2goY2FuZGlkYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3JkZXJlZFRhYmJhYmxlcy5wdXNoKHtcbiAgICAgICAgZG9jdW1lbnRPcmRlcjogaSxcbiAgICAgICAgdGFiSW5kZXg6IGNhbmRpZGF0ZVRhYmluZGV4LFxuICAgICAgICBub2RlOiBjYW5kaWRhdGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHZhciB0YWJiYWJsZU5vZGVzID0gb3JkZXJlZFRhYmJhYmxlcy5zb3J0KHNvcnRPcmRlcmVkVGFiYmFibGVzKS5tYXAoZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gYS5ub2RlO1xuICB9KS5jb25jYXQocmVndWxhclRhYmJhYmxlcyk7XG4gIHJldHVybiB0YWJiYWJsZU5vZGVzO1xufTtcblxudmFyIGZvY3VzYWJsZSA9IGZ1bmN0aW9uIGZvY3VzYWJsZShlbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGNhbmRpZGF0ZXMgPSBnZXRDYW5kaWRhdGVzKGVsLCBvcHRpb25zLmluY2x1ZGVDb250YWluZXIsIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUuYmluZChudWxsLCBvcHRpb25zKSk7XG4gIHJldHVybiBjYW5kaWRhdGVzO1xufTtcblxudmFyIGlzVGFiYmFibGUgPSBmdW5jdGlvbiBpc1RhYmJhYmxlKG5vZGUsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKCFub2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBub2RlIHByb3ZpZGVkJyk7XG4gIH1cblxuICBpZiAobWF0Y2hlcy5jYWxsKG5vZGUsIGNhbmRpZGF0ZVNlbGVjdG9yKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gaXNOb2RlTWF0Y2hpbmdTZWxlY3RvclRhYmJhYmxlKG9wdGlvbnMsIG5vZGUpO1xufTtcblxudmFyIGZvY3VzYWJsZUNhbmRpZGF0ZVNlbGVjdG9yID0gLyogI19fUFVSRV9fICovY2FuZGlkYXRlU2VsZWN0b3JzLmNvbmNhdCgnaWZyYW1lJykuam9pbignLCcpO1xuXG52YXIgaXNGb2N1c2FibGUgPSBmdW5jdGlvbiBpc0ZvY3VzYWJsZShub2RlLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gbm9kZSBwcm92aWRlZCcpO1xuICB9XG5cbiAgaWYgKG1hdGNoZXMuY2FsbChub2RlLCBmb2N1c2FibGVDYW5kaWRhdGVTZWxlY3RvcikgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JGb2N1c2FibGUob3B0aW9ucywgbm9kZSk7XG59O1xuXG5leHBvcnQgeyBmb2N1c2FibGUsIGlzRm9jdXNhYmxlLCBpc1RhYmJhYmxlLCB0YWJiYWJsZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZXNtLmpzLm1hcFxuIiwiLyohXG4qIGZvY3VzLXRyYXAgNi43LjJcbiogQGxpY2Vuc2UgTUlULCBodHRwczovL2dpdGh1Yi5jb20vZm9jdXMtdHJhcC9mb2N1cy10cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiovXG5pbXBvcnQgeyB0YWJiYWJsZSwgaXNGb2N1c2FibGUsIGlzVGFiYmFibGUgfSBmcm9tICd0YWJiYWJsZSc7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcbiAgICBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgIH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuICAgIGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbnZhciBhY3RpdmVGb2N1c1RyYXBzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdHJhcFF1ZXVlID0gW107XG4gIHJldHVybiB7XG4gICAgYWN0aXZhdGVUcmFwOiBmdW5jdGlvbiBhY3RpdmF0ZVRyYXAodHJhcCkge1xuICAgICAgaWYgKHRyYXBRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBhY3RpdmVUcmFwID0gdHJhcFF1ZXVlW3RyYXBRdWV1ZS5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAoYWN0aXZlVHJhcCAhPT0gdHJhcCkge1xuICAgICAgICAgIGFjdGl2ZVRyYXAucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdHJhcEluZGV4ID0gdHJhcFF1ZXVlLmluZGV4T2YodHJhcCk7XG5cbiAgICAgIGlmICh0cmFwSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHRyYXBRdWV1ZS5wdXNoKHRyYXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbW92ZSB0aGlzIGV4aXN0aW5nIHRyYXAgdG8gdGhlIGZyb250IG9mIHRoZSBxdWV1ZVxuICAgICAgICB0cmFwUXVldWUuc3BsaWNlKHRyYXBJbmRleCwgMSk7XG4gICAgICAgIHRyYXBRdWV1ZS5wdXNoKHRyYXApO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGVhY3RpdmF0ZVRyYXA6IGZ1bmN0aW9uIGRlYWN0aXZhdGVUcmFwKHRyYXApIHtcbiAgICAgIHZhciB0cmFwSW5kZXggPSB0cmFwUXVldWUuaW5kZXhPZih0cmFwKTtcblxuICAgICAgaWYgKHRyYXBJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdHJhcFF1ZXVlLnNwbGljZSh0cmFwSW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHJhcFF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdHJhcFF1ZXVlW3RyYXBRdWV1ZS5sZW5ndGggLSAxXS51bnBhdXNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufSgpO1xuXG52YXIgaXNTZWxlY3RhYmxlSW5wdXQgPSBmdW5jdGlvbiBpc1NlbGVjdGFibGVJbnB1dChub2RlKSB7XG4gIHJldHVybiBub2RlLnRhZ05hbWUgJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgdHlwZW9mIG5vZGUuc2VsZWN0ID09PSAnZnVuY3Rpb24nO1xufTtcblxudmFyIGlzRXNjYXBlRXZlbnQgPSBmdW5jdGlvbiBpc0VzY2FwZUV2ZW50KGUpIHtcbiAgcmV0dXJuIGUua2V5ID09PSAnRXNjYXBlJyB8fCBlLmtleSA9PT0gJ0VzYycgfHwgZS5rZXlDb2RlID09PSAyNztcbn07XG5cbnZhciBpc1RhYkV2ZW50ID0gZnVuY3Rpb24gaXNUYWJFdmVudChlKSB7XG4gIHJldHVybiBlLmtleSA9PT0gJ1RhYicgfHwgZS5rZXlDb2RlID09PSA5O1xufTtcblxudmFyIGRlbGF5ID0gZnVuY3Rpb24gZGVsYXkoZm4pIHtcbiAgcmV0dXJuIHNldFRpbWVvdXQoZm4sIDApO1xufTsgLy8gQXJyYXkuZmluZC9maW5kSW5kZXgoKSBhcmUgbm90IHN1cHBvcnRlZCBvbiBJRTsgdGhpcyByZXBsaWNhdGVzIGVub3VnaFxuLy8gIG9mIEFycmF5LmZpbmRJbmRleCgpIGZvciBvdXIgbmVlZHNcblxuXG52YXIgZmluZEluZGV4ID0gZnVuY3Rpb24gZmluZEluZGV4KGFyciwgZm4pIHtcbiAgdmFyIGlkeCA9IC0xO1xuICBhcnIuZXZlcnkoZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgaWYgKGZuKHZhbHVlKSkge1xuICAgICAgaWR4ID0gaTtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gYnJlYWtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTsgLy8gbmV4dFxuICB9KTtcbiAgcmV0dXJuIGlkeDtcbn07XG4vKipcbiAqIEdldCBhbiBvcHRpb24ncyB2YWx1ZSB3aGVuIGl0IGNvdWxkIGJlIGEgcGxhaW4gdmFsdWUsIG9yIGEgaGFuZGxlciB0aGF0IHByb3ZpZGVzXG4gKiAgdGhlIHZhbHVlLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBPcHRpb24ncyB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7Li4uKn0gW3BhcmFtc10gQW55IHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgaGFuZGxlciwgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLlxuICogQHJldHVybnMgeyp9IFRoZSBgdmFsdWVgLCBvciB0aGUgaGFuZGxlcidzIHJldHVybmVkIHZhbHVlLlxuICovXG5cblxudmFyIHZhbHVlT3JIYW5kbGVyID0gZnVuY3Rpb24gdmFsdWVPckhhbmRsZXIodmFsdWUpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHBhcmFtcyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgcGFyYW1zW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgPyB2YWx1ZS5hcHBseSh2b2lkIDAsIHBhcmFtcykgOiB2YWx1ZTtcbn07XG5cbnZhciBnZXRBY3R1YWxUYXJnZXQgPSBmdW5jdGlvbiBnZXRBY3R1YWxUYXJnZXQoZXZlbnQpIHtcbiAgLy8gTk9URTogSWYgdGhlIHRyYXAgaXMgX2luc2lkZV8gYSBzaGFkb3cgRE9NLCBldmVudC50YXJnZXQgd2lsbCBhbHdheXMgYmUgdGhlXG4gIC8vICBzaGFkb3cgaG9zdC4gSG93ZXZlciwgZXZlbnQudGFyZ2V0LmNvbXBvc2VkUGF0aCgpIHdpbGwgYmUgYW4gYXJyYXkgb2ZcbiAgLy8gIG5vZGVzIFwiY2xpY2tlZFwiIGZyb20gaW5uZXItbW9zdCAodGhlIGFjdHVhbCBlbGVtZW50IGluc2lkZSB0aGUgc2hhZG93KSB0b1xuICAvLyAgb3V0ZXItbW9zdCAodGhlIGhvc3QgSFRNTCBkb2N1bWVudCkuIElmIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXBvc2VkUGF0aCgpLFxuICAvLyAgdGhlbiB1c2UgaXRzIGZpcnN0IGVsZW1lbnQ7IG90aGVyd2lzZSwgZmFsbCBiYWNrIHRvIGV2ZW50LnRhcmdldCAoYW5kXG4gIC8vICB0aGlzIG9ubHkgd29ya3MgZm9yIGFuIF9vcGVuXyBzaGFkb3cgRE9NOyBvdGhlcndpc2UsXG4gIC8vICBjb21wb3NlZFBhdGgoKVswXSA9PT0gZXZlbnQudGFyZ2V0IGFsd2F5cykuXG4gIHJldHVybiBldmVudC50YXJnZXQuc2hhZG93Um9vdCAmJiB0eXBlb2YgZXZlbnQuY29tcG9zZWRQYXRoID09PSAnZnVuY3Rpb24nID8gZXZlbnQuY29tcG9zZWRQYXRoKClbMF0gOiBldmVudC50YXJnZXQ7XG59O1xuXG52YXIgY3JlYXRlRm9jdXNUcmFwID0gZnVuY3Rpb24gY3JlYXRlRm9jdXNUcmFwKGVsZW1lbnRzLCB1c2VyT3B0aW9ucykge1xuICAvLyBTU1I6IGEgbGl2ZSB0cmFwIHNob3VsZG4ndCBiZSBjcmVhdGVkIGluIHRoaXMgdHlwZSBvZiBlbnZpcm9ubWVudCBzbyB0aGlzXG4gIC8vICBzaG91bGQgYmUgc2FmZSBjb2RlIHRvIGV4ZWN1dGUgaWYgdGhlIGBkb2N1bWVudGAgb3B0aW9uIGlzbid0IHNwZWNpZmllZFxuICB2YXIgZG9jID0gKHVzZXJPcHRpb25zID09PSBudWxsIHx8IHVzZXJPcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiB1c2VyT3B0aW9ucy5kb2N1bWVudCkgfHwgZG9jdW1lbnQ7XG5cbiAgdmFyIGNvbmZpZyA9IF9vYmplY3RTcHJlYWQyKHtcbiAgICByZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZTogdHJ1ZSxcbiAgICBlc2NhcGVEZWFjdGl2YXRlczogdHJ1ZSxcbiAgICBkZWxheUluaXRpYWxGb2N1czogdHJ1ZVxuICB9LCB1c2VyT3B0aW9ucyk7XG5cbiAgdmFyIHN0YXRlID0ge1xuICAgIC8vIEB0eXBlIHtBcnJheTxIVE1MRWxlbWVudD59XG4gICAgY29udGFpbmVyczogW10sXG4gICAgLy8gbGlzdCBvZiBvYmplY3RzIGlkZW50aWZ5aW5nIHRoZSBmaXJzdCBhbmQgbGFzdCB0YWJiYWJsZSBub2RlcyBpbiBhbGwgY29udGFpbmVycy9ncm91cHMgaW5cbiAgICAvLyAgdGhlIHRyYXBcbiAgICAvLyBOT1RFOiBpdCdzIHBvc3NpYmxlIHRoYXQgYSBncm91cCBoYXMgbm8gdGFiYmFibGUgbm9kZXMgaWYgbm9kZXMgZ2V0IHJlbW92ZWQgd2hpbGUgdGhlIHRyYXBcbiAgICAvLyAgaXMgYWN0aXZlLCBidXQgdGhlIHRyYXAgc2hvdWxkIG5ldmVyIGdldCB0byBhIHN0YXRlIHdoZXJlIHRoZXJlIGlzbid0IGF0IGxlYXN0IG9uZSBncm91cFxuICAgIC8vICB3aXRoIGF0IGxlYXN0IG9uZSB0YWJiYWJsZSBub2RlIGluIGl0ICh0aGF0IHdvdWxkIGxlYWQgdG8gYW4gZXJyb3IgY29uZGl0aW9uIHRoYXQgd291bGRcbiAgICAvLyAgcmVzdWx0IGluIGFuIGVycm9yIGJlaW5nIHRocm93bilcbiAgICAvLyBAdHlwZSB7QXJyYXk8eyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBmaXJzdFRhYmJhYmxlTm9kZTogSFRNTEVsZW1lbnR8bnVsbCwgbGFzdFRhYmJhYmxlTm9kZTogSFRNTEVsZW1lbnR8bnVsbCB9Pn1cbiAgICB0YWJiYWJsZUdyb3VwczogW10sXG4gICAgbm9kZUZvY3VzZWRCZWZvcmVBY3RpdmF0aW9uOiBudWxsLFxuICAgIG1vc3RSZWNlbnRseUZvY3VzZWROb2RlOiBudWxsLFxuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgcGF1c2VkOiBmYWxzZSxcbiAgICAvLyB0aW1lciBJRCBmb3Igd2hlbiBkZWxheUluaXRpYWxGb2N1cyBpcyB0cnVlIGFuZCBpbml0aWFsIGZvY3VzIGluIHRoaXMgdHJhcFxuICAgIC8vICBoYXMgYmVlbiBkZWxheWVkIGR1cmluZyBhY3RpdmF0aW9uXG4gICAgZGVsYXlJbml0aWFsRm9jdXNUaW1lcjogdW5kZWZpbmVkXG4gIH07XG4gIHZhciB0cmFwOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1jb25zdCAtLSBzb21lIHByaXZhdGUgZnVuY3Rpb25zIHJlZmVyZW5jZSBpdCwgYW5kIGl0cyBtZXRob2RzIHJlZmVyZW5jZSBwcml2YXRlIGZ1bmN0aW9ucywgc28gd2UgbXVzdCBkZWNsYXJlIGhlcmUgYW5kIGRlZmluZSBsYXRlclxuXG4gIHZhciBnZXRPcHRpb24gPSBmdW5jdGlvbiBnZXRPcHRpb24oY29uZmlnT3ZlcnJpZGVPcHRpb25zLCBvcHRpb25OYW1lLCBjb25maWdPcHRpb25OYW1lKSB7XG4gICAgcmV0dXJuIGNvbmZpZ092ZXJyaWRlT3B0aW9ucyAmJiBjb25maWdPdmVycmlkZU9wdGlvbnNbb3B0aW9uTmFtZV0gIT09IHVuZGVmaW5lZCA/IGNvbmZpZ092ZXJyaWRlT3B0aW9uc1tvcHRpb25OYW1lXSA6IGNvbmZpZ1tjb25maWdPcHRpb25OYW1lIHx8IG9wdGlvbk5hbWVdO1xuICB9O1xuXG4gIHZhciBjb250YWluZXJzQ29udGFpbiA9IGZ1bmN0aW9uIGNvbnRhaW5lcnNDb250YWluKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gISEoZWxlbWVudCAmJiBzdGF0ZS5jb250YWluZXJzLnNvbWUoZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIGNvbnRhaW5lci5jb250YWlucyhlbGVtZW50KTtcbiAgICB9KSk7XG4gIH07XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBub2RlIGZvciB0aGUgZ2l2ZW4gb3B0aW9uLCB3aGljaCBpcyBleHBlY3RlZCB0byBiZSBhbiBvcHRpb24gdGhhdFxuICAgKiAgY2FuIGJlIGVpdGhlciBhIERPTSBub2RlLCBhIHN0cmluZyB0aGF0IGlzIGEgc2VsZWN0b3IgdG8gZ2V0IGEgbm9kZSwgYGZhbHNlYFxuICAgKiAgKGlmIGEgbm9kZSBpcyBleHBsaWNpdGx5IE5PVCBnaXZlbiksIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFueSBvZiB0aGVzZVxuICAgKiAgdmFsdWVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkIHwgZmFsc2UgfCBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnR9IFJldHVybnNcbiAgICogIGB1bmRlZmluZWRgIGlmIHRoZSBvcHRpb24gaXMgbm90IHNwZWNpZmllZDsgYGZhbHNlYCBpZiB0aGUgb3B0aW9uXG4gICAqICByZXNvbHZlZCB0byBgZmFsc2VgIChub2RlIGV4cGxpY2l0bHkgbm90IGdpdmVuKTsgb3RoZXJ3aXNlLCB0aGUgcmVzb2x2ZWRcbiAgICogIERPTSBub2RlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIG9wdGlvbiBpcyBzZXQsIG5vdCBgZmFsc2VgLCBhbmQgaXMgbm90LCBvciBkb2VzIG5vdFxuICAgKiAgcmVzb2x2ZSB0byBhIG5vZGUuXG4gICAqL1xuXG5cbiAgdmFyIGdldE5vZGVGb3JPcHRpb24gPSBmdW5jdGlvbiBnZXROb2RlRm9yT3B0aW9uKG9wdGlvbk5hbWUpIHtcbiAgICB2YXIgb3B0aW9uVmFsdWUgPSBjb25maWdbb3B0aW9uTmFtZV07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvblZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIHBhcmFtcyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIHBhcmFtc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgb3B0aW9uVmFsdWUgPSBvcHRpb25WYWx1ZS5hcHBseSh2b2lkIDAsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25WYWx1ZSkge1xuICAgICAgaWYgKG9wdGlvblZhbHVlID09PSB1bmRlZmluZWQgfHwgb3B0aW9uVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25WYWx1ZTtcbiAgICAgIH0gLy8gZWxzZSwgZW1wdHkgc3RyaW5nIChpbnZhbGlkKSwgbnVsbCAoaW52YWxpZCksIDAgKGludmFsaWQpXG5cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYFwiLmNvbmNhdChvcHRpb25OYW1lLCBcImAgd2FzIHNwZWNpZmllZCBidXQgd2FzIG5vdCBhIG5vZGUsIG9yIGRpZCBub3QgcmV0dXJuIGEgbm9kZVwiKSk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBvcHRpb25WYWx1ZTsgLy8gY291bGQgYmUgSFRNTEVsZW1lbnQsIFNWR0VsZW1lbnQsIG9yIG5vbi1lbXB0eSBzdHJpbmcgYXQgdGhpcyBwb2ludFxuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5vZGUgPSBkb2MucXVlcnlTZWxlY3RvcihvcHRpb25WYWx1ZSk7IC8vIHJlc29sdmUgdG8gbm9kZSwgb3IgbnVsbCBpZiBmYWlsc1xuXG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYFwiLmNvbmNhdChvcHRpb25OYW1lLCBcImAgYXMgc2VsZWN0b3IgcmVmZXJzIHRvIG5vIGtub3duIG5vZGVcIikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9O1xuXG4gIHZhciBnZXRJbml0aWFsRm9jdXNOb2RlID0gZnVuY3Rpb24gZ2V0SW5pdGlhbEZvY3VzTm9kZSgpIHtcbiAgICB2YXIgbm9kZSA9IGdldE5vZGVGb3JPcHRpb24oJ2luaXRpYWxGb2N1cycpOyAvLyBmYWxzZSBleHBsaWNpdGx5IGluZGljYXRlcyB3ZSB3YW50IG5vIGluaXRpYWxGb2N1cyBhdCBhbGxcblxuICAgIGlmIChub2RlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIG9wdGlvbiBub3Qgc3BlY2lmaWVkOiB1c2UgZmFsbGJhY2sgb3B0aW9uc1xuICAgICAgaWYgKGNvbnRhaW5lcnNDb250YWluKGRvYy5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICBub2RlID0gZG9jLmFjdGl2ZUVsZW1lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZmlyc3RUYWJiYWJsZUdyb3VwID0gc3RhdGUudGFiYmFibGVHcm91cHNbMF07XG4gICAgICAgIHZhciBmaXJzdFRhYmJhYmxlTm9kZSA9IGZpcnN0VGFiYmFibGVHcm91cCAmJiBmaXJzdFRhYmJhYmxlR3JvdXAuZmlyc3RUYWJiYWJsZU5vZGU7IC8vIE5PVEU6IGBmYWxsYmFja0ZvY3VzYCBvcHRpb24gZnVuY3Rpb24gY2Fubm90IHJldHVybiBgZmFsc2VgIChub3Qgc3VwcG9ydGVkKVxuXG4gICAgICAgIG5vZGUgPSBmaXJzdFRhYmJhYmxlTm9kZSB8fCBnZXROb2RlRm9yT3B0aW9uKCdmYWxsYmFja0ZvY3VzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFub2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdXIgZm9jdXMtdHJhcCBuZWVkcyB0byBoYXZlIGF0IGxlYXN0IG9uZSBmb2N1c2FibGUgZWxlbWVudCcpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9O1xuXG4gIHZhciB1cGRhdGVUYWJiYWJsZU5vZGVzID0gZnVuY3Rpb24gdXBkYXRlVGFiYmFibGVOb2RlcygpIHtcbiAgICBzdGF0ZS50YWJiYWJsZUdyb3VwcyA9IHN0YXRlLmNvbnRhaW5lcnMubWFwKGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICAgIHZhciB0YWJiYWJsZU5vZGVzID0gdGFiYmFibGUoY29udGFpbmVyKTtcblxuICAgICAgaWYgKHRhYmJhYmxlTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAgICAgIGZpcnN0VGFiYmFibGVOb2RlOiB0YWJiYWJsZU5vZGVzWzBdLFxuICAgICAgICAgIGxhc3RUYWJiYWJsZU5vZGU6IHRhYmJhYmxlTm9kZXNbdGFiYmFibGVOb2Rlcy5sZW5ndGggLSAxXVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoZ3JvdXApIHtcbiAgICAgIHJldHVybiAhIWdyb3VwO1xuICAgIH0pOyAvLyByZW1vdmUgZ3JvdXBzIHdpdGggbm8gdGFiYmFibGUgbm9kZXNcbiAgICAvLyB0aHJvdyBpZiBubyBncm91cHMgaGF2ZSB0YWJiYWJsZSBub2RlcyBhbmQgd2UgZG9uJ3QgaGF2ZSBhIGZhbGxiYWNrIGZvY3VzIG5vZGUgZWl0aGVyXG5cbiAgICBpZiAoc3RhdGUudGFiYmFibGVHcm91cHMubGVuZ3RoIDw9IDAgJiYgIWdldE5vZGVGb3JPcHRpb24oJ2ZhbGxiYWNrRm9jdXMnKSAvLyByZXR1cm5pbmcgZmFsc2Ugbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvcHRpb25cbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91ciBmb2N1cy10cmFwIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgY29udGFpbmVyIHdpdGggYXQgbGVhc3Qgb25lIHRhYmJhYmxlIG5vZGUgaW4gaXQgYXQgYWxsIHRpbWVzJyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciB0cnlGb2N1cyA9IGZ1bmN0aW9uIHRyeUZvY3VzKG5vZGUpIHtcbiAgICBpZiAobm9kZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gZG9jLmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIW5vZGUgfHwgIW5vZGUuZm9jdXMpIHtcbiAgICAgIHRyeUZvY3VzKGdldEluaXRpYWxGb2N1c05vZGUoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5mb2N1cyh7XG4gICAgICBwcmV2ZW50U2Nyb2xsOiAhIWNvbmZpZy5wcmV2ZW50U2Nyb2xsXG4gICAgfSk7XG4gICAgc3RhdGUubW9zdFJlY2VudGx5Rm9jdXNlZE5vZGUgPSBub2RlO1xuXG4gICAgaWYgKGlzU2VsZWN0YWJsZUlucHV0KG5vZGUpKSB7XG4gICAgICBub2RlLnNlbGVjdCgpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgZ2V0UmV0dXJuRm9jdXNOb2RlID0gZnVuY3Rpb24gZ2V0UmV0dXJuRm9jdXNOb2RlKHByZXZpb3VzQWN0aXZlRWxlbWVudCkge1xuICAgIHZhciBub2RlID0gZ2V0Tm9kZUZvck9wdGlvbignc2V0UmV0dXJuRm9jdXMnLCBwcmV2aW91c0FjdGl2ZUVsZW1lbnQpO1xuICAgIHJldHVybiBub2RlID8gbm9kZSA6IG5vZGUgPT09IGZhbHNlID8gZmFsc2UgOiBwcmV2aW91c0FjdGl2ZUVsZW1lbnQ7XG4gIH07IC8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBvbiBtb3VzZWRvd24gYW5kIHRvdWNoc3RhcnQgaW5zdGVhZCBvZiBjbGlja1xuICAvLyBzbyB0aGF0IGl0IHByZWNlZGVzIHRoZSBmb2N1cyBldmVudC5cblxuXG4gIHZhciBjaGVja1BvaW50ZXJEb3duID0gZnVuY3Rpb24gY2hlY2tQb2ludGVyRG93bihlKSB7XG4gICAgdmFyIHRhcmdldCA9IGdldEFjdHVhbFRhcmdldChlKTtcblxuICAgIGlmIChjb250YWluZXJzQ29udGFpbih0YXJnZXQpKSB7XG4gICAgICAvLyBhbGxvdyB0aGUgY2xpY2sgc2luY2UgaXQgb2N1cnJlZCBpbnNpZGUgdGhlIHRyYXBcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVPckhhbmRsZXIoY29uZmlnLmNsaWNrT3V0c2lkZURlYWN0aXZhdGVzLCBlKSkge1xuICAgICAgLy8gaW1tZWRpYXRlbHkgZGVhY3RpdmF0ZSB0aGUgdHJhcFxuICAgICAgdHJhcC5kZWFjdGl2YXRlKHtcbiAgICAgICAgLy8gaWYsIG9uIGRlYWN0aXZhdGlvbiwgd2Ugc2hvdWxkIHJldHVybiBmb2N1cyB0byB0aGUgbm9kZSBvcmlnaW5hbGx5LWZvY3VzZWRcbiAgICAgICAgLy8gIHdoZW4gdGhlIHRyYXAgd2FzIGFjdGl2YXRlZCAob3IgdGhlIGNvbmZpZ3VyZWQgYHNldFJldHVybkZvY3VzYCBub2RlKSxcbiAgICAgICAgLy8gIHRoZW4gYXNzdW1lIGl0J3MgYWxzbyBPSyB0byByZXR1cm4gZm9jdXMgdG8gdGhlIG91dHNpZGUgbm9kZSB0aGF0IHdhc1xuICAgICAgICAvLyAganVzdCBjbGlja2VkLCBjYXVzaW5nIGRlYWN0aXZhdGlvbiwgYXMgbG9uZyBhcyB0aGF0IG5vZGUgaXMgZm9jdXNhYmxlO1xuICAgICAgICAvLyAgaWYgaXQgaXNuJ3QgZm9jdXNhYmxlLCB0aGVuIHJldHVybiBmb2N1cyB0byB0aGUgb3JpZ2luYWwgbm9kZSBmb2N1c2VkXG4gICAgICAgIC8vICBvbiBhY3RpdmF0aW9uIChvciB0aGUgY29uZmlndXJlZCBgc2V0UmV0dXJuRm9jdXNgIG5vZGUpXG4gICAgICAgIC8vIE5PVEU6IGJ5IHNldHRpbmcgYHJldHVybkZvY3VzOiBmYWxzZWAsIGRlYWN0aXZhdGUoKSB3aWxsIGRvIG5vdGhpbmcsXG4gICAgICAgIC8vICB3aGljaCB3aWxsIHJlc3VsdCBpbiB0aGUgb3V0c2lkZSBjbGljayBzZXR0aW5nIGZvY3VzIHRvIHRoZSBub2RlXG4gICAgICAgIC8vICB0aGF0IHdhcyBjbGlja2VkLCB3aGV0aGVyIGl0J3MgZm9jdXNhYmxlIG9yIG5vdDsgYnkgc2V0dGluZ1xuICAgICAgICAvLyAgYHJldHVybkZvY3VzOiB0cnVlYCwgd2UnbGwgYXR0ZW1wdCB0byByZS1mb2N1cyB0aGUgbm9kZSBvcmlnaW5hbGx5LWZvY3VzZWRcbiAgICAgICAgLy8gIG9uIGFjdGl2YXRpb24gKG9yIHRoZSBjb25maWd1cmVkIGBzZXRSZXR1cm5Gb2N1c2Agbm9kZSlcbiAgICAgICAgcmV0dXJuRm9jdXM6IGNvbmZpZy5yZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZSAmJiAhaXNGb2N1c2FibGUodGFyZ2V0KVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgbW9iaWxlIGRldmljZXMuXG4gICAgLy8gKElmIHdlJ2xsIG9ubHkgbGV0IGBjbGlja2AgZXZlbnRzIHRocm91Z2gsXG4gICAgLy8gdGhlbiBvbiBtb2JpbGUgdGhleSB3aWxsIGJlIGJsb2NrZWQgYW55d2F5cyBpZiBgdG91Y2hzdGFydGAgaXMgYmxvY2tlZC4pXG5cblxuICAgIGlmICh2YWx1ZU9ySGFuZGxlcihjb25maWcuYWxsb3dPdXRzaWRlQ2xpY2ssIGUpKSB7XG4gICAgICAvLyBhbGxvdyB0aGUgY2xpY2sgb3V0c2lkZSB0aGUgdHJhcCB0byB0YWtlIHBsYWNlXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBvdGhlcndpc2UsIHByZXZlbnQgdGhlIGNsaWNrXG5cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfTsgLy8gSW4gY2FzZSBmb2N1cyBlc2NhcGVzIHRoZSB0cmFwIGZvciBzb21lIHN0cmFuZ2UgcmVhc29uLCBwdWxsIGl0IGJhY2sgaW4uXG5cblxuICB2YXIgY2hlY2tGb2N1c0luID0gZnVuY3Rpb24gY2hlY2tGb2N1c0luKGUpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZ2V0QWN0dWFsVGFyZ2V0KGUpO1xuICAgIHZhciB0YXJnZXRDb250YWluZWQgPSBjb250YWluZXJzQ29udGFpbih0YXJnZXQpOyAvLyBJbiBGaXJlZm94IHdoZW4geW91IFRhYiBvdXQgb2YgYW4gaWZyYW1lIHRoZSBEb2N1bWVudCBpcyBicmllZmx5IGZvY3VzZWQuXG5cbiAgICBpZiAodGFyZ2V0Q29udGFpbmVkIHx8IHRhcmdldCBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICBpZiAodGFyZ2V0Q29udGFpbmVkKSB7XG4gICAgICAgIHN0YXRlLm1vc3RSZWNlbnRseUZvY3VzZWROb2RlID0gdGFyZ2V0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2NhcGVkISBwdWxsIGl0IGJhY2sgaW4gdG8gd2hlcmUgaXQganVzdCBsZWZ0XG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgdHJ5Rm9jdXMoc3RhdGUubW9zdFJlY2VudGx5Rm9jdXNlZE5vZGUgfHwgZ2V0SW5pdGlhbEZvY3VzTm9kZSgpKTtcbiAgICB9XG4gIH07IC8vIEhpamFjayBUYWIgZXZlbnRzIG9uIHRoZSBmaXJzdCBhbmQgbGFzdCBmb2N1c2FibGUgbm9kZXMgb2YgdGhlIHRyYXAsXG4gIC8vIGluIG9yZGVyIHRvIHByZXZlbnQgZm9jdXMgZnJvbSBlc2NhcGluZy4gSWYgaXQgZXNjYXBlcyBmb3IgZXZlbiBhXG4gIC8vIG1vbWVudCBpdCBjYW4gZW5kIHVwIHNjcm9sbGluZyB0aGUgcGFnZSBhbmQgY2F1c2luZyBjb25mdXNpb24gc28gd2VcbiAgLy8ga2luZCBvZiBuZWVkIHRvIGNhcHR1cmUgdGhlIGFjdGlvbiBhdCB0aGUga2V5ZG93biBwaGFzZS5cblxuXG4gIHZhciBjaGVja1RhYiA9IGZ1bmN0aW9uIGNoZWNrVGFiKGUpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZ2V0QWN0dWFsVGFyZ2V0KGUpO1xuICAgIHVwZGF0ZVRhYmJhYmxlTm9kZXMoKTtcbiAgICB2YXIgZGVzdGluYXRpb25Ob2RlID0gbnVsbDtcblxuICAgIGlmIChzdGF0ZS50YWJiYWJsZUdyb3Vwcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhlIHRhcmdldCBpcyBhY3R1YWxseSBjb250YWluZWQgaW4gYSBncm91cFxuICAgICAgLy8gTk9URTogdGhlIHRhcmdldCBtYXkgYWxzbyBiZSB0aGUgY29udGFpbmVyIGl0c2VsZiBpZiBpdCdzIGZvY3VzYWJsZVxuICAgICAgLy8gIHdpdGggdGFiSW5kZXg9Jy0xJyBhbmQgd2FzIGdpdmVuIGluaXRpYWwgZm9jdXNcbiAgICAgIHZhciBjb250YWluZXJJbmRleCA9IGZpbmRJbmRleChzdGF0ZS50YWJiYWJsZUdyb3VwcywgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IF9yZWYuY29udGFpbmVyO1xuICAgICAgICByZXR1cm4gY29udGFpbmVyLmNvbnRhaW5zKHRhcmdldCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGNvbnRhaW5lckluZGV4IDwgMCkge1xuICAgICAgICAvLyB0YXJnZXQgbm90IGZvdW5kIGluIGFueSBncm91cDogcXVpdGUgcG9zc2libGUgZm9jdXMgaGFzIGVzY2FwZWQgdGhlIHRyYXAsXG4gICAgICAgIC8vICBzbyBicmluZyBpdCBiYWNrIGluIHRvLi4uXG4gICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgLy8gLi4udGhlIGxhc3Qgbm9kZSBpbiB0aGUgbGFzdCBncm91cFxuICAgICAgICAgIGRlc3RpbmF0aW9uTm9kZSA9IHN0YXRlLnRhYmJhYmxlR3JvdXBzW3N0YXRlLnRhYmJhYmxlR3JvdXBzLmxlbmd0aCAtIDFdLmxhc3RUYWJiYWJsZU5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gLi4udGhlIGZpcnN0IG5vZGUgaW4gdGhlIGZpcnN0IGdyb3VwXG4gICAgICAgICAgZGVzdGluYXRpb25Ob2RlID0gc3RhdGUudGFiYmFibGVHcm91cHNbMF0uZmlyc3RUYWJiYWJsZU5vZGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAvLyBSRVZFUlNFXG4gICAgICAgIC8vIGlzIHRoZSB0YXJnZXQgdGhlIGZpcnN0IHRhYmJhYmxlIG5vZGUgaW4gYSBncm91cD9cbiAgICAgICAgdmFyIHN0YXJ0T2ZHcm91cEluZGV4ID0gZmluZEluZGV4KHN0YXRlLnRhYmJhYmxlR3JvdXBzLCBmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgICB2YXIgZmlyc3RUYWJiYWJsZU5vZGUgPSBfcmVmMi5maXJzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0ID09PSBmaXJzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHN0YXJ0T2ZHcm91cEluZGV4IDwgMCAmJiAoc3RhdGUudGFiYmFibGVHcm91cHNbY29udGFpbmVySW5kZXhdLmNvbnRhaW5lciA9PT0gdGFyZ2V0IHx8IGlzRm9jdXNhYmxlKHRhcmdldCkgJiYgIWlzVGFiYmFibGUodGFyZ2V0KSkpIHtcbiAgICAgICAgICAvLyBhbiBleGNlcHRpb24gY2FzZSB3aGVyZSB0aGUgdGFyZ2V0IGlzIGVpdGhlciB0aGUgY29udGFpbmVyIGl0c2VsZiwgb3JcbiAgICAgICAgICAvLyAgYSBub24tdGFiYmFibGUgbm9kZSB0aGF0IHdhcyBnaXZlbiBmb2N1cyAoaS5lLiB0YWJpbmRleCBpcyBuZWdhdGl2ZVxuICAgICAgICAgIC8vICBhbmQgdXNlciBjbGlja2VkIG9uIGl0IG9yIG5vZGUgd2FzIHByb2dyYW1tYXRpY2FsbHkgZ2l2ZW4gZm9jdXMpLCBpbiB3aGljaFxuICAgICAgICAgIC8vICBjYXNlLCB3ZSBzaG91bGQgaGFuZGxlIHNoaWZ0K3RhYiBhcyBpZiBmb2N1cyB3ZXJlIG9uIHRoZSBjb250YWluZXInc1xuICAgICAgICAgIC8vICBmaXJzdCB0YWJiYWJsZSBub2RlLCBhbmQgZ28gdG8gdGhlIGxhc3QgdGFiYmFibGUgbm9kZSBvZiB0aGUgTEFTVCBncm91cFxuICAgICAgICAgIHN0YXJ0T2ZHcm91cEluZGV4ID0gY29udGFpbmVySW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnRPZkdyb3VwSW5kZXggPj0gMCkge1xuICAgICAgICAgIC8vIFlFUzogdGhlbiBzaGlmdCt0YWIgc2hvdWxkIGdvIHRvIHRoZSBsYXN0IHRhYmJhYmxlIG5vZGUgaW4gdGhlXG4gICAgICAgICAgLy8gIHByZXZpb3VzIGdyb3VwIChhbmQgd3JhcCBhcm91bmQgdG8gdGhlIGxhc3QgdGFiYmFibGUgbm9kZSBvZlxuICAgICAgICAgIC8vICB0aGUgTEFTVCBncm91cCBpZiBpdCdzIHRoZSBmaXJzdCB0YWJiYWJsZSBub2RlIG9mIHRoZSBGSVJTVCBncm91cClcbiAgICAgICAgICB2YXIgZGVzdGluYXRpb25Hcm91cEluZGV4ID0gc3RhcnRPZkdyb3VwSW5kZXggPT09IDAgPyBzdGF0ZS50YWJiYWJsZUdyb3Vwcy5sZW5ndGggLSAxIDogc3RhcnRPZkdyb3VwSW5kZXggLSAxO1xuICAgICAgICAgIHZhciBkZXN0aW5hdGlvbkdyb3VwID0gc3RhdGUudGFiYmFibGVHcm91cHNbZGVzdGluYXRpb25Hcm91cEluZGV4XTtcbiAgICAgICAgICBkZXN0aW5hdGlvbk5vZGUgPSBkZXN0aW5hdGlvbkdyb3VwLmxhc3RUYWJiYWJsZU5vZGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZPUldBUkRcbiAgICAgICAgLy8gaXMgdGhlIHRhcmdldCB0aGUgbGFzdCB0YWJiYWJsZSBub2RlIGluIGEgZ3JvdXA/XG4gICAgICAgIHZhciBsYXN0T2ZHcm91cEluZGV4ID0gZmluZEluZGV4KHN0YXRlLnRhYmJhYmxlR3JvdXBzLCBmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgICB2YXIgbGFzdFRhYmJhYmxlTm9kZSA9IF9yZWYzLmxhc3RUYWJiYWJsZU5vZGU7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gbGFzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGxhc3RPZkdyb3VwSW5kZXggPCAwICYmIChzdGF0ZS50YWJiYWJsZUdyb3Vwc1tjb250YWluZXJJbmRleF0uY29udGFpbmVyID09PSB0YXJnZXQgfHwgaXNGb2N1c2FibGUodGFyZ2V0KSAmJiAhaXNUYWJiYWJsZSh0YXJnZXQpKSkge1xuICAgICAgICAgIC8vIGFuIGV4Y2VwdGlvbiBjYXNlIHdoZXJlIHRoZSB0YXJnZXQgaXMgdGhlIGNvbnRhaW5lciBpdHNlbGYsIG9yXG4gICAgICAgICAgLy8gIGEgbm9uLXRhYmJhYmxlIG5vZGUgdGhhdCB3YXMgZ2l2ZW4gZm9jdXMgKGkuZS4gdGFiaW5kZXggaXMgbmVnYXRpdmVcbiAgICAgICAgICAvLyAgYW5kIHVzZXIgY2xpY2tlZCBvbiBpdCBvciBub2RlIHdhcyBwcm9ncmFtbWF0aWNhbGx5IGdpdmVuIGZvY3VzKSwgaW4gd2hpY2hcbiAgICAgICAgICAvLyAgY2FzZSwgd2Ugc2hvdWxkIGhhbmRsZSB0YWIgYXMgaWYgZm9jdXMgd2VyZSBvbiB0aGUgY29udGFpbmVyJ3NcbiAgICAgICAgICAvLyAgbGFzdCB0YWJiYWJsZSBub2RlLCBhbmQgZ28gdG8gdGhlIGZpcnN0IHRhYmJhYmxlIG5vZGUgb2YgdGhlIEZJUlNUIGdyb3VwXG4gICAgICAgICAgbGFzdE9mR3JvdXBJbmRleCA9IGNvbnRhaW5lckluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxhc3RPZkdyb3VwSW5kZXggPj0gMCkge1xuICAgICAgICAgIC8vIFlFUzogdGhlbiB0YWIgc2hvdWxkIGdvIHRvIHRoZSBmaXJzdCB0YWJiYWJsZSBub2RlIGluIHRoZSBuZXh0XG4gICAgICAgICAgLy8gIGdyb3VwIChhbmQgd3JhcCBhcm91bmQgdG8gdGhlIGZpcnN0IHRhYmJhYmxlIG5vZGUgb2YgdGhlIEZJUlNUXG4gICAgICAgICAgLy8gIGdyb3VwIGlmIGl0J3MgdGhlIGxhc3QgdGFiYmFibGUgbm9kZSBvZiB0aGUgTEFTVCBncm91cClcbiAgICAgICAgICB2YXIgX2Rlc3RpbmF0aW9uR3JvdXBJbmRleCA9IGxhc3RPZkdyb3VwSW5kZXggPT09IHN0YXRlLnRhYmJhYmxlR3JvdXBzLmxlbmd0aCAtIDEgPyAwIDogbGFzdE9mR3JvdXBJbmRleCArIDE7XG5cbiAgICAgICAgICB2YXIgX2Rlc3RpbmF0aW9uR3JvdXAgPSBzdGF0ZS50YWJiYWJsZUdyb3Vwc1tfZGVzdGluYXRpb25Hcm91cEluZGV4XTtcbiAgICAgICAgICBkZXN0aW5hdGlvbk5vZGUgPSBfZGVzdGluYXRpb25Hcm91cC5maXJzdFRhYmJhYmxlTm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOT1RFOiB0aGUgZmFsbGJhY2tGb2N1cyBvcHRpb24gZG9lcyBub3Qgc3VwcG9ydCByZXR1cm5pbmcgZmFsc2UgdG8gb3B0LW91dFxuICAgICAgZGVzdGluYXRpb25Ob2RlID0gZ2V0Tm9kZUZvck9wdGlvbignZmFsbGJhY2tGb2N1cycpO1xuICAgIH1cblxuICAgIGlmIChkZXN0aW5hdGlvbk5vZGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRyeUZvY3VzKGRlc3RpbmF0aW9uTm9kZSk7XG4gICAgfSAvLyBlbHNlLCBsZXQgdGhlIGJyb3dzZXIgdGFrZSBjYXJlIG9mIFtzaGlmdCtddGFiIGFuZCBtb3ZlIHRoZSBmb2N1c1xuXG4gIH07XG5cbiAgdmFyIGNoZWNrS2V5ID0gZnVuY3Rpb24gY2hlY2tLZXkoZSkge1xuICAgIGlmIChpc0VzY2FwZUV2ZW50KGUpICYmIHZhbHVlT3JIYW5kbGVyKGNvbmZpZy5lc2NhcGVEZWFjdGl2YXRlcywgZSkgIT09IGZhbHNlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNUYWJFdmVudChlKSkge1xuICAgICAgY2hlY2tUYWIoZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9O1xuXG4gIHZhciBjaGVja0NsaWNrID0gZnVuY3Rpb24gY2hlY2tDbGljayhlKSB7XG4gICAgaWYgKHZhbHVlT3JIYW5kbGVyKGNvbmZpZy5jbGlja091dHNpZGVEZWFjdGl2YXRlcywgZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0ID0gZ2V0QWN0dWFsVGFyZ2V0KGUpO1xuXG4gICAgaWYgKGNvbnRhaW5lcnNDb250YWluKHRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVPckhhbmRsZXIoY29uZmlnLmFsbG93T3V0c2lkZUNsaWNrLCBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICB9OyAvL1xuICAvLyBFVkVOVCBMSVNURU5FUlNcbiAgLy9cblxuXG4gIHZhciBhZGRMaXN0ZW5lcnMgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSBsaXN0ZW5pbmcgZm9jdXMgdHJhcCBhdCBhIHRpbWVcblxuXG4gICAgYWN0aXZlRm9jdXNUcmFwcy5hY3RpdmF0ZVRyYXAodHJhcCk7IC8vIERlbGF5IGVuc3VyZXMgdGhhdCB0aGUgZm9jdXNlZCBlbGVtZW50IGRvZXNuJ3QgY2FwdHVyZSB0aGUgZXZlbnRcbiAgICAvLyB0aGF0IGNhdXNlZCB0aGUgZm9jdXMgdHJhcCBhY3RpdmF0aW9uLlxuXG4gICAgc3RhdGUuZGVsYXlJbml0aWFsRm9jdXNUaW1lciA9IGNvbmZpZy5kZWxheUluaXRpYWxGb2N1cyA/IGRlbGF5KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeUZvY3VzKGdldEluaXRpYWxGb2N1c05vZGUoKSk7XG4gICAgfSkgOiB0cnlGb2N1cyhnZXRJbml0aWFsRm9jdXNOb2RlKCkpO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgY2hlY2tGb2N1c0luLCB0cnVlKTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgY2hlY2tQb2ludGVyRG93biwge1xuICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgfSk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBjaGVja1BvaW50ZXJEb3duLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGVja0NsaWNrLCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGNoZWNrS2V5LCB7XG4gICAgICBjYXB0dXJlOiB0cnVlLFxuICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICB9KTtcbiAgICByZXR1cm4gdHJhcDtcbiAgfTtcblxuICB2YXIgcmVtb3ZlTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXJzKCkge1xuICAgIGlmICghc3RhdGUuYWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBjaGVja0ZvY3VzSW4sIHRydWUpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBjaGVja1BvaW50ZXJEb3duLCB0cnVlKTtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGNoZWNrUG9pbnRlckRvd24sIHRydWUpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGNoZWNrQ2xpY2ssIHRydWUpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgY2hlY2tLZXksIHRydWUpO1xuICAgIHJldHVybiB0cmFwO1xuICB9OyAvL1xuICAvLyBUUkFQIERFRklOSVRJT05cbiAgLy9cblxuXG4gIHRyYXAgPSB7XG4gICAgYWN0aXZhdGU6IGZ1bmN0aW9uIGFjdGl2YXRlKGFjdGl2YXRlT3B0aW9ucykge1xuICAgICAgaWYgKHN0YXRlLmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIG9uQWN0aXZhdGUgPSBnZXRPcHRpb24oYWN0aXZhdGVPcHRpb25zLCAnb25BY3RpdmF0ZScpO1xuICAgICAgdmFyIG9uUG9zdEFjdGl2YXRlID0gZ2V0T3B0aW9uKGFjdGl2YXRlT3B0aW9ucywgJ29uUG9zdEFjdGl2YXRlJyk7XG4gICAgICB2YXIgY2hlY2tDYW5Gb2N1c1RyYXAgPSBnZXRPcHRpb24oYWN0aXZhdGVPcHRpb25zLCAnY2hlY2tDYW5Gb2N1c1RyYXAnKTtcblxuICAgICAgaWYgKCFjaGVja0NhbkZvY3VzVHJhcCkge1xuICAgICAgICB1cGRhdGVUYWJiYWJsZU5vZGVzKCk7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLmFjdGl2ZSA9IHRydWU7XG4gICAgICBzdGF0ZS5wYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0YXRlLm5vZGVGb2N1c2VkQmVmb3JlQWN0aXZhdGlvbiA9IGRvYy5hY3RpdmVFbGVtZW50O1xuXG4gICAgICBpZiAob25BY3RpdmF0ZSkge1xuICAgICAgICBvbkFjdGl2YXRlKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBmaW5pc2hBY3RpdmF0aW9uID0gZnVuY3Rpb24gZmluaXNoQWN0aXZhdGlvbigpIHtcbiAgICAgICAgaWYgKGNoZWNrQ2FuRm9jdXNUcmFwKSB7XG4gICAgICAgICAgdXBkYXRlVGFiYmFibGVOb2RlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkTGlzdGVuZXJzKCk7XG5cbiAgICAgICAgaWYgKG9uUG9zdEFjdGl2YXRlKSB7XG4gICAgICAgICAgb25Qb3N0QWN0aXZhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKGNoZWNrQ2FuRm9jdXNUcmFwKSB7XG4gICAgICAgIGNoZWNrQ2FuRm9jdXNUcmFwKHN0YXRlLmNvbnRhaW5lcnMuY29uY2F0KCkpLnRoZW4oZmluaXNoQWN0aXZhdGlvbiwgZmluaXNoQWN0aXZhdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBmaW5pc2hBY3RpdmF0aW9uKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGRlYWN0aXZhdGU6IGZ1bmN0aW9uIGRlYWN0aXZhdGUoZGVhY3RpdmF0ZU9wdGlvbnMpIHtcbiAgICAgIGlmICghc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBjbGVhclRpbWVvdXQoc3RhdGUuZGVsYXlJbml0aWFsRm9jdXNUaW1lcik7IC8vIG5vb3AgaWYgdW5kZWZpbmVkXG5cbiAgICAgIHN0YXRlLmRlbGF5SW5pdGlhbEZvY3VzVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgIHN0YXRlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgc3RhdGUucGF1c2VkID0gZmFsc2U7XG4gICAgICBhY3RpdmVGb2N1c1RyYXBzLmRlYWN0aXZhdGVUcmFwKHRyYXApO1xuICAgICAgdmFyIG9uRGVhY3RpdmF0ZSA9IGdldE9wdGlvbihkZWFjdGl2YXRlT3B0aW9ucywgJ29uRGVhY3RpdmF0ZScpO1xuICAgICAgdmFyIG9uUG9zdERlYWN0aXZhdGUgPSBnZXRPcHRpb24oZGVhY3RpdmF0ZU9wdGlvbnMsICdvblBvc3REZWFjdGl2YXRlJyk7XG4gICAgICB2YXIgY2hlY2tDYW5SZXR1cm5Gb2N1cyA9IGdldE9wdGlvbihkZWFjdGl2YXRlT3B0aW9ucywgJ2NoZWNrQ2FuUmV0dXJuRm9jdXMnKTtcblxuICAgICAgaWYgKG9uRGVhY3RpdmF0ZSkge1xuICAgICAgICBvbkRlYWN0aXZhdGUoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJldHVybkZvY3VzID0gZ2V0T3B0aW9uKGRlYWN0aXZhdGVPcHRpb25zLCAncmV0dXJuRm9jdXMnLCAncmV0dXJuRm9jdXNPbkRlYWN0aXZhdGUnKTtcblxuICAgICAgdmFyIGZpbmlzaERlYWN0aXZhdGlvbiA9IGZ1bmN0aW9uIGZpbmlzaERlYWN0aXZhdGlvbigpIHtcbiAgICAgICAgZGVsYXkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChyZXR1cm5Gb2N1cykge1xuICAgICAgICAgICAgdHJ5Rm9jdXMoZ2V0UmV0dXJuRm9jdXNOb2RlKHN0YXRlLm5vZGVGb2N1c2VkQmVmb3JlQWN0aXZhdGlvbikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvblBvc3REZWFjdGl2YXRlKSB7XG4gICAgICAgICAgICBvblBvc3REZWFjdGl2YXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChyZXR1cm5Gb2N1cyAmJiBjaGVja0NhblJldHVybkZvY3VzKSB7XG4gICAgICAgIGNoZWNrQ2FuUmV0dXJuRm9jdXMoZ2V0UmV0dXJuRm9jdXNOb2RlKHN0YXRlLm5vZGVGb2N1c2VkQmVmb3JlQWN0aXZhdGlvbikpLnRoZW4oZmluaXNoRGVhY3RpdmF0aW9uLCBmaW5pc2hEZWFjdGl2YXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgZmluaXNoRGVhY3RpdmF0aW9uKCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHBhdXNlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAgIGlmIChzdGF0ZS5wYXVzZWQgfHwgIXN0YXRlLmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgc3RhdGUucGF1c2VkID0gdHJ1ZTtcbiAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB1bnBhdXNlOiBmdW5jdGlvbiB1bnBhdXNlKCkge1xuICAgICAgaWYgKCFzdGF0ZS5wYXVzZWQgfHwgIXN0YXRlLmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgc3RhdGUucGF1c2VkID0gZmFsc2U7XG4gICAgICB1cGRhdGVUYWJiYWJsZU5vZGVzKCk7XG4gICAgICBhZGRMaXN0ZW5lcnMoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgdXBkYXRlQ29udGFpbmVyRWxlbWVudHM6IGZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lckVsZW1lbnRzKGNvbnRhaW5lckVsZW1lbnRzKSB7XG4gICAgICB2YXIgZWxlbWVudHNBc0FycmF5ID0gW10uY29uY2F0KGNvbnRhaW5lckVsZW1lbnRzKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBzdGF0ZS5jb250YWluZXJzID0gZWxlbWVudHNBc0FycmF5Lm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnID8gZG9jLnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCkgOiBlbGVtZW50O1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgdXBkYXRlVGFiYmFibGVOb2RlcygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH07IC8vIGluaXRpYWxpemUgY29udGFpbmVyIGVsZW1lbnRzXG5cbiAgdHJhcC51cGRhdGVDb250YWluZXJFbGVtZW50cyhlbGVtZW50cyk7XG4gIHJldHVybiB0cmFwO1xufTtcblxuZXhwb3J0IHsgY3JlYXRlRm9jdXNUcmFwIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb2N1cy10cmFwLmVzbS5qcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IHJldHVybiBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfSwgX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsIFwicHJvdG90eXBlXCIsIHsgd3JpdGFibGU6IGZhbHNlIH0pOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCBcInByb3RvdHlwZVwiLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgUmVhY3RET00gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIFByb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnZm9jdXMtdHJhcCcpLFxuICAgIGNyZWF0ZUZvY3VzVHJhcCA9IF9yZXF1aXJlLmNyZWF0ZUZvY3VzVHJhcDsgLy8gVE9ETzogVGhlc2UgaXNzdWVzIGFyZSByZWxhdGVkIHRvIG9sZGVyIFJlYWN0IGZlYXR1cmVzIHdoaWNoIHdlJ2xsIGxpa2VseSBuZWVkXG4vLyAgdG8gZml4IGluIG9yZGVyIHRvIG1vdmUgdGhlIGNvZGUgZm9yd2FyZCB0byB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIFJlYWN0LlxuLy8gIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2RhdmlkdGhlY2xhcmsvZm9jdXMtdHJhcC1yZWFjdC9pc3N1ZXMvNzdcblxuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tZmluZC1kb20tbm9kZSAqL1xuXG5cbnZhciBGb2N1c1RyYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEZvY3VzVHJhcCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihGb2N1c1RyYXApO1xuXG4gIGZ1bmN0aW9uIEZvY3VzVHJhcChwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGb2N1c1RyYXApO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwcm9wcyk7IC8vIFdlIG5lZWQgdG8gaGlqYWNrIHRoZSByZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZSBvcHRpb24sXG4gICAgLy8gYmVjYXVzZSBSZWFjdCBjYW4gbW92ZSBmb2N1cyBpbnRvIHRoZSBlbGVtZW50IGJlZm9yZSB3ZSBhcnJpdmVkIGF0XG4gICAgLy8gdGhpcyBsaWZlY3ljbGUgaG9vayAoZS5nLiB3aXRoIGF1dG9Gb2N1cyBpbnB1dHMpLiBTbyB0aGUgY29tcG9uZW50XG4gICAgLy8gY2FwdHVyZXMgdGhlIHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCBpbiBjb21wb25lbnRXaWxsTW91bnQsXG4gICAgLy8gdGhlbiAob3B0aW9uYWxseSkgcmV0dXJucyBmb2N1cyB0byBpdCBpbiBjb21wb25lbnRXaWxsVW5tb3VudC5cblxuICAgIF90aGlzLnRhaWxvcmVkRm9jdXNUcmFwT3B0aW9ucyA9IHtcbiAgICAgIHJldHVybkZvY3VzT25EZWFjdGl2YXRlOiBmYWxzZVxuICAgIH07IC8vIGJlY2F1c2Ugb2YgdGhlIGFib3ZlLCB3ZSBtYWludGFpbiBvdXIgb3duIGZsYWcgZm9yIHRoaXMgb3B0aW9uLCBhbmRcbiAgICAvLyAgZGVmYXVsdCBpdCB0byBgdHJ1ZWAgYmVjYXVzZSB0aGF0J3MgZm9jdXMtdHJhcCdzIGRlZmF1bHRcblxuICAgIF90aGlzLnJldHVybkZvY3VzT25EZWFjdGl2YXRlID0gdHJ1ZTtcbiAgICB2YXIgZm9jdXNUcmFwT3B0aW9ucyA9IHByb3BzLmZvY3VzVHJhcE9wdGlvbnM7XG5cbiAgICBmb3IgKHZhciBvcHRpb25OYW1lIGluIGZvY3VzVHJhcE9wdGlvbnMpIHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZvY3VzVHJhcE9wdGlvbnMsIG9wdGlvbk5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9uTmFtZSA9PT0gJ3JldHVybkZvY3VzT25EZWFjdGl2YXRlJykge1xuICAgICAgICBfdGhpcy5yZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZSA9ICEhZm9jdXNUcmFwT3B0aW9uc1tvcHRpb25OYW1lXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25OYW1lID09PSAnb25Qb3N0RGVhY3RpdmF0ZScpIHtcbiAgICAgICAgX3RoaXMub25Qb3N0RGVhY3RpdmF0ZSA9IGZvY3VzVHJhcE9wdGlvbnNbb3B0aW9uTmFtZV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy50YWlsb3JlZEZvY3VzVHJhcE9wdGlvbnNbb3B0aW9uTmFtZV0gPSBmb2N1c1RyYXBPcHRpb25zW29wdGlvbk5hbWVdO1xuICAgIH0gLy8gZWxlbWVudHMgZnJvbSB3aGljaCB0byBjcmVhdGUgdGhlIGZvY3VzIHRyYXAgb24gbW91bnQ7IGlmIGEgY2hpbGQgaXMgdXNlZFxuICAgIC8vICBpbnN0ZWFkIG9mIHRoZSBgY29udGFpbmVyRWxlbWVudHNgIHByb3AsIHdlJ2xsIGdldCB0aGUgY2hpbGQncyByZWxhdGVkXG4gICAgLy8gIGVsZW1lbnQgd2hlbiB0aGUgdHJhcCByZW5kZXJzIGFuZCB0aGVuIGlzIGRlY2xhcmVkICdtb3VudGVkJ1xuXG5cbiAgICBfdGhpcy5mb2N1c1RyYXBFbGVtZW50cyA9IHByb3BzLmNvbnRhaW5lckVsZW1lbnRzIHx8IFtdOyAvLyBub3cgd2UgcmVtZW1iZXIgd2hhdCB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCBpcywgbm90IHJlbHlpbmcgb24gZm9jdXMtdHJhcFxuXG4gICAgX3RoaXMudXBkYXRlUHJldmlvdXNFbGVtZW50KCk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgZG9jdW1lbnQuXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudHx1bmRlZmluZWR9IENvbmZpZ3VyZWQgZG9jdW1lbnQsIGZhbGxpbmcgYmFjayB0byB0aGUgbWFpblxuICAgKiAgZG9jdW1lbnQsIGlmIGl0IGV4aXN0cy4gRHVyaW5nIFNTUiwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQgc2luY2UgdGhlXG4gICAqICBkb2N1bWVudCBkb2Vzbid0IGV4aXN0LlxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhGb2N1c1RyYXAsIFt7XG4gICAga2V5OiBcImdldERvY3VtZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICAgICAgLy8gU1NSOiBjYXJlZnVsIHRvIGNoZWNrIGlmIGBkb2N1bWVudGAgZXhpc3RzIGJlZm9yZSBhY2Nlc3NpbmcgaXQgYXMgYSB2YXJpYWJsZVxuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuZm9jdXNUcmFwT3B0aW9ucy5kb2N1bWVudCB8fCAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogdW5kZWZpbmVkKTtcbiAgICB9IC8vIFRPRE86IE5lZWQgbW9yZSB0ZXN0IGNvdmVyYWdlIGZvciB0aGlzIGZ1bmN0aW9uXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXROb2RlRm9yT3B0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5vZGVGb3JPcHRpb24ob3B0aW9uTmFtZSkge1xuICAgICAgdmFyIG9wdGlvblZhbHVlID0gdGhpcy50YWlsb3JlZEZvY3VzVHJhcE9wdGlvbnNbb3B0aW9uTmFtZV07XG5cbiAgICAgIGlmICghb3B0aW9uVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBub2RlID0gb3B0aW9uVmFsdWU7XG5cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciBfdGhpcyRnZXREb2N1bWVudDtcblxuICAgICAgICBub2RlID0gKF90aGlzJGdldERvY3VtZW50ID0gdGhpcy5nZXREb2N1bWVudCgpKSA9PT0gbnVsbCB8fCBfdGhpcyRnZXREb2N1bWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZ2V0RG9jdW1lbnQucXVlcnlTZWxlY3RvcihvcHRpb25WYWx1ZSk7XG5cbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYFwiLmNvbmNhdChvcHRpb25OYW1lLCBcImAgcmVmZXJzIHRvIG5vIGtub3duIG5vZGVcIikpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbm9kZSA9IG9wdGlvblZhbHVlKCk7XG5cbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYFwiLmNvbmNhdChvcHRpb25OYW1lLCBcImAgZGlkIG5vdCByZXR1cm4gYSBub2RlXCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UmV0dXJuRm9jdXNOb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJldHVybkZvY3VzTm9kZSgpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5nZXROb2RlRm9yT3B0aW9uKCdzZXRSZXR1cm5Gb2N1cycpO1xuICAgICAgcmV0dXJuIG5vZGUgPyBub2RlIDogdGhpcy5wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQ7XG4gICAgfVxuICAgIC8qKiBVcGRhdGUgdGhlIHByZXZpb3VzbHkgZm9jdXNlZCBlbGVtZW50IHdpdGggdGhlIGN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnQuICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVQcmV2aW91c0VsZW1lbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlUHJldmlvdXNFbGVtZW50KCkge1xuICAgICAgdmFyIGN1cnJlbnREb2N1bWVudCA9IHRoaXMuZ2V0RG9jdW1lbnQoKTtcblxuICAgICAgaWYgKGN1cnJlbnREb2N1bWVudCkge1xuICAgICAgICB0aGlzLnByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCA9IGN1cnJlbnREb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWFjdGl2YXRlVHJhcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWFjdGl2YXRlVHJhcCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgX3RoaXMkdGFpbG9yZWRGb2N1c1RyID0gdGhpcy50YWlsb3JlZEZvY3VzVHJhcE9wdGlvbnMsXG4gICAgICAgICAgY2hlY2tDYW5SZXR1cm5Gb2N1cyA9IF90aGlzJHRhaWxvcmVkRm9jdXNUci5jaGVja0NhblJldHVybkZvY3VzLFxuICAgICAgICAgIF90aGlzJHRhaWxvcmVkRm9jdXNUcjIgPSBfdGhpcyR0YWlsb3JlZEZvY3VzVHIucHJldmVudFNjcm9sbCxcbiAgICAgICAgICBwcmV2ZW50U2Nyb2xsID0gX3RoaXMkdGFpbG9yZWRGb2N1c1RyMiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfdGhpcyR0YWlsb3JlZEZvY3VzVHIyO1xuXG4gICAgICBpZiAodGhpcy5mb2N1c1RyYXApIHtcbiAgICAgICAgLy8gTk9URTogd2UgbmV2ZXIgbGV0IHRoZSB0cmFwIHJldHVybiB0aGUgZm9jdXMgc2luY2Ugd2UgZG8gdGhhdCBvdXJzZWx2ZXNcbiAgICAgICAgdGhpcy5mb2N1c1RyYXAuZGVhY3RpdmF0ZSh7XG4gICAgICAgICAgcmV0dXJuRm9jdXM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmluaXNoRGVhY3RpdmF0aW9uID0gZnVuY3Rpb24gZmluaXNoRGVhY3RpdmF0aW9uKCkge1xuICAgICAgICB2YXIgcmV0dXJuRm9jdXNOb2RlID0gX3RoaXMyLmdldFJldHVybkZvY3VzTm9kZSgpO1xuXG4gICAgICAgIHZhciBjYW5SZXR1cm5Gb2N1cyA9IChyZXR1cm5Gb2N1c05vZGUgPT09IG51bGwgfHwgcmV0dXJuRm9jdXNOb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXR1cm5Gb2N1c05vZGUuZm9jdXMpICYmIF90aGlzMi5yZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZTtcblxuICAgICAgICBpZiAoY2FuUmV0dXJuRm9jdXMpIHtcbiAgICAgICAgICAvKiogUmV0dXJucyBmb2N1cyB0byB0aGUgZWxlbWVudCB0aGF0IGhhZCBmb2N1cyB3aGVuIHRoZSB0cmFwIHdhcyBhY3RpdmF0ZWQuICovXG4gICAgICAgICAgcmV0dXJuRm9jdXNOb2RlLmZvY3VzKHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHByZXZlbnRTY3JvbGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpczIub25Qb3N0RGVhY3RpdmF0ZSkge1xuICAgICAgICAgIF90aGlzMi5vblBvc3REZWFjdGl2YXRlLmNhbGwobnVsbCk7IC8vIGRvbid0IGNhbGwgaXQgaW4gY29udGV4dCBvZiBcInRoaXNcIlxuXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChjaGVja0NhblJldHVybkZvY3VzKSB7XG4gICAgICAgIGNoZWNrQ2FuUmV0dXJuRm9jdXModGhpcy5nZXRSZXR1cm5Gb2N1c05vZGUoKSkudGhlbihmaW5pc2hEZWFjdGl2YXRpb24sIGZpbmlzaERlYWN0aXZhdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaW5pc2hEZWFjdGl2YXRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0dXBGb2N1c1RyYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0dXBGb2N1c1RyYXAoKSB7XG4gICAgICBpZiAoIXRoaXMuZm9jdXNUcmFwKSB7XG4gICAgICAgIHZhciBmb2N1c1RyYXBFbGVtZW50RE9NTm9kZXMgPSB0aGlzLmZvY3VzVHJhcEVsZW1lbnRzLm1hcCggLy8gTk9URTogYGZpbmRET01Ob2RlKClgIGRvZXMgbm90IHN1cHBvcnQgQ1NTIHNlbGVjdG9yczsgaXQnbGwganVzdCByZXR1cm5cbiAgICAgICAgLy8gIGEgbmV3IHRleHQgbm9kZSB3aXRoIHRoZSB0ZXh0IHdyYXBwZWQgaW4gaXQgaW5zdGVhZCBvZiB0cmVhdGluZyB0aGVcbiAgICAgICAgLy8gIHN0cmluZyBhcyBhIHNlbGVjdG9yIGFuZCByZXNvbHZpbmcgaXQgdG8gYSBub2RlIGluIHRoZSBET01cbiAgICAgICAgUmVhY3RET00uZmluZERPTU5vZGUpO1xuICAgICAgICB2YXIgbm9kZXNFeGlzdCA9IGZvY3VzVHJhcEVsZW1lbnRET01Ob2Rlcy5zb21lKEJvb2xlYW4pO1xuXG4gICAgICAgIGlmIChub2Rlc0V4aXN0KSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L3Byb3AtdHlwZXMgLS0gX2NyZWF0ZUZvY3VzVHJhcCBpcyBhbiBpbnRlcm5hbCBwcm9wXG4gICAgICAgICAgdGhpcy5mb2N1c1RyYXAgPSB0aGlzLnByb3BzLl9jcmVhdGVGb2N1c1RyYXAoZm9jdXNUcmFwRWxlbWVudERPTU5vZGVzLCB0aGlzLnRhaWxvcmVkRm9jdXNUcmFwT3B0aW9ucyk7XG5cbiAgICAgICAgICBpZiAodGhpcy5wcm9wcy5hY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLmFjdGl2YXRlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMucHJvcHMucGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzVHJhcC5wYXVzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLmFjdGl2ZSkge1xuICAgICAgICB0aGlzLnNldHVwRm9jdXNUcmFwKCk7XG4gICAgICB9IC8vIGVsc2UsIHdhaXQgZm9yIGxhdGVyIGFjdGl2YXRpb24gaW4gY2FzZSB0aGUgYGZvY3VzVHJhcE9wdGlvbnNgIHdpbGwgYmUgdXBkYXRlZFxuICAgICAgLy8gIGFnYWluIGJlZm9yZSB0aGUgdHJhcCBpcyBhY3RpdmF0ZWQgKGUuZy4gaWYgd2FpdGluZyB0byBrbm93IHdoYXQgdGhlIGRvY3VtZW50XG4gICAgICAvLyAgb2JqZWN0IHdpbGwgYmUsIHNvIHRoZSBUcmFwIG11c3QgYmUgcmVuZGVyZWQsIGJ1dCB0aGUgY29uc3VtZXIgaXMgd2FpdGluZyB0b1xuICAgICAgLy8gIGFjdGl2YXRlIHVudGlsIHRoZXkgaGF2ZSBvYnRhaW5lZCB0aGUgZG9jdW1lbnQgZnJvbSBhIHJlZilcbiAgICAgIC8vICBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2N1cy10cmFwL2ZvY3VzLXRyYXAtcmVhY3QvaXNzdWVzLzUzOVxuXG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICBpZiAodGhpcy5mb2N1c1RyYXApIHtcbiAgICAgICAgaWYgKHByZXZQcm9wcy5jb250YWluZXJFbGVtZW50cyAhPT0gdGhpcy5wcm9wcy5jb250YWluZXJFbGVtZW50cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLnVwZGF0ZUNvbnRhaW5lckVsZW1lbnRzKHRoaXMucHJvcHMuY29udGFpbmVyRWxlbWVudHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhhc0FjdGl2YXRlZCA9ICFwcmV2UHJvcHMuYWN0aXZlICYmIHRoaXMucHJvcHMuYWN0aXZlO1xuICAgICAgICB2YXIgaGFzRGVhY3RpdmF0ZWQgPSBwcmV2UHJvcHMuYWN0aXZlICYmICF0aGlzLnByb3BzLmFjdGl2ZTtcbiAgICAgICAgdmFyIGhhc1BhdXNlZCA9ICFwcmV2UHJvcHMucGF1c2VkICYmIHRoaXMucHJvcHMucGF1c2VkO1xuICAgICAgICB2YXIgaGFzVW5wYXVzZWQgPSBwcmV2UHJvcHMucGF1c2VkICYmICF0aGlzLnByb3BzLnBhdXNlZDtcblxuICAgICAgICBpZiAoaGFzQWN0aXZhdGVkKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVQcmV2aW91c0VsZW1lbnQoKTtcbiAgICAgICAgICB0aGlzLmZvY3VzVHJhcC5hY3RpdmF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc0RlYWN0aXZhdGVkKSB7XG4gICAgICAgICAgdGhpcy5kZWFjdGl2YXRlVHJhcCgpO1xuICAgICAgICAgIHJldHVybjsgLy8gdW4vcGF1c2UgZG9lcyBub3RoaW5nIG9uIGFuIGluYWN0aXZlIHRyYXBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNQYXVzZWQpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzVHJhcC5wYXVzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc1VucGF1c2VkKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c1RyYXAudW5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOT1RFOiBpZiB3ZSdyZSBpbiBgY29tcG9uZW50RGlkVXBkYXRlYCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIHRyYXAgeWV0LFxuICAgICAgICAvLyAgaXQgZWl0aGVyIG1lYW5zIGl0IHNob3VsZG4ndCBiZSBhY3RpdmUsIG9yIGl0IHNob3VsZCBiZSBidXQgbm9uZSBvZlxuICAgICAgICAvLyAgb2YgZ2l2ZW4gYGNvbnRhaW5lckVsZW1lbnRzYCB3ZXJlIHByZXNlbnQgaW4gdGhlIERPTSB0aGUgbGFzdCB0aW1lXG4gICAgICAgIC8vICB3ZSB0cmllZCB0byBjcmVhdGUgdGhlIHRyYXBcbiAgICAgICAgaWYgKHByZXZQcm9wcy5jb250YWluZXJFbGVtZW50cyAhPT0gdGhpcy5wcm9wcy5jb250YWluZXJFbGVtZW50cykge1xuICAgICAgICAgIHRoaXMuZm9jdXNUcmFwRWxlbWVudHMgPSB0aGlzLnByb3BzLmNvbnRhaW5lckVsZW1lbnRzO1xuICAgICAgICB9IC8vIGRvbid0IGNyZWF0ZSB0aGUgdHJhcCB1bmxlc3MgaXQgc2hvdWxkIGJlIGFjdGl2ZSBpbiBjYXNlIHRoZSBjb25zdW1lclxuICAgICAgICAvLyAgaXMgc3RpbGwgdXBkYXRpbmcgYGZvY3VzVHJhcE9wdGlvbnNgXG4gICAgICAgIC8vICBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mb2N1cy10cmFwL2ZvY3VzLXRyYXAtcmVhY3QvaXNzdWVzLzUzOVxuXG5cbiAgICAgICAgaWYgKHRoaXMucHJvcHMuYWN0aXZlKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVQcmV2aW91c0VsZW1lbnQoKTtcbiAgICAgICAgICB0aGlzLnNldHVwRm9jdXNUcmFwKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVUcmFwKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIGNoaWxkID0gdGhpcy5wcm9wcy5jaGlsZHJlbiA/IFJlYWN0LkNoaWxkcmVuLm9ubHkodGhpcy5wcm9wcy5jaGlsZHJlbikgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQudHlwZSAmJiBjaGlsZC50eXBlID09PSBSZWFjdC5GcmFnbWVudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSBmb2N1cy10cmFwIGNhbm5vdCB1c2UgYSBGcmFnbWVudCBhcyBpdHMgY2hpbGQgY29udGFpbmVyLiBUcnkgcmVwbGFjaW5nIGl0IHdpdGggYSA8ZGl2PiBlbGVtZW50LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbXBvc2VkUmVmQ2FsbGJhY2sgPSBmdW5jdGlvbiBjb21wb3NlZFJlZkNhbGxiYWNrKGVsZW1lbnQpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyRWxlbWVudHMgPSBfdGhpczMucHJvcHMuY29udGFpbmVyRWxlbWVudHM7XG5cbiAgICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGQucmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGNoaWxkLnJlZihlbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQucmVmKSB7XG4gICAgICAgICAgICAgIGNoaWxkLnJlZi5jdXJyZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczMuZm9jdXNUcmFwRWxlbWVudHMgPSBjb250YWluZXJFbGVtZW50cyA/IGNvbnRhaW5lckVsZW1lbnRzIDogW2VsZW1lbnRdO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBjaGlsZFdpdGhSZWYgPSBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgICAgICByZWY6IGNvbXBvc2VkUmVmQ2FsbGJhY2tcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjaGlsZFdpdGhSZWY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGb2N1c1RyYXA7XG59KFJlYWN0LkNvbXBvbmVudCk7IC8vIHN1cHBvcnQgc2VydmVyLXNpZGUgcmVuZGVyaW5nIHdoZXJlIGBFbGVtZW50YCB3aWxsIG5vdCBiZSBkZWZpbmVkXG5cblxudmFyIEVsZW1lbnRUeXBlID0gdHlwZW9mIEVsZW1lbnQgPT09ICd1bmRlZmluZWQnID8gRnVuY3Rpb24gOiBFbGVtZW50O1xuRm9jdXNUcmFwLnByb3BUeXBlcyA9IHtcbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcbiAgcGF1c2VkOiBQcm9wVHlwZXMuYm9vbCxcbiAgZm9jdXNUcmFwT3B0aW9uczogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBkb2N1bWVudDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBvbkFjdGl2YXRlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvblBvc3RBY3RpdmF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgY2hlY2tDYW5Gb2N1c1RyYXA6IFByb3BUeXBlcy5mdW5jLFxuICAgIG9uRGVhY3RpdmF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25Qb3N0RGVhY3RpdmF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgY2hlY2tDYW5SZXR1cm5Gb2N1czogUHJvcFR5cGVzLmZ1bmMsXG4gICAgaW5pdGlhbEZvY3VzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuaW5zdGFuY2VPZihFbGVtZW50VHlwZSksIFByb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5mdW5jLCBQcm9wVHlwZXMuYm9vbF0pLFxuICAgIGZhbGxiYWNrRm9jdXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5pbnN0YW5jZU9mKEVsZW1lbnRUeXBlKSwgUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBlc2NhcGVEZWFjdGl2YXRlczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5mdW5jXSksXG4gICAgY2xpY2tPdXRzaWRlRGVhY3RpdmF0ZXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIHJldHVybkZvY3VzT25EZWFjdGl2YXRlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBzZXRSZXR1cm5Gb2N1czogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmluc3RhbmNlT2YoRWxlbWVudFR5cGUpLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuZnVuY10pLFxuICAgIGFsbG93T3V0c2lkZUNsaWNrOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICBwcmV2ZW50U2Nyb2xsOiBQcm9wVHlwZXMuYm9vbFxuICB9KSxcbiAgY29udGFpbmVyRWxlbWVudHM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5pbnN0YW5jZU9mKEVsZW1lbnRUeXBlKSksXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZWxlbWVudCwgLy8gUmVhY3QgZWxlbWVudFxuICBQcm9wVHlwZXMuaW5zdGFuY2VPZihFbGVtZW50VHlwZSkgLy8gRE9NIGVsZW1lbnRcbiAgXSkgLy8gTk9URTogX2NyZWF0ZUZvY3VzVHJhcCBpcyBpbnRlcm5hbCwgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSwgc28gd2UgZG9uJ3RcbiAgLy8gIHNwZWNpZnkgaXQgaGVyZS4gSXQncyBleHBlY3RlZCB0byBiZSBzZXQgdG8gdGhlIGZ1bmN0aW9uIHJldHVybmVkIGZyb21cbiAgLy8gIHJlcXVpcmUoJ2ZvY3VzLXRyYXAnKSwgb3Igb25lIHdpdGggYSBjb21wYXRpYmxlIGludGVyZmFjZS5cblxufTtcbkZvY3VzVHJhcC5kZWZhdWx0UHJvcHMgPSB7XG4gIGFjdGl2ZTogdHJ1ZSxcbiAgcGF1c2VkOiBmYWxzZSxcbiAgZm9jdXNUcmFwT3B0aW9uczoge30sXG4gIF9jcmVhdGVGb2N1c1RyYXA6IGNyZWF0ZUZvY3VzVHJhcFxufTtcbm1vZHVsZS5leHBvcnRzID0gRm9jdXNUcmFwOyIsImltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5cbi8vIFBhcmFtZXRlciBpcyB0aGUgYm9vbGVhbiwgd2l0aCBkZWZhdWx0IFwiZmFsc2VcIiB2YWx1ZVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlVG9nZ2xlKGluaXRpYWxTdGF0ZSA9IGZhbHNlKTogW2Jvb2xlYW4sIChuZXh0U3RhdGU/OiBib29sZWFuKSA9PiB2b2lkXSB7XG4gIC8vIEluaXRpYWxpemUgdGhlIHN0YXRlXG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gdXNlU3RhdGUoaW5pdGlhbFN0YXRlKTtcblxuICAvLyBEZWZpbmUgYW5kIG1lbW9yaXplIHRvZ2dsZXIgZnVuY3Rpb24gaW4gY2FzZSB3ZSBwYXNzIGRvd24gdGhlIGNvbW9wbmVudCxcbiAgLy8gVGhpcyBmdW5jdGlvbiBjaGFuZ2UgdGhlIGJvb2xlYW4gdmFsdWUgdG8gaXQncyBvcHBvc2l0ZSB2YWx1ZVxuICBjb25zdCB0b2dnbGUgPSB1c2VDYWxsYmFjaygobmV4dFN0YXRlPzogYm9vbGVhbikgPT4ge1xuICAgIGlmIChuZXh0U3RhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2V0U3RhdGUobmV4dFN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0U3RhdGUoKHN0YXRlKSA9PiAhc3RhdGUpO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIHJldHVybiBbc3RhdGUsIHRvZ2dsZV07XG59XG4iLCJpbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBhcHBDb250ZXh0IGZyb20gJy4uL3N0b3Jlcy9hcHBDb250ZXh0JztcclxuaW1wb3J0IHtkYWlseU5vdGVzU2VydmljZSwgZ2xvYmFsU3RhdGVTZXJ2aWNlLCBsb2NhdGlvblNlcnZpY2UsIG1lbW9TZXJ2aWNlLCByZXNvdXJjZVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xyXG5pbXBvcnQge3N0b3JhZ2V9IGZyb20gJy4uL2hlbHBlcnMvc3RvcmFnZSc7XHJcbmltcG9ydCBFZGl0b3IsIHtFZGl0b3JSZWZBY3Rpb25zfSBmcm9tICcuL0VkaXRvci9FZGl0b3InO1xyXG5pbXBvcnQgJy4uL2xlc3MvbWVtby1lZGl0b3IubGVzcyc7XHJcbmltcG9ydCAnLi4vbGVzcy9zZWxlY3QtZGF0ZS1waWNrZXIubGVzcyc7XHJcbmltcG9ydCB0YWcgZnJvbSAnLi4vaWNvbnMvdGFnLnN2Zyc7XHJcbmltcG9ydCBpbWFnZVN2ZyBmcm9tICcuLi9pY29ucy9pbWFnZS5zdmcnO1xyXG5pbXBvcnQgdGFza1N2ZyBmcm9tICcuLi9pY29ucy90YXNrLnN2Zyc7XHJcbmltcG9ydCBzaG93RWRpdG9yU3ZnIGZyb20gJy4uL2ljb25zL3Nob3ctZWRpdG9yLnN2Zyc7XHJcbmltcG9ydCBqb3VybmFsU3ZnIGZyb20gJy4uL2ljb25zL2pvdXJuYWwuc3ZnJztcclxuaW1wb3J0IHtEYXlQaWNrZXJ9IGZyb20gJ3JlYWN0LWRheS1waWNrZXInO1xyXG5pbXBvcnQge3VzZVBvcHBlcn0gZnJvbSAncmVhY3QtcG9wcGVyJztcclxuLy8gaW1wb3J0IHsgY3JlYXRlUG9wcGVyIH0gZnJvbSAnQHBvcHBlcmpzL2NvcmUnXHJcbi8vIGltcG9ydCB7IGZvcm1hdCwgaXNWYWxpZCwgcGFyc2UgfSBmcm9tICdkYXRlLWZucyc7XHJcbmltcG9ydCBGb2N1c1RyYXAgZnJvbSAnZm9jdXMtdHJhcC1yZWFjdCc7XHJcbmltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7RGVmYXVsdEVkaXRvckxvY2F0aW9uLCBEZWZhdWx0UHJlZml4LCBJbnNlcnREYXRlRm9ybWF0LCBVc2VCdXR0b25Ub1Nob3dFZGl0b3IsIEZvY3VzT25FZGl0b3J9IGZyb20gJy4uL21lbW9zJztcclxuaW1wb3J0IHVzZVRvZ2dsZSBmcm9tICcuLi9ob29rcy91c2VUb2dnbGUnO1xyXG4vLyBpbXBvcnQgZGFpbHlOb3Rlc1NlcnZpY2UgZnJvbSAnLi4vc2VydmljZXMvZGFpbHlOb3Rlc1NlcnZpY2UnO1xyXG4vLyBpbXBvcnQgeyBUYWdzU3VnZ2VzdCB9IGZyb20gXCIuLi9vYkNvbXBvbmVudHMvb2JUYWdTdWdnZXN0ZXJcIjtcclxuaW1wb3J0IHtOb3RpY2UsIFBsYXRmb3JtfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7TUVNT1NfVklFV19UWVBFfSBmcm9tICcuLi9jb25zdGFudHMnO1xyXG5pbXBvcnQge3R9IGZyb20gJy4uL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xyXG5cclxuY29uc3QgZ2V0Q3Vyc29yUG9zdGlvbiA9IChpbnB1dDogSFRNTFRleHRBcmVhRWxlbWVudCkgPT4ge1xyXG4gIGNvbnN0IHtcclxuICAgIG9mZnNldExlZnQ6IGlucHV0WCxcclxuICAgIG9mZnNldFRvcDogaW5wdXRZLFxyXG4gICAgb2Zmc2V0SGVpZ2h0OiBpbnB1dEgsXHJcbiAgICBvZmZzZXRXaWR0aDogaW5wdXRXLFxyXG4gICAgc2VsZWN0aW9uRW5kOiBzZWxlY3Rpb25Qb2ludCxcclxuICB9ID0gaW5wdXQ7XHJcbiAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gIGNvbnN0IGNvcHlTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGlucHV0KTtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29weVN0eWxlKSB7XHJcbiAgICBkaXYuc3R5bGUuc2V0UHJvcGVydHkoaXRlbSwgY29weVN0eWxlLmdldFByb3BlcnR5VmFsdWUoaXRlbSkpO1xyXG4gIH1cclxuICBkaXYuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gIGRpdi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgZGl2LnN0eWxlLndoaXRlU3BhY2UgPSAncHJlLXdyYXAnO1xyXG5cclxuICAvLyB3ZSBuZWVkIGEgY2hhcmFjdGVyIHRoYXQgd2lsbCByZXBsYWNlIHdoaXRlc3BhY2Ugd2hlbiBmaWxsaW5nIG91ciBkdW1teSBlbGVtZW50IGlmIGl0J3MgYSBzaW5nbGUgbGluZSA8aW5wdXQvPlxyXG4gIGNvbnN0IHN3YXAgPSAnLic7XHJcbiAgY29uc3QgaW5wdXRWYWx1ZSA9IGlucHV0LnRhZ05hbWUgPT09ICdJTlBVVCcgPyBpbnB1dC52YWx1ZS5yZXBsYWNlKC8gL2csIHN3YXApIDogaW5wdXQudmFsdWU7XHJcbiAgY29uc3QgdGV4dENvbnRlbnQgPSBpbnB1dFZhbHVlLnN1YnN0cmluZygwLCBzZWxlY3Rpb25Qb2ludCB8fCAwKTtcclxuICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDtcclxuICBpZiAoaW5wdXQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xyXG4gICAgZGl2LnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuICB9XHJcblxyXG4gIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgc3Bhbi50ZXh0Q29udGVudCA9IGlucHV0VmFsdWUuc3Vic3RyaW5nKHNlbGVjdGlvblBvaW50IHx8IDApIHx8ICcuJztcclxuICBkaXYuYXBwZW5kQ2hpbGQoc3Bhbik7XHJcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xyXG4gIGNvbnN0IHtvZmZzZXRMZWZ0OiBzcGFuWCwgb2Zmc2V0VG9wOiBzcGFuWSwgb2Zmc2V0SGVpZ2h0OiBzcGFuSCwgb2Zmc2V0V2lkdGg6IHNwYW5XfSA9IHNwYW47XHJcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkaXYpO1xyXG4gIHJldHVybiB7XHJcbiAgICB4OiBpbnB1dFggKyBzcGFuWCxcclxuICAgIHk6IGlucHV0WSArIHNwYW5ZLFxyXG4gICAgaDogaW5wdXRIICsgc3BhbkgsXHJcbiAgICB3OiBpbnB1dFcgKyBzcGFuVyxcclxuICB9O1xyXG59O1xyXG5cclxuaW50ZXJmYWNlIFByb3BzIHt9XHJcblxyXG5sZXQgaXNMaXN0OiBib29sZWFuO1xyXG5sZXQgaXNFZGl0b3IgPSBmYWxzZSBhcyBib29sZWFuO1xyXG5sZXQgaXNFZGl0b3JHbyA9IGZhbHNlIGFzIGJvb2xlYW47XHJcbmxldCBwb3NpdGlvblg6IG51bWJlcjtcclxuXHJcbmNvbnN0IE1lbW9FZGl0b3I6IFJlYWN0LkZDPFByb3BzPiA9ICgpID0+IHtcclxuICBjb25zdCB7Z2xvYmFsU3RhdGV9ID0gdXNlQ29udGV4dChhcHBDb250ZXh0KTtcclxuICBjb25zdCBbaXNMaXN0U2hvd24sIHRvZ2dsZUxpc3RdID0gdXNlVG9nZ2xlKGZhbHNlKTtcclxuICBjb25zdCBbaXNFZGl0b3JTaG93biwgdG9nZ2xlRWRpdG9yXSA9IHVzZVRvZ2dsZShmYWxzZSk7XHJcbiAgY29uc3QgZWRpdG9yUmVmID0gdXNlUmVmPEVkaXRvclJlZkFjdGlvbnM+KG51bGwpO1xyXG4gIGNvbnN0IHByZXZHbG9iYWxTdGF0ZVJlZiA9IHVzZVJlZihnbG9iYWxTdGF0ZSk7XHJcbiAgY29uc3QgW3NlbGVjdGVkLCBzZXRTZWxlY3RlZF0gPSB1c2VTdGF0ZTxEYXRlPigpO1xyXG4gIGNvbnN0IFtpc1BvcHBlck9wZW4sIHNldElzUG9wcGVyT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3Qge2FwcH0gPSBkYWlseU5vdGVzU2VydmljZS5nZXRTdGF0ZSgpO1xyXG5cclxuICBjb25zdCBwb3BwZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xyXG4gIGNvbnN0IFtwb3BwZXJFbGVtZW50LCBzZXRQb3BwZXJFbGVtZW50XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gIGxldCBwb3BwZXI7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoRGVmYXVsdFByZWZpeCA9PT0gJ0xpc3QnKSB7XHJcbiAgICAgIGlzTGlzdCA9IGZhbHNlO1xyXG4gICAgICB0b2dnbGVMaXN0KGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlzTGlzdCA9IHRydWU7XHJcbiAgICAgIHRvZ2dsZUxpc3QodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XHJcbiAgfSwgW10pO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKCFlZGl0b3JSZWYuY3VycmVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKChQbGF0Zm9ybS5pc01vYmlsZSA9PT0gdHJ1ZSB8fCB3aW5kb3cuaW5uZXJXaWR0aCA8IDg3NSkgJiYgVXNlQnV0dG9uVG9TaG93RWRpdG9yKSB7XHJcbiAgICAgIHRvZ2dsZUVkaXRvcih0cnVlKTtcclxuICAgIH1cclxuICAgIGlmIChGb2N1c09uRWRpdG9yKSB7XHJcbiAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgVXNlQnV0dG9uVG9TaG93RWRpdG9yID09PSB0cnVlICYmXHJcbiAgICAgIERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gJ0JvdHRvbScgJiZcclxuICAgICAgUGxhdGZvcm0uaXNNb2JpbGUgPT09IHRydWUgJiZcclxuICAgICAgd2luZG93LmlubmVyV2lkdGggPCA4NzVcclxuICAgICkge1xyXG4gICAgICBjb25zdCBsZWF2ZXMgPSBhcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShNRU1PU19WSUVXX1RZUEUpO1xyXG4gICAgICBsZXQgbWVtb3NIZWlnaHQ7XHJcbiAgICAgIGxldCBsZWFmVmlldztcclxuICAgICAgaWYgKGxlYXZlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgbGVhZiA9IGxlYXZlc1swXTtcclxuICAgICAgICBsZWFmVmlldyA9IGxlYWYudmlldy5jb250YWluZXJFbDtcclxuICAgICAgICBtZW1vc0hlaWdodCA9IGxlYWZWaWV3Lm9mZnNldEhlaWdodDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZWFmVmlldyA9IGRvY3VtZW50O1xyXG4gICAgICAgIG1lbW9zSGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkaXZUaGlzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICAgIGNvbnN0IG1lbW9FZGl0b3JEaXYgPSBsZWFmVmlldy5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgIFwiZGl2W2RhdGEtdHlwZT0nbWVtb3NfdmlldyddIC52aWV3LWNvbnRlbnQgLm1lbW8tZWRpdG9yLXdyYXBwZXJcIixcclxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgZGl2VGhpcy5zcmMgPSBgJHtzaG93RWRpdG9yU3ZnfWA7XHJcbiAgICAgIGlmIChpc0VkaXRvclNob3duKSB7XHJcbiAgICAgICAgZGl2VGhpcy5jbGFzc05hbWUgPSAnbWVtby1zaG93LWVkaXRvci1idXR0b24gaGlkZGVuJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkaXZUaGlzLmNsYXNzTmFtZSA9ICdtZW1vLXNob3ctZWRpdG9yLWJ1dHRvbic7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYnV0dG9uVG9wID0gbWVtb3NIZWlnaHQgLSAyMDA7XHJcbiAgICAgIGNvbnN0IGJ1dHRvbkxlZnQgPSB3aW5kb3cuaW5uZXJXaWR0aCAvIDIgLSAyNTtcclxuICAgICAgZGl2VGhpcy5zdHlsZS50b3AgPSBidXR0b25Ub3AgKyAncHgnO1xyXG4gICAgICBkaXZUaGlzLnN0eWxlLmxlZnQgPSBidXR0b25MZWZ0ICsgJ3B4JztcclxuXHJcbiAgICAgIGRpdlRoaXMub25jbGljayA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgc2NhbGVFbGVtZW50QW5pID0gZGl2VGhpcy5hbmltYXRlKFxyXG4gICAgICAgICAgW1xyXG4gICAgICAgICAgICAvLyBrZXlmcmFtZXNcclxuICAgICAgICAgICAge3RyYW5zZm9ybTogJ3JvdGF0ZSgwZGVnKSBzY2FsZSgxKSd9LFxyXG4gICAgICAgICAgICB7dHJhbnNmb3JtOiAncm90YXRlKDYwZGVnKSBzY2FsZSgxLjUpJ30sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvLyB0aW1pbmcgb3B0aW9uc1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxyXG4gICAgICAgICAgICBpdGVyYXRpb25zOiBJbmZpbml0eSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBkaXZUaGlzLmNsYXNzTmFtZSA9ICdtZW1vLXNob3ctZWRpdG9yLWJ1dHRvbiBoaWRkZW4nO1xyXG4gICAgICAgICAgaGFuZGxlU2hvd0VkaXRvcigpO1xyXG4gICAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XHJcbiAgICAgICAgICBzY2FsZUVsZW1lbnRBbmkucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgLy8gcm90YXRlRWxlbWVudEFuaS5wYXVzZSgpO1xyXG4gICAgICAgIH0sIDMwMCk7XHJcbiAgICAgIH07XHJcbiAgICAgIGxlYWZWaWV3LnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50LXdyYXBwZXInKS5wcmVwZW5kKGRpdlRoaXMpO1xyXG5cclxuICAgICAgY29uc3QgbWVtb2xpc3RTY3JvbGwgPSBsZWFmVmlldy5xdWVyeVNlbGVjdG9yKCcubWVtb2xpc3Qtd3JhcHBlcicpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBtZW1vbGlzdFNjcm9sbC5vbnNjcm9sbCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoaXNFZGl0b3IgJiYgIWlzRWRpdG9yR28pIHtcclxuICAgICAgICAgIGlzRWRpdG9yR28gPSB0cnVlO1xyXG4gICAgICAgICAgbGV0IHNjYWxlRWRpdG9yRWxlbWVudEFuaSA9IG1lbW9FZGl0b3JEaXYuYW5pbWF0ZShcclxuICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgIC8vIGtleWZyYW1lc1xyXG4gICAgICAgICAgICAgIHt0cmFuc2Zvcm06ICdzY2FsZSgxKScsIG9wYWNpdHk6IDF9LFxyXG4gICAgICAgICAgICAgIHt0cmFuc2Zvcm06ICdzY2FsZSgwLjQpJywgb3BhY2l0eTogMH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAvLyB0aW1pbmcgb3B0aW9uc1xyXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAsXHJcbiAgICAgICAgICAgICAgaXRlcmF0aW9uczogMSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBsZXQgc2NhbGVPbmVFbGVtZW50QW5pOiBBbmltYXRpb247XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2NhbGVPbmVFbGVtZW50QW5pID0gZGl2VGhpcy5hbmltYXRlKFxyXG4gICAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgIC8vIGtleWZyYW1lc1xyXG4gICAgICAgICAgICAgICAge3RyYW5zZm9ybTogJ3JvdGF0ZSgyMGRlZykgc2NhbGUoMS41KSd9LFxyXG4gICAgICAgICAgICAgICAge3RyYW5zZm9ybTogJ3JvdGF0ZSgwZGVnKSBzY2FsZSgxKSd9LFxyXG4gICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gdGltaW5nIG9wdGlvbnNcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAsXHJcbiAgICAgICAgICAgICAgICBpdGVyYXRpb25zOiAxLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGhhbmRsZVNob3dFZGl0b3IodHJ1ZSk7XHJcbiAgICAgICAgICAgIGRpdlRoaXMuY2xhc3NOYW1lID0gJ21lbW8tc2hvdy1lZGl0b3ItYnV0dG9uJztcclxuICAgICAgICAgIH0sIDMwMCk7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgc2NhbGVPbmVFbGVtZW50QW5pLmNhbmNlbCgpO1xyXG4gICAgICAgICAgICBzY2FsZUVkaXRvckVsZW1lbnRBbmkucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgfSwgNzAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBVc2VCdXR0b25Ub1Nob3dFZGl0b3IgPT09IGZhbHNlICYmXHJcbiAgICAgIERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gJ0JvdHRvbScgJiZcclxuICAgICAgUGxhdGZvcm0uaXNNb2JpbGUgPT09IHRydWUgJiZcclxuICAgICAgd2luZG93LmlubmVyV2lkdGggPCA4NzVcclxuICAgICkge1xyXG4gICAgICBoYW5kbGVTaG93RWRpdG9yKGZhbHNlKTtcclxuICAgICAgaWYgKEZvY3VzT25FZGl0b3IpIHtcclxuICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCFpc0VkaXRvcikge1xyXG4gICAgICAgIGhhbmRsZVNob3dFZGl0b3IoZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChGb2N1c09uRWRpdG9yKSB7XHJcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LCBbXSk7XHJcblxyXG4gIGlmICghUGxhdGZvcm0uaXNNb2JpbGUpIHtcclxuICAgIHBvcHBlciA9IHVzZVBvcHBlcihwb3BwZXJSZWYuY3VycmVudCwgcG9wcGVyRWxlbWVudCwge1xyXG4gICAgICBwbGFjZW1lbnQ6ICdyaWdodC1lbmQnLFxyXG4gICAgICBtb2RpZmllcnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnZmxpcCcsXHJcbiAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50czogWydib3R0b20nXSxcclxuICAgICAgICAgICAgcm9vdEJvdW5kYXJ5OiAnZG9jdW1lbnQnLCAvLyBieSBkZWZhdWx0LCBhbGwgdGhlIHBsYWNlbWVudHMgYXJlIGFsbG93ZWRcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG4gIH0gZWxzZSBpZiAoUGxhdGZvcm0uaXNNb2JpbGUgJiYgRGVmYXVsdEVkaXRvckxvY2F0aW9uICE9PSAnQm90dG9tJykge1xyXG4gICAgY29uc3Qgc2VsZXRvclBvcHVwV2lkdGggPSAyODA7XHJcbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggLSBwb3NpdGlvblggPiBzZWxldG9yUG9wdXBXaWR0aCAqIDEuMikge1xyXG4gICAgICBwb3BwZXIgPSB1c2VQb3BwZXIocG9wcGVyUmVmLmN1cnJlbnQsIHBvcHBlckVsZW1lbnQsIHtcclxuICAgICAgICBwbGFjZW1lbnQ6ICdyaWdodC1lbmQnLFxyXG4gICAgICAgIG1vZGlmaWVyczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnZmxpcCcsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IFsnbGVmdC1lbmQnXSxcclxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsIC8vIGJ5IGRlZmF1bHQsIGFsbCB0aGUgcGxhY2VtZW50cyBhcmUgYWxsb3dlZFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmICh3aW5kb3cuaW5uZXJXaWR0aCAtIHBvc2l0aW9uWCA8IHNlbGV0b3JQb3B1cFdpZHRoICYmIHdpbmRvdy5pbm5lcldpZHRoID4gc2VsZXRvclBvcHVwV2lkdGggKiAxLjUpIHtcclxuICAgICAgcG9wcGVyID0gdXNlUG9wcGVyKHBvcHBlclJlZi5jdXJyZW50LCBwb3BwZXJFbGVtZW50LCB7XHJcbiAgICAgICAgcGxhY2VtZW50OiAnbGVmdC1lbmQnLFxyXG4gICAgICAgIG1vZGlmaWVyczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnZmxpcCcsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IFsncmlnaHQtZW5kJ10sXHJcbiAgICAgICAgICAgICAgcm9vdEJvdW5kYXJ5OiAnZG9jdW1lbnQnLCAvLyBieSBkZWZhdWx0LCBhbGwgdGhlIHBsYWNlbWVudHMgYXJlIGFsbG93ZWRcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgcm9vdEJvdW5kYXJ5OiAnZG9jdW1lbnQnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBvcHBlciA9IHVzZVBvcHBlcihwb3BwZXJSZWYuY3VycmVudCwgcG9wcGVyRWxlbWVudCwge1xyXG4gICAgICAgIHBsYWNlbWVudDogJ2JvdHRvbScsXHJcbiAgICAgICAgbW9kaWZpZXJzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdmbGlwJyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50czogWydib3R0b20nXSxcclxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsIC8vIGJ5IGRlZmF1bHQsIGFsbCB0aGUgcGxhY2VtZW50cyBhcmUgYWxsb3dlZFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAoUGxhdGZvcm0uaXNNb2JpbGUgJiYgRGVmYXVsdEVkaXRvckxvY2F0aW9uID09PSAnQm90dG9tJykge1xyXG4gICAgY29uc3Qgc2VsZXRvclBvcHVwV2lkdGggPSAyODA7XHJcbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggLSBwb3NpdGlvblggPiBzZWxldG9yUG9wdXBXaWR0aCAqIDEuMikge1xyXG4gICAgICBwb3BwZXIgPSB1c2VQb3BwZXIocG9wcGVyUmVmLmN1cnJlbnQsIHBvcHBlckVsZW1lbnQsIHtcclxuICAgICAgICBwbGFjZW1lbnQ6ICd0b3AtZW5kJyxcclxuICAgICAgICBtb2RpZmllcnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ2ZsaXAnLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBbJ3RvcC1zdGFydCddLFxyXG4gICAgICAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JywgLy8gYnkgZGVmYXVsdCwgYWxsIHRoZSBwbGFjZW1lbnRzIGFyZSBhbGxvd2VkXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5pbm5lcldpZHRoIC0gcG9zaXRpb25YIDwgc2VsZXRvclBvcHVwV2lkdGggJiYgcG9zaXRpb25YID4gc2VsZXRvclBvcHVwV2lkdGgpIHtcclxuICAgICAgcG9wcGVyID0gdXNlUG9wcGVyKHBvcHBlclJlZi5jdXJyZW50LCBwb3BwZXJFbGVtZW50LCB7XHJcbiAgICAgICAgcGxhY2VtZW50OiAndG9wLXN0YXJ0JyxcclxuICAgICAgICBtb2RpZmllcnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ2ZsaXAnLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBbJ3RvcC1lbmQnXSxcclxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsIC8vIGJ5IGRlZmF1bHQsIGFsbCB0aGUgcGxhY2VtZW50cyBhcmUgYWxsb3dlZFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICByb290Qm91bmRhcnk6ICdkb2N1bWVudCcsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcG9wcGVyID0gdXNlUG9wcGVyKHBvcHBlclJlZi5jdXJyZW50LCBwb3BwZXJFbGVtZW50LCB7XHJcbiAgICAgICAgcGxhY2VtZW50OiAndG9wJyxcclxuICAgICAgICBtb2RpZmllcnM6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ2ZsaXAnLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBbJ3RvcCddLFxyXG4gICAgICAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JywgLy8gYnkgZGVmYXVsdCwgYWxsIHRoZSBwbGFjZW1lbnRzIGFyZSBhbGxvd2VkXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcclxuICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBwb3BwZXIgPSB1c2VQb3BwZXIocG9wcGVyUmVmLmN1cnJlbnQsIHBvcHBlckVsZW1lbnQsIHtcclxuICAgIC8vICAgcGxhY2VtZW50OiAndG9wJyxcclxuICAgIC8vICAgbW9kaWZpZXJzOiBbXHJcbiAgICAvLyAgICAge1xyXG4gICAgLy8gICAgICAgbmFtZTogJ2ZsaXAnLFxyXG4gICAgLy8gICAgICAgb3B0aW9uczoge1xyXG4gICAgLy8gICAgICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IFsndG9wJ10sXHJcbiAgICAvLyAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JywgLy8gYnkgZGVmYXVsdCwgYWxsIHRoZSBwbGFjZW1lbnRzIGFyZSBhbGxvd2VkXHJcbiAgICAvLyAgICAgICB9LFxyXG4gICAgLy8gICAgIH0sXHJcbiAgICAvLyAgICAge1xyXG4gICAgLy8gICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXHJcbiAgICAvLyAgICAgICBvcHRpb25zOiB7XHJcbiAgICAvLyAgICAgICAgIHJvb3RCb3VuZGFyeTogJ2RvY3VtZW50JyxcclxuICAgIC8vICAgICAgIH0sXHJcbiAgICAvLyAgICAgfSxcclxuICAgIC8vICAgXSxcclxuICAgIC8vIH0pO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgY2xvc2VQb3BwZXIgPSAoKSA9PiB7XHJcbiAgICBzZXRJc1BvcHBlck9wZW4oZmFsc2UpO1xyXG4gICAgLy8gYnV0dG9uUmVmPy5jdXJyZW50Py5mb2N1cygpO1xyXG4gIH07XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAoZ2xvYmFsU3RhdGUubWFya01lbW9JZCkge1xyXG4gICAgICBjb25zdCBlZGl0b3JDdXJyZW50VmFsdWUgPSBlZGl0b3JSZWYuY3VycmVudD8uZ2V0Q29udGVudCgpO1xyXG4gICAgICBjb25zdCBtZW1vTGlua1RleHQgPSBgJHtlZGl0b3JDdXJyZW50VmFsdWUgPyAnXFxuJyA6ICcnfSR7dCgnTUFSSycpfTogW0BNRU1PXSgke2dsb2JhbFN0YXRlLm1hcmtNZW1vSWR9KWA7XHJcbiAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5pbnNlcnRUZXh0KG1lbW9MaW5rVGV4dCk7XHJcbiAgICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRNYXJrTWVtb0lkKCcnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZ2xvYmFsU3RhdGUuZWRpdE1lbW9JZCAmJiBnbG9iYWxTdGF0ZS5lZGl0TWVtb0lkICE9PSBwcmV2R2xvYmFsU3RhdGVSZWYuY3VycmVudC5lZGl0TWVtb0lkKSB7XHJcbiAgICAgIGNvbnN0IGVkaXRNZW1vID0gbWVtb1NlcnZpY2UuZ2V0TWVtb0J5SWQoZ2xvYmFsU3RhdGUuZWRpdE1lbW9JZCk7XHJcbiAgICAgIGlmIChlZGl0TWVtbykge1xyXG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5zZXRDb250ZW50KGVkaXRNZW1vLmNvbnRlbnQucmVwbGFjZSgvXFw8YnJcXD4vZywgJ1xcbicpID8/ICcnKTtcclxuICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByZXZHbG9iYWxTdGF0ZVJlZi5jdXJyZW50ID0gZ2xvYmFsU3RhdGU7XHJcbiAgfSwgW2dsb2JhbFN0YXRlLm1hcmtNZW1vSWQsIGdsb2JhbFN0YXRlLmVkaXRNZW1vSWRdKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIG5ldyBUYWdzU3VnZ2VzdChhcHAsIGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQpO1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZVBhc3RlRXZlbnQgPSBhc3luYyAoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudC5jbGlwYm9hcmREYXRhICYmIGV2ZW50LmNsaXBib2FyZERhdGEuZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY29uc3QgZmlsZSA9IGV2ZW50LmNsaXBib2FyZERhdGEuZmlsZXNbMF07XHJcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgaGFuZGxlVXBsb2FkRmlsZShmaWxlKTtcclxuICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uaW5zZXJ0VGV4dCh1cmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBoYW5kbGVEcm9wRXZlbnQgPSBhc3luYyAoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyICYmIGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBjb25zdCBmaWxlID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzWzBdO1xyXG4gICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGhhbmRsZVVwbG9hZEZpbGUoZmlsZSk7XHJcbiAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/Lmluc2VydFRleHQodXJsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaGFuZGxlQ2xpY2tFdmVudCA9ICgpID0+IHtcclxuICAgICAgaGFuZGxlQ29udGVudENoYW5nZShlZGl0b3JSZWYuY3VycmVudD8uZWxlbWVudC52YWx1ZSA/PyAnJyk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZUtleURvd25FdmVudCA9ICgpID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaGFuZGxlQ29udGVudENoYW5nZShlZGl0b3JSZWYuY3VycmVudD8uZWxlbWVudC52YWx1ZSA/PyAnJyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgaGFuZGxlUGFzdGVFdmVudCk7XHJcbiAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBoYW5kbGVEcm9wRXZlbnQpO1xyXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNsaWNrRXZlbnQpO1xyXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlS2V5RG93bkV2ZW50KTtcclxuXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBlZGl0b3JSZWYuY3VycmVudD8uZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXN0ZScsIGhhbmRsZVBhc3RlRXZlbnQpO1xyXG4gICAgICBlZGl0b3JSZWYuY3VycmVudD8uZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgaGFuZGxlRHJvcEV2ZW50KTtcclxuICAgIH07XHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBoYW5kbGVVcGxvYWRGaWxlID0gdXNlQ2FsbGJhY2soYXN5bmMgKGZpbGU6IEZpbGUpID0+IHtcclxuICAgIGNvbnN0IHt0eXBlfSA9IGZpbGU7XHJcblxyXG4gICAgaWYgKCF0eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlJykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgcmVzb3VyY2VTZXJ2aWNlLnVwbG9hZChmaWxlKTtcclxuICAgICAgY29uc3QgdXJsID0gYCR7aW1hZ2V9YDtcclxuXHJcbiAgICAgIHJldHVybiB1cmw7XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoZXJyb3IpO1xyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlU2F2ZUJ0bkNsaWNrID0gdXNlQ2FsbGJhY2soYXN5bmMgKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKGNvbnRlbnQgPT09ICcnKSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoJ+WGheWuueS4jeiDveS4uuepuuWRgCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qge2VkaXRNZW1vSWR9ID0gZ2xvYmFsU3RhdGVTZXJ2aWNlLmdldFN0YXRlKCk7XHJcbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKCcmbmJzcDsnLCAnICcpO1xyXG5cclxuICAgIHNldEVkaXRvckNvbnRlbnRDYWNoZSgnJyk7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoZWRpdE1lbW9JZCkge1xyXG4gICAgICAgIGNvbnN0IHByZXZNZW1vID0gbWVtb1NlcnZpY2UuZ2V0TWVtb0J5SWQoZWRpdE1lbW9JZCk7XHJcbiAgICAgICAgaWYgKHByZXZNZW1vICYmIHByZXZNZW1vLmNvbnRlbnQgIT09IGNvbnRlbnQpIHtcclxuICAgICAgICAgIGNvbnN0IGVkaXRlZE1lbW8gPSBhd2FpdCBtZW1vU2VydmljZS51cGRhdGVNZW1vKHByZXZNZW1vLmlkLCBwcmV2TWVtby5jb250ZW50LCBjb250ZW50LCBwcmV2TWVtby5tZW1vVHlwZSk7XHJcbiAgICAgICAgICBlZGl0ZWRNZW1vLnVwZGF0ZWRBdCA9IHV0aWxzLmdldERhdGVUaW1lU3RyaW5nKERhdGUubm93KCkpO1xyXG4gICAgICAgICAgbWVtb1NlcnZpY2UuZWRpdE1lbW8oZWRpdGVkTWVtbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRFZGl0TWVtb0lkKCcnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBuZXdNZW1vID0gYXdhaXQgbWVtb1NlcnZpY2UuY3JlYXRlTWVtbyhjb250ZW50LCBpc0xpc3QpO1xyXG4gICAgICAgIG1lbW9TZXJ2aWNlLnB1c2hNZW1vKG5ld01lbW8pO1xyXG4gICAgICAgIC8vIG1lbW9TZXJ2aWNlLmZldGNoQWxsTWVtb3MoKTtcclxuICAgICAgICBsb2NhdGlvblNlcnZpY2UuY2xlYXJRdWVyeSgpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RWRpdG9yQ29udGVudENhY2hlKCcnKTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUNhbmNlbEJ0bkNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldEVkaXRNZW1vSWQoJycpO1xyXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQ/LnNldENvbnRlbnQoJycpO1xyXG4gICAgc2V0RWRpdG9yQ29udGVudENhY2hlKCcnKTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUNvbnRlbnRDaGFuZ2UgPSB1c2VDYWxsYmFjaygoY29udGVudDogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0ZW1wRGl2LmlubmVySFRNTCA9IGNvbnRlbnQ7XHJcbiAgICBpZiAodGVtcERpdi5pbm5lclRleHQudHJpbSgpID09PSAnJykge1xyXG4gICAgICBjb250ZW50ID0gJyc7XHJcbiAgICB9XHJcbiAgICBzZXRFZGl0b3JDb250ZW50Q2FjaGUoY29udGVudCk7XHJcblxyXG4gICAgaWYgKGVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGVkaXRvclJlZi5jdXJyZW50LmdldENvbnRlbnQoKTtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uU3RhcnQgPSBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICBjb25zdCBwcmV2U3RyaW5nID0gY3VycmVudFZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvblN0YXJ0KTtcclxuICAgICAgY29uc3QgbmV4dFN0cmluZyA9IGN1cnJlbnRWYWx1ZS5zbGljZShzZWxlY3Rpb25TdGFydCk7XHJcblxyXG4gICAgICBpZiAoKHByZXZTdHJpbmcuZW5kc1dpdGgoJ0AnKSB8fCBwcmV2U3RyaW5nLmVuZHNXaXRoKCfwn5OGJykpICYmIG5leHRTdHJpbmcuc3RhcnRzV2l0aCgnICcpKSB7XHJcbiAgICAgICAgdXBkYXRlRGF0ZVNlbGVjdG9yUG9wdXBQb3NpdGlvbigpO1xyXG4gICAgICAgIHNldElzUG9wcGVyT3Blbih0cnVlKTtcclxuICAgICAgfSBlbHNlIGlmICgocHJldlN0cmluZy5lbmRzV2l0aCgnQCcpIHx8IHByZXZTdHJpbmcuZW5kc1dpdGgoJ/Cfk4YnKSkgJiYgbmV4dFN0cmluZyA9PT0gJycpIHtcclxuICAgICAgICB1cGRhdGVEYXRlU2VsZWN0b3JQb3B1cFBvc2l0aW9uKCk7XHJcbiAgICAgICAgc2V0SXNQb3BwZXJPcGVuKHRydWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNldElzUG9wcGVyT3BlbihmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZURhdGVJbnNlcnRUcmlnZ2VyID0gKGRhdGU6IERhdGUpID0+IHtcclxuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRlKSB7XHJcbiAgICAgIGNsb3NlUG9wcGVyKCk7XHJcbiAgICAgIGlzTGlzdCA9IHRydWU7XHJcbiAgICAgIHRvZ2dsZUxpc3QodHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGVkaXRvclJlZi5jdXJyZW50LmdldENvbnRlbnQoKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0ID0gZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgIGNvbnN0IHByZXZTdHJpbmcgPSBjdXJyZW50VmFsdWUuc2xpY2UoMCwgc2VsZWN0aW9uU3RhcnQpO1xyXG4gICAgY29uc3QgbmV4dFN0cmluZyA9IGN1cnJlbnRWYWx1ZS5zbGljZShzZWxlY3Rpb25TdGFydCk7XHJcbiAgICBjb25zdCB0b2RheU1vbWVudCA9IG1vbWVudChkYXRlKTtcclxuXHJcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocHJldlN0cmluZy5lbmRzV2l0aCgnQCcpKSB7XHJcbiAgICAgIGlmIChJbnNlcnREYXRlRm9ybWF0ID09PSAnRGF0YXZpZXcnKSB7XHJcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC52YWx1ZSA9XHJcbiAgICAgICAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgICAgY3VycmVudFZhbHVlLnNsaWNlKDAsIGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgLSAxKSArXHJcbiAgICAgICAgICAnW2R1ZTo6JyArXHJcbiAgICAgICAgICB0b2RheU1vbWVudC5mb3JtYXQoJ1lZWVktTU0tREQnKSArXHJcbiAgICAgICAgICAnXScgK1xyXG4gICAgICAgICAgbmV4dFN0cmluZztcclxuICAgICAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0ICsgMTcsIHNlbGVjdGlvblN0YXJ0ICsgMTcpO1xyXG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50LmZvY3VzKCk7XHJcbiAgICAgICAgaGFuZGxlQ29udGVudENoYW5nZShlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnZhbHVlKTtcclxuICAgICAgfSBlbHNlIGlmIChJbnNlcnREYXRlRm9ybWF0ID09PSAnVGFza3MnKSB7XHJcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC52YWx1ZSA9XHJcbiAgICAgICAgICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gICAgICAgICAgY3VycmVudFZhbHVlLnNsaWNlKDAsIGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgLSAxKSArXHJcbiAgICAgICAgICAn8J+ThicgK1xyXG4gICAgICAgICAgdG9kYXlNb21lbnQuZm9ybWF0KCdZWVlZLU1NLUREJykgK1xyXG4gICAgICAgICAgbmV4dFN0cmluZztcclxuICAgICAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0ICsgMTEsIHNlbGVjdGlvblN0YXJ0ICsgMTEpO1xyXG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50LmZvY3VzKCk7XHJcbiAgICAgICAgaGFuZGxlQ29udGVudENoYW5nZShlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC52YWx1ZSA9XHJcbiAgICAgICAgLy9lc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICAgICAgICBwcmV2U3RyaW5nICsgdG9kYXlNb21lbnQuZm9ybWF0KCdZWVlZLU1NLUREJykgKyBuZXh0U3RyaW5nO1xyXG4gICAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0ICsgMTAsIHNlbGVjdGlvblN0YXJ0ICsgMTApO1xyXG4gICAgICBlZGl0b3JSZWYuY3VycmVudC5mb2N1cygpO1xyXG4gICAgICBoYW5kbGVDb250ZW50Q2hhbmdlKGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQudmFsdWUpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUNoYW5nZVN0YXR1cyA9ICgpID0+IHtcclxuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc0xpc3QpIHtcclxuICAgICAgaXNMaXN0ID0gZmFsc2U7XHJcbiAgICAgIHRvZ2dsZUxpc3QoZmFsc2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaXNMaXN0ID0gdHJ1ZTtcclxuICAgICAgdG9nZ2xlTGlzdCh0cnVlKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVTaG93RWRpdG9yID0gKGZsYWc/OiBib29sZWFuKSA9PiB7XHJcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNFZGl0b3IgfHwgZmxhZyA9PT0gdHJ1ZSkge1xyXG4gICAgICBpc0VkaXRvciA9IGZhbHNlO1xyXG4gICAgICB0b2dnbGVFZGl0b3IodHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpc0VkaXRvciA9IHRydWU7XHJcbiAgICAgIGlzRWRpdG9yR28gPSBmYWxzZTtcclxuICAgICAgdG9nZ2xlRWRpdG9yKGZhbHNlKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVUYWdUZXh0QnRuQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICBpZiAoIWVkaXRvclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBlZGl0b3JSZWYuY3VycmVudC5nZXRDb250ZW50KCk7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25TdGFydCA9IGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICBjb25zdCBwcmV2U3RyaW5nID0gY3VycmVudFZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvblN0YXJ0KTtcclxuICAgIGNvbnN0IG5leHRTdHJpbmcgPSBjdXJyZW50VmFsdWUuc2xpY2Uoc2VsZWN0aW9uU3RhcnQpO1xyXG5cclxuICAgIGxldCBuZXh0VmFsdWUgPSBwcmV2U3RyaW5nICsgJyMgJyArIG5leHRTdHJpbmc7XHJcbiAgICBsZXQgY3Vyc29ySW5kZXggPSBwcmV2U3RyaW5nLmxlbmd0aCArIDE7XHJcblxyXG4gICAgaWYgKHByZXZTdHJpbmcuZW5kc1dpdGgoJyMnKSAmJiBuZXh0U3RyaW5nLnN0YXJ0c1dpdGgoJyAnKSkge1xyXG4gICAgICBuZXh0VmFsdWUgPSBwcmV2U3RyaW5nLnNsaWNlKDAsIHByZXZTdHJpbmcubGVuZ3RoIC0gMSkgKyBuZXh0U3RyaW5nLnNsaWNlKDEpO1xyXG4gICAgICBjdXJzb3JJbmRleCA9IHByZXZTdHJpbmcubGVuZ3RoIC0gMTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0b3JSZWYuY3VycmVudC5lbGVtZW50LnZhbHVlID0gbmV4dFZhbHVlO1xyXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShjdXJzb3JJbmRleCwgY3Vyc29ySW5kZXgpO1xyXG5cclxuICAgIGVkaXRvclJlZi5jdXJyZW50LmZvY3VzKCk7XHJcbiAgICBoYW5kbGVDb250ZW50Q2hhbmdlKGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQudmFsdWUpO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgdXBkYXRlRGF0ZVNlbGVjdG9yUG9wdXBQb3NpdGlvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgIGlmICghZWRpdG9yUmVmLmN1cnJlbnQgfHwgIXBvcHBlclJlZi5jdXJyZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWxldG9yUG9wdXBXaWR0aCA9IDI4MDtcclxuICAgIGNvbnN0IGVkaXRvcldpZHRoID0gZWRpdG9yUmVmLmN1cnJlbnQuZWxlbWVudC5jbGllbnRXaWR0aDtcclxuXHJcbiAgICAvLyBwb3NpdGlvblggPSBlZGl0b3JXaWR0aDtcclxuXHJcbiAgICBjb25zdCB7eCwgeX0gPSBnZXRDdXJzb3JQb3N0aW9uKGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQpO1xyXG4gICAgLy8gY29uc3QgbGVmdCA9IHggKyBzZWxldG9yUG9wdXBXaWR0aCArIDE2ID4gZWRpdG9yV2lkdGggPyBlZGl0b3JXaWR0aCArIDIwIC0gc2VsZXRvclBvcHVwV2lkdGggOiB4ICsgMjtcclxuICAgIGxldCBsZWZ0OiBudW1iZXI7XHJcbiAgICBsZXQgdG9wOiBudW1iZXI7XHJcbiAgICBpZiAoIVBsYXRmb3JtLmlzTW9iaWxlKSB7XHJcbiAgICAgIGxlZnQgPSB4ICsgc2VsZXRvclBvcHVwV2lkdGggKyAxNiA+IGVkaXRvcldpZHRoID8geCArIDIgOiB4ICsgMjtcclxuICAgICAgdG9wID0geSArIDIwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIC0geCA+IHNlbGV0b3JQb3B1cFdpZHRoKSB7XHJcbiAgICAgICAgbGVmdCA9IHggKyBzZWxldG9yUG9wdXBXaWR0aCArIDE2ID4gZWRpdG9yV2lkdGggPyB4ICsgMiA6IHggKyAyO1xyXG4gICAgICB9IGVsc2UgaWYgKHdpbmRvdy5pbm5lcldpZHRoIC0geCA8IHNlbGV0b3JQb3B1cFdpZHRoKSB7XHJcbiAgICAgICAgbGVmdCA9IHggKyBzZWxldG9yUG9wdXBXaWR0aCArIDE2ID4gZWRpdG9yV2lkdGggPyB4ICsgMTggOiB4ICsgMTg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGVmdCA9IGVkaXRvclJlZi5jdXJyZW50LmVsZW1lbnQuY2xpZW50V2lkdGggLyAyO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChEZWZhdWx0RWRpdG9yTG9jYXRpb24gPT09ICdCb3R0b20nICYmIHdpbmRvdy5pbm5lcldpZHRoID4gODc1KSB7XHJcbiAgICAgICAgdG9wID0geSArIDIwO1xyXG4gICAgICB9IGVsc2UgaWYgKERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gJ0JvdHRvbScgJiYgd2luZG93LmlubmVyV2lkdGggPD0gODc1KSB7XHJcbiAgICAgICAgdG9wID0geSArIDM1O1xyXG4gICAgICB9IGVsc2UgaWYgKERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gJ1RvcCcgJiYgd2luZG93LmlubmVyV2lkdGggPD0gODc1KSB7XHJcbiAgICAgICAgdG9wID0geSArIDIwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcG9zaXRpb25YID0geDtcclxuXHJcbiAgICBwb3BwZXJSZWYuY3VycmVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XHJcbiAgICBwb3BwZXJSZWYuY3VycmVudC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlVXBsb2FkRmlsZUJ0bkNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgY29uc3QgaW5wdXRFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlucHV0RWwpO1xyXG4gICAgaW5wdXRFbC50eXBlID0gJ2ZpbGUnO1xyXG4gICAgaW5wdXRFbC5tdWx0aXBsZSA9IGZhbHNlO1xyXG4gICAgaW5wdXRFbC5hY2NlcHQgPSAnaW1hZ2UvcG5nLCBpbWFnZS9naWYsIGltYWdlL2pwZWcnO1xyXG4gICAgaW5wdXRFbC5vbmNoYW5nZSA9IGFzeW5jICgpID0+IHtcclxuICAgICAgaWYgKCFpbnB1dEVsLmZpbGVzIHx8IGlucHV0RWwuZmlsZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBmaWxlID0gaW5wdXRFbC5maWxlc1swXTtcclxuICAgICAgY29uc3QgdXJsID0gYXdhaXQgaGFuZGxlVXBsb2FkRmlsZShmaWxlKTtcclxuICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5pbnNlcnRUZXh0KHVybCk7XHJcbiAgICAgIH1cclxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChpbnB1dEVsKTtcclxuICAgIH07XHJcbiAgICBpbnB1dEVsLmNsaWNrKCk7XHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBzaG93RWRpdFN0YXR1cyA9IEJvb2xlYW4oZ2xvYmFsU3RhdGUuZWRpdE1lbW9JZCk7XHJcblxyXG4gIGNvbnN0IGVkaXRvckNvbmZpZyA9IHVzZU1lbW8oXHJcbiAgICAoKSA9PiAoe1xyXG4gICAgICBjbGFzc05hbWU6ICdtZW1vLWVkaXRvcicsXHJcbiAgICAgIGluaXRpYWxDb250ZW50OiBnZXRFZGl0b3JDb250ZW50Q2FjaGUoKSxcclxuICAgICAgcGxhY2Vob2xkZXI6IHQoJ1doYXQgZG8geW91IHRoaW5rIG5vdy4uLicpLFxyXG4gICAgICBzaG93Q29uZmlybUJ0bjogdHJ1ZSxcclxuICAgICAgc2hvd0NhbmNlbEJ0bjogc2hvd0VkaXRTdGF0dXMsXHJcbiAgICAgIHNob3dUb29sczogdHJ1ZSxcclxuICAgICAgb25Db25maXJtQnRuQ2xpY2s6IGhhbmRsZVNhdmVCdG5DbGljayxcclxuICAgICAgb25DYW5jZWxCdG5DbGljazogaGFuZGxlQ2FuY2VsQnRuQ2xpY2ssXHJcbiAgICAgIG9uQ29udGVudENoYW5nZTogaGFuZGxlQ29udGVudENoYW5nZSxcclxuICAgIH0pLFxyXG4gICAgW3Nob3dFZGl0U3RhdHVzXSxcclxuICApO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9e2BtZW1vLWVkaXRvci13cmFwcGVyICR7c2hvd0VkaXRTdGF0dXMgPyAnZWRpdC1pbmcnIDogJyd9ICR7aXNFZGl0b3JTaG93biA/ICdoaWRkZW4nIDogJyd9YH0+XHJcbiAgICAgIDxwIGNsYXNzTmFtZT17YHRpcC10ZXh0ICR7c2hvd0VkaXRTdGF0dXMgPyAnJyA6ICdoaWRkZW4nfWB9Pk1vZGlmeWluZy4uLjwvcD5cclxuICAgICAgPEVkaXRvclxyXG4gICAgICAgIHJlZj17ZWRpdG9yUmVmfVxyXG4gICAgICAgIHsuLi5lZGl0b3JDb25maWd9XHJcbiAgICAgICAgdG9vbHM9e1xyXG4gICAgICAgICAgPD5cclxuICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJhY3Rpb24tYnRuIGFkZC10YWdcIiBzcmM9e3RhZ30gb25DbGljaz17aGFuZGxlVGFnVGV4dEJ0bkNsaWNrfSAvPlxyXG4gICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImFjdGlvbi1idG4gZmlsZS11cGxvYWRcIiBzcmM9e2ltYWdlU3ZnfSBvbkNsaWNrPXtoYW5kbGVVcGxvYWRGaWxlQnRuQ2xpY2t9IC8+XHJcbiAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhY3Rpb24tYnRuIGxpc3Qtb3ItdGFza1wiXHJcbiAgICAgICAgICAgICAgc3JjPXtgJHshaXNMaXN0U2hvd24gPyBqb3VybmFsU3ZnIDogdGFza1N2Z31gfVxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNoYW5nZVN0YXR1c31cclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgey8qIDxpbWcgY2xhc3NOYW1lPXtgYWN0aW9uLWJ0biAke2lzTGlzdFNob3duID8gXCJcIiA6IFwiaGlkZGVuXCJ9YH0gc3JjPXt0YXNrU3ZnfSBvbkNsaWNrPXtoYW5kbGVDaGFuZ2VTdGF0dXN9IC8+ICovfVxyXG4gICAgICAgICAgPC8+XHJcbiAgICAgICAgfVxyXG4gICAgICAvPlxyXG4gICAgICA8ZGl2IHJlZj17cG9wcGVyUmVmfSBjbGFzc05hbWU9XCJkYXRlLXBpY2tlclwiPlxyXG4gICAgICAgIHtpc1BvcHBlck9wZW4gJiYgKFxyXG4gICAgICAgICAgPEZvY3VzVHJhcFxyXG4gICAgICAgICAgICBhY3RpdmVcclxuICAgICAgICAgICAgZm9jdXNUcmFwT3B0aW9ucz17e1xyXG4gICAgICAgICAgICAgIGluaXRpYWxGb2N1czogZmFsc2UsXHJcbiAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IHRydWUsXHJcbiAgICAgICAgICAgICAgY2xpY2tPdXRzaWRlRGVhY3RpdmF0ZXM6IHRydWUsXHJcbiAgICAgICAgICAgICAgb25EZWFjdGl2YXRlOiBjbG9zZVBvcHBlcixcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIHRhYkluZGV4PXstMX1cclxuICAgICAgICAgICAgICBzdHlsZT17cG9wcGVyLnN0eWxlcy5wb3BwZXJ9XHJcbiAgICAgICAgICAgICAgey4uLnBvcHBlci5hdHRyaWJ1dGVzLnBvcHBlcn1cclxuICAgICAgICAgICAgICByZWY9e3NldFBvcHBlckVsZW1lbnR9XHJcbiAgICAgICAgICAgICAgcm9sZT1cImRpYWxvZ1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8RGF5UGlja2VyXHJcbiAgICAgICAgICAgICAgICBpbml0aWFsRm9jdXM9e2lzUG9wcGVyT3Blbn1cclxuICAgICAgICAgICAgICAgIG1vZGU9XCJzaW5nbGVcIlxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1vbnRoPXtzZWxlY3RlZH1cclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkPXtzZWxlY3RlZH1cclxuICAgICAgICAgICAgICAgIG9uU2VsZWN0PXtoYW5kbGVEYXRlSW5zZXJ0VHJpZ2dlcn1cclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvRm9jdXNUcmFwPlxyXG4gICAgICAgICl9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIGdldEVkaXRvckNvbnRlbnRDYWNoZSgpOiBzdHJpbmcge1xyXG4gIHJldHVybiBzdG9yYWdlLmdldChbJ2VkaXRvckNvbnRlbnRDYWNoZSddKS5lZGl0b3JDb250ZW50Q2FjaGUgPz8gJyc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldEVkaXRvckNvbnRlbnRDYWNoZShjb250ZW50OiBzdHJpbmcpIHtcclxuICBzdG9yYWdlLnNldCh7XHJcbiAgICBlZGl0b3JDb250ZW50Q2FjaGU6IGNvbnRlbnQsXHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1lbW9FZGl0b3I7XHJcbiIsImltcG9ydCB7dH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcbmltcG9ydCB7SU1BR0VfVVJMX1JFRywgTElOS19SRUcsIE1FTU9fTElOS19SRUcsIE5PUF9GSVJTVF9UQUdfUkVHLCBUQUdfUkVHfSBmcm9tICcuL2NvbnN0cyc7XHJcblxyXG5leHBvcnQgY29uc3QgcmVsYXRpb25Db25zdHMgPSBbXHJcbiAge3RleHQ6ICdBTkQnLCB2YWx1ZTogJ0FORCd9LFxyXG4gIHt0ZXh0OiAnT1InLCB2YWx1ZTogJ09SJ30sXHJcbl07XHJcblxyXG5leHBvcnQgY29uc3QgZmlsdGVyQ29uc3RzID0ge1xyXG4gIFRBRzoge1xyXG4gICAgdmFsdWU6ICdUQUcnLFxyXG4gICAgdGV4dDogdCgnVEFHJyksXHJcbiAgICBvcGVyYXRvcnM6IFtcclxuICAgICAge1xyXG4gICAgICAgIHRleHQ6IHQoJ0lOQ0xVREUnKSxcclxuICAgICAgICB2YWx1ZTogJ0NPTlRBSU4nLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdGV4dDogdCgnRVhDTFVERScpLFxyXG4gICAgICAgIHZhbHVlOiAnTk9UX0NPTlRBSU4nLFxyXG4gICAgICB9LFxyXG4gICAgXSxcclxuICB9LFxyXG4gIFRZUEU6IHtcclxuICAgIHZhbHVlOiAnVFlQRScsXHJcbiAgICB0ZXh0OiB0KCdUWVBFJyksXHJcbiAgICBvcGVyYXRvcnM6IFtcclxuICAgICAge1xyXG4gICAgICAgIHZhbHVlOiAnSVMnLFxyXG4gICAgICAgIHRleHQ6IHQoJ0lTJyksXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICB2YWx1ZTogJ0lTX05PVCcsXHJcbiAgICAgICAgdGV4dDogdCgnSVNOT1QnKSxcclxuICAgICAgfSxcclxuICAgIF0sXHJcbiAgICB2YWx1ZXM6IFtcclxuICAgICAge1xyXG4gICAgICAgIHZhbHVlOiAnQ09OTkVDVEVEJyxcclxuICAgICAgICB0ZXh0OiB0KCdMSU5LRUQnKSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbHVlOiAnTk9UX1RBR0dFRCcsXHJcbiAgICAgICAgdGV4dDogdCgnTk8gVEFHUycpLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsdWU6ICdMSU5LRUQnLFxyXG4gICAgICAgIHRleHQ6IHQoJ0hBUyBMSU5LUycpLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgdmFsdWU6ICdJTUFHRUQnLFxyXG4gICAgICAgIHRleHQ6IHQoJ0hBUyBJTUFHRVMnKSxcclxuICAgICAgfSxcclxuICAgIF0sXHJcbiAgfSxcclxuICBURVhUOiB7XHJcbiAgICB2YWx1ZTogJ1RFWFQnLFxyXG4gICAgdGV4dDogdCgnVEVYVCcpLFxyXG4gICAgb3BlcmF0b3JzOiBbXHJcbiAgICAgIHtcclxuICAgICAgICB2YWx1ZTogJ0NPTlRBSU4nLFxyXG4gICAgICAgIHRleHQ6IHQoJ0lOQ0xVREUnKSxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHZhbHVlOiAnTk9UX0NPTlRBSU4nLFxyXG4gICAgICAgIHRleHQ6IHQoJ0VYQ0xVREUnKSxcclxuICAgICAgfSxcclxuICAgIF0sXHJcbiAgfSxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBtZW1vU3BlY2lhbFR5cGVzID0gZmlsdGVyQ29uc3RzWydUWVBFJ10udmFsdWVzO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldFRleHRXaXRoTWVtb1R5cGUgPSAodHlwZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBmb3IgKGNvbnN0IHQgb2YgbWVtb1NwZWNpYWxUeXBlcykge1xyXG4gICAgaWYgKHQudmFsdWUgPT09IHR5cGUpIHtcclxuICAgICAgcmV0dXJuIHQudGV4dDtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuICcnO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRGaWx0ZXIgPSAoKTogQmFzZUZpbHRlciA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHR5cGU6ICdUQUcnLFxyXG4gICAgdmFsdWU6IHtcclxuICAgICAgb3BlcmF0b3I6ICdDT05UQUlOJyxcclxuICAgICAgdmFsdWU6ICcnLFxyXG4gICAgfSxcclxuICAgIHJlbGF0aW9uOiAnQU5EJyxcclxuICB9O1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGNoZWNrU2hvdWxkU2hvd01lbW9XaXRoRmlsdGVycyA9IChtZW1vOiBNb2RlbC5NZW1vLCBmaWx0ZXJzOiBGaWx0ZXJbXSkgPT4ge1xyXG4gIGxldCBzaG91bGRTaG93ID0gdHJ1ZTtcclxuXHJcbiAgZm9yIChjb25zdCBmIG9mIGZpbHRlcnMpIHtcclxuICAgIGNvbnN0IHtyZWxhdGlvbn0gPSBmO1xyXG4gICAgY29uc3QgciA9IGNoZWNrU2hvdWxkU2hvd01lbW8obWVtbywgZik7XHJcbiAgICBpZiAocmVsYXRpb24gPT09ICdPUicpIHtcclxuICAgICAgc2hvdWxkU2hvdyA9IHNob3VsZFNob3cgfHwgcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNob3VsZFNob3cgPSBzaG91bGRTaG93ICYmIHI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gc2hvdWxkU2hvdztcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBjaGVja1Nob3VsZFNob3dNZW1vID0gKG1lbW86IE1vZGVsLk1lbW8sIGZpbHRlcjogRmlsdGVyKSA9PiB7XHJcbiAgY29uc3Qge1xyXG4gICAgdHlwZSxcclxuICAgIHZhbHVlOiB7b3BlcmF0b3IsIHZhbHVlfSxcclxuICB9ID0gZmlsdGVyO1xyXG5cclxuICBpZiAodmFsdWUgPT09ICcnKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGxldCBzaG91bGRTaG93ID0gdHJ1ZTtcclxuXHJcbiAgaWYgKHR5cGUgPT09ICdUQUcnKSB7XHJcbiAgICBsZXQgY29udGFpbmVkID0gdHJ1ZTtcclxuICAgIGNvbnN0IHRhZ3NTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgIGZvciAoY29uc3QgdCBvZiBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChUQUdfUkVHKSA/PyBbXSkpIHtcclxuICAgICAgY29uc3QgdGFnID0gdC5yZXBsYWNlKFRBR19SRUcsICckMScpLnRyaW0oKTtcclxuICAgICAgY29uc3QgaXRlbXMgPSB0YWcuc3BsaXQoJy8nKTtcclxuICAgICAgbGV0IHRlbXAgPSAnJztcclxuICAgICAgZm9yIChjb25zdCBpIG9mIGl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcCArPSBpO1xyXG4gICAgICAgIHRhZ3NTZXQuYWRkKHRlbXApO1xyXG4gICAgICAgIHRlbXAgKz0gJy8nO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHQgb2YgQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goTk9QX0ZJUlNUX1RBR19SRUcpID8/IFtdKSkge1xyXG4gICAgICBjb25zdCB0YWcgPSB0LnJlcGxhY2UoTk9QX0ZJUlNUX1RBR19SRUcsICckMScpLnRyaW0oKTtcclxuICAgICAgY29uc3QgaXRlbXMgPSB0YWcuc3BsaXQoJy8nKTtcclxuICAgICAgbGV0IHRlbXAgPSAnJztcclxuICAgICAgZm9yIChjb25zdCBpIG9mIGl0ZW1zKSB7XHJcbiAgICAgICAgdGVtcCArPSBpO1xyXG4gICAgICAgIHRhZ3NTZXQuYWRkKHRlbXApO1xyXG4gICAgICAgIHRlbXAgKz0gJy8nO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIXRhZ3NTZXQuaGFzKHZhbHVlKSkge1xyXG4gICAgICBjb250YWluZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChvcGVyYXRvciA9PT0gJ05PVF9DT05UQUlOJykge1xyXG4gICAgICBjb250YWluZWQgPSAhY29udGFpbmVkO1xyXG4gICAgfVxyXG4gICAgc2hvdWxkU2hvdyA9IGNvbnRhaW5lZDtcclxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdUWVBFJykge1xyXG4gICAgbGV0IG1hdGNoZWQgPSBmYWxzZTtcclxuICAgIGlmICh2YWx1ZSA9PT0gJ05PVF9UQUdHRUQnICYmIG1lbW8uY29udGVudC5tYXRjaChUQUdfUkVHKSA9PT0gbnVsbCkge1xyXG4gICAgICBtYXRjaGVkID0gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdMSU5LRUQnICYmIG1lbW8uY29udGVudC5tYXRjaChMSU5LX1JFRykgIT09IG51bGwpIHtcclxuICAgICAgbWF0Y2hlZCA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnSU1BR0VEJyAmJiBtZW1vLmNvbnRlbnQubWF0Y2goSU1BR0VfVVJMX1JFRykgIT09IG51bGwpIHtcclxuICAgICAgbWF0Y2hlZCA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnQ09OTkVDVEVEJyAmJiBtZW1vLmNvbnRlbnQubWF0Y2goTUVNT19MSU5LX1JFRykgIT09IG51bGwpIHtcclxuICAgICAgbWF0Y2hlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAob3BlcmF0b3IgPT09ICdJU19OT1QnKSB7XHJcbiAgICAgIG1hdGNoZWQgPSAhbWF0Y2hlZDtcclxuICAgIH1cclxuICAgIHNob3VsZFNob3cgPSBtYXRjaGVkO1xyXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1RFWFQnKSB7XHJcbiAgICBsZXQgY29udGFpbmVkID0gbWVtby5jb250ZW50LmluY2x1ZGVzKHZhbHVlKTtcclxuICAgIGlmIChvcGVyYXRvciA9PT0gJ05PVF9DT05UQUlOJykge1xyXG4gICAgICBjb250YWluZWQgPSAhY29udGFpbmVkO1xyXG4gICAgfVxyXG4gICAgc2hvdWxkU2hvdyA9IGNvbnRhaW5lZDtcclxuICB9XHJcblxyXG4gIHJldHVybiBzaG91bGRTaG93O1xyXG59O1xyXG4iLCJpbXBvcnQge3VzZUNvbnRleHR9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xyXG5pbXBvcnQge2xvY2F0aW9uU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMnO1xyXG5pbXBvcnQge21lbW9TcGVjaWFsVHlwZXN9IGZyb20gJy4uL2hlbHBlcnMvZmlsdGVyJztcclxuaW1wb3J0ICcuLi9sZXNzL3NlYXJjaC1iYXIubGVzcyc7XHJcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBzZWFyY2ggZnJvbSAnLi4vaWNvbnMvc2VhcmNoLnN2Zyc7XHJcbmltcG9ydCB7IHQgfSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuaW1wb3J0IHVzZVRvZ2dsZSBmcm9tICcuLi9ob29rcy91c2VUb2dnbGUnO1xyXG4vLyBpbXBvcnQgdXNlVG9nZ2xlIGZyb20gXCIuLi9ob29rcy91c2VUb2dnbGVcIjtcclxuXHJcbmludGVyZmFjZSBQcm9wcyB7fVxyXG5cclxuZXhwb3J0IGxldCBzZWFyY2hCb3hJbnB1dDogSFRNTElucHV0RWxlbWVudDtcclxuLy8gbGV0IGlzU2VhcmNoQmFyID0gZmFsc2UgYXMgYm9vbGVhbjtcclxuXHJcbmNvbnN0IFNlYXJjaEJhcjogUmVhY3QuRkM8UHJvcHM+ID0gKCkgPT4ge1xyXG4gIGNvbnN0IHtcclxuICAgIGxvY2F0aW9uU3RhdGU6IHtcclxuICAgICAgcXVlcnk6IHt0eXBlOiBtZW1vVHlwZX0sXHJcbiAgICB9LFxyXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xyXG4gIGNvbnN0IFtpc1NlYXJjaEJhclNob3csIHRvZ2dsZVNlYXJjaGJhcl0gPSB1c2VUb2dnbGUoZmFsc2UpO1xyXG5cclxuICBjb25zdCBoYW5kbGVNZW1vVHlwZUl0ZW1DbGljayA9ICh0eXBlOiBNZW1vU3BlY1R5cGUgfCAnJykgPT4ge1xyXG4gICAgY29uc3Qge3R5cGU6IHByZXZUeXBlfSA9IGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5O1xyXG4gICAgaWYgKHR5cGUgPT09IHByZXZUeXBlKSB7XHJcbiAgICAgIHR5cGUgPSAnJztcclxuICAgIH1cclxuICAgIGxvY2F0aW9uU2VydmljZS5zZXRNZW1vVHlwZVF1ZXJ5KHR5cGUpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZVRleHRRdWVyeUlucHV0ID0gKGV2ZW50OiBSZWFjdC5Gb3JtRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcclxuICAgIGNvbnN0IHRleHQgPSBldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlO1xyXG4gICAgbG9jYXRpb25TZXJ2aWNlLnNldFRleHRRdWVyeSh0ZXh0KTtcclxuICB9O1xyXG5cclxuICBjb25zdCBtb3VzZUluID0gKCkgPT4ge1xyXG4gICAgdG9nZ2xlU2VhcmNoYmFyKHRydWUpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IG1vdXNlT3V0ID0gKCkgPT4ge1xyXG4gICAgdG9nZ2xlU2VhcmNoYmFyKGZhbHNlKTtcclxuICB9O1xyXG5cclxuICAvLyBjb25zdCBoYW5kbGVTZWFyY2hCYXJTdGF0dXMgPSAoKSA9PiB7XHJcbiAgLy8gICBpZihpc1NlYXJjaEJhcil7XHJcbiAgLy8gICAgIGlzU2VhcmNoQmFyID0gZmFsc2U7XHJcbiAgLy8gICAgIHRvZ2dsZVNlYXJjaGJhcihmYWxzZSk7XHJcbiAgLy8gICB9ZWxzZXtcclxuICAvLyAgICAgaXNTZWFyY2hCYXIgPSB0cnVlO1xyXG4gIC8vICAgICB0b2dnbGVTZWFyY2hiYXIodHJ1ZSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICByZXR1cm4gKFxyXG4gICAgLy8gPGRpdiBjbGFzc05hbWU9e2Ake2lzU2VhcmNoQmFyU2hvd24gPyBcInNlYXJjaC1iYXItY29udGFpbmVyLWxvbmdcIiA6IFwic2VhcmNoLWJhci1jb250YWluZXItc2hvcnRcIn1gfT5cclxuICAgIC8vICAgPGRpdiBjbGFzc05hbWU9e2Ake2lzU2VhcmNoQmFyU2hvd24gPyBcInNlYXJjaC1iYXItaW5wdXRlci1sb25nXCIgOiBcInNlYXJjaC1iYXItaW5wdXRlci1zaG9ydFwifWB9PlxyXG4gICAgPGRpdiBjbGFzc05hbWU9XCJzZWFyY2gtYmFyLWNvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlYXJjaC1iYXItaW5wdXRlclwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e3NlYXJjaH0gLz5cclxuICAgICAgICA8aW5wdXQgY2xhc3NOYW1lPVwidGV4dC1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgb25Nb3VzZU92ZXI9e21vdXNlSW59IG9uTW91c2VPdXQ9e21vdXNlT3V0fSBwbGFjZWhvbGRlcj17aXNTZWFyY2hCYXJTaG93ID8gXCJUeXBlIEhlcmVcIiA6IFwiXCJ9IG9uQ2hhbmdlPXtoYW5kbGVUZXh0UXVlcnlJbnB1dH0gLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicXVpY2tseS1hY3Rpb24td3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicXVpY2tseS1hY3Rpb24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXRsZS10ZXh0XCI+e3QoJ1F1aWNrIGZpbHRlcicpfTwvcD5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VjdGlvbi1jb250YWluZXIgdHlwZXMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNlY3Rpb24tdGV4dFwiPnt0KCdUWVBFJyl9Ojwvc3Bhbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ2YWx1ZXMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAge21lbW9TcGVjaWFsVHlwZXMubWFwKCh0LCBpZHgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXt0LnZhbHVlfT5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgdHlwZS1pdGVtICR7bWVtb1R5cGUgPT09IHQudmFsdWUgPyAnc2VsZWN0ZWQnIDogJyd9YH1cclxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTWVtb1R5cGVJdGVtQ2xpY2sodC52YWx1ZSBhcyBNZW1vU3BlY1R5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7dC50ZXh0fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB7aWR4ICsgMSA8IG1lbW9TcGVjaWFsVHlwZXMubGVuZ3RoID8gPHNwYW4gY2xhc3NOYW1lPVwic3BsaXQtdGV4dFwiPi88L3NwYW4+IDogbnVsbH1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH0pfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTZWFyY2hCYXI7XHJcbiIsImltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBhcHBDb250ZXh0IGZyb20gJy4uL3N0b3Jlcy9hcHBDb250ZXh0JztcbmltcG9ydCBTZWFyY2hCYXIgZnJvbSAnLi9TZWFyY2hCYXInO1xuaW1wb3J0IHtnbG9iYWxTdGF0ZVNlcnZpY2UsIG1lbW9TZXJ2aWNlLCBxdWVyeVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCBPbmx5IGZyb20gJy4vY29tbW9uL09ubHlXaGVuJztcbmltcG9ydCAnLi4vbGVzcy9tZW1vcy1oZWFkZXIubGVzcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IG1lbnVTdmcgZnJvbSAnLi4vaWNvbnMvbWVudS5zdmcnO1xuXG5sZXQgcHJldlJlcXVlc3RUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG5pbnRlcmZhY2UgUHJvcHMge31cblxuY29uc3QgTWVtb3NIZWFkZXI6IFJlYWN0LkZDPFByb3BzPiA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIGxvY2F0aW9uU3RhdGU6IHtcbiAgICAgIHF1ZXJ5OiB7ZmlsdGVyfSxcbiAgICB9LFxuICAgIGdsb2JhbFN0YXRlOiB7aXNNb2JpbGVWaWV3fSxcbiAgICBxdWVyeVN0YXRlOiB7cXVlcmllc30sXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xuXG4gIGNvbnN0IFt0aXRsZVRleHQsIHNldFRpdGxlVGV4dF0gPSB1c2VTdGF0ZSgnTUVNT1MnKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gcXVlcnlTZXJ2aWNlLmdldFF1ZXJ5QnlJZChmaWx0ZXIpO1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgc2V0VGl0bGVUZXh0KHF1ZXJ5LnRpdGxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGl0bGVUZXh0KCdNRU1PUycpO1xuICAgIH1cbiAgfSwgW2ZpbHRlciwgcXVlcmllc10pO1xuXG4gIGNvbnN0IGhhbmRsZU1lbW9UZXh0Q2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gcHJldlJlcXVlc3RUaW1lc3RhbXAgPiAxMCAqIDEwMDApIHtcbiAgICAgIHByZXZSZXF1ZXN0VGltZXN0YW1wID0gbm93O1xuICAgICAgbWVtb1NlcnZpY2UuZmV0Y2hBbGxNZW1vcygpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gZG8gbnRoXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVTaG93U2lkZWJhckJ0bkNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRTaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcodHJ1ZSk7XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwic2VjdGlvbi1oZWFkZXItY29udGFpbmVyIG1lbW9zLWhlYWRlci1jb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGl0bGUtdGV4dFwiIG9uQ2xpY2s9e2hhbmRsZU1lbW9UZXh0Q2xpY2t9PlxuICAgICAgICA8T25seSB3aGVuPXtpc01vYmlsZVZpZXd9PlxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYWN0aW9uLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZVNob3dTaWRlYmFyQnRuQ2xpY2t9PlxuICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17bWVudVN2Z30gYWx0PVwibWVudVwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvT25seT5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHRcIj57dGl0bGVUZXh0fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPFNlYXJjaEJhciAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTWVtb3NIZWFkZXI7XG4iLCIvLyBpbXBvcnQgeyBnZXRGaWxlIH0gZnJvbSBcIi4uL29iQ29tcG9uZW50cy9vYlVwZGF0ZU1lbW9cIjtcbmltcG9ydCB7VEZpbGV9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xuXG4vKipcbiAqIOWunueOsOS4gOS4queugOaYk+eJiOeahCBtYXJrZG93biDop6PmnpBcbiAqIC0g5YiX6KGo6Kej5p6Q77ybXG4gKiAtIOS7o+eggeWdl++8m1xuICogLSDliqDnspcv5pac5L2T77ybXG4gKiAtIFRPRE87XG4gKi9cbmNvbnN0IENPREVfQkxPQ0tfUkVHID0gL2BgYChbXFxzXFxTXSo/KWBgYC9nO1xuY29uc3QgQk9MRF9URVhUX1JFRyA9IC9cXCpcXCooLis/KVxcKlxcKi9nO1xuY29uc3QgRU1fVEVYVF9SRUcgPSAvXFwqKC4rPylcXCovZztcbmNvbnN0IFRPRE9fQkxPQ0tfUkVHID0gL1xcWyBcXF0gL2c7XG5jb25zdCBET05FX0JMT0NLX1JFRyA9IC9cXFt4XFxdIC9nO1xuY29uc3QgRE9UX0xJX1JFRyA9IC9bKl0gL2c7XG5jb25zdCBOVU1fTElfUkVHID0gLyhcXGQrKVxcLiAvZztcbi8vIGNvbnN0IEJSX1JFRyA9IC9cXDxiclxcPi9nO1xuXG5jb25zdCBJTlRFUk5BTF9NRF9SRUcgPSAvXFxbXFxbKFteXFxdXSspXFxdXFxdL2c7XG5jb25zdCBFWFJFUk5BTF9NRF9SRUcgPSAvXFxbKFteXFxdXSspXFxdXFwoKChbXlxcXV0rKS5tZClcXCkvZztcblxuY29uc3QgcGFyc2VNYXJrZWRUb0h0bWwgPSAobWFya2VkU3RyOiBzdHJpbmcsIG1lbW9pZD86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGh0bWxUZXh0ID0gbWFya2VkU3RyXG4gICAgLnJlcGxhY2UoQ09ERV9CTE9DS19SRUcsIFwiPHByZSBsYW5nPScnPiQxPC9wcmU+XCIpXG4gICAgLnJlcGxhY2UoRE9UX0xJX1JFRywgXCI8c3BhbiBjbGFzcz0nY291bnRlci1ibG9jayc+4oCiPC9zcGFuPlwiKVxuICAgIC5yZXBsYWNlKE5VTV9MSV9SRUcsIFwiPHNwYW4gY2xhc3M9J2NvdW50ZXItYmxvY2snPiQxLjwvc3Bhbj5cIilcbiAgICAucmVwbGFjZShUT0RPX0JMT0NLX1JFRywgXCI8c3BhbiBjbGFzcz0ndG9kby1ibG9jaycgZGF0YS10eXBlPSd0b2RvJz7irJw8L3NwYW4+XCIpXG4gICAgLnJlcGxhY2UoRE9ORV9CTE9DS19SRUcsIFwiPHNwYW4gY2xhc3M9J3RvZG8tYmxvY2snIGRhdGEtdHlwZT0nZG9uZSc+4pyFPC9zcGFuPlwiKVxuICAgIC5yZXBsYWNlKEJPTERfVEVYVF9SRUcsICc8c3Ryb25nPiQxPC9zdHJvbmc+JylcbiAgICAucmVwbGFjZShFTV9URVhUX1JFRywgJzxlbT4kMTwvZW0+JylcbiAgICAucmVwbGFjZSgvJmx0O2JyJmd0Oy9nLCAnPC9wPjxwPicpXG4gICAgLnJlcGxhY2UoLyZhbXA7L2csICcmJyk7XG5cbiAgbGV0IG5ld0h0bWxUZXh0ID0gaHRtbFRleHQ7XG5cbiAgaWYgKG1lbW9pZCkge1xuICAgIGlmIChJTlRFUk5BTF9NRF9SRUcudGVzdChodG1sVGV4dCkpIHtcbiAgICAgIGNvbnN0IGludGVybmFsTUQgPSBodG1sVGV4dC5tYXRjaChJTlRFUk5BTF9NRF9SRUcpO1xuICAgICAgLy8gY29uc3QgcGF0aCA9IGdldEZpbGUobWVtb2lkKS5wYXRoO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcm5hbE1ELmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghLyhqcGVnfGpwZ3xnaWZ8cG5nfHN2Z3xibXB8d2VwZykvZy50ZXN0KGludGVybmFsTURbaV0pKSB7XG4gICAgICAgICAgY29uc3QgaW50ZXJuYWxDb250ZW50ID0gZ2V0Q29udGVudEZyb21JbnRlcm5hbExpbmsoaW50ZXJuYWxNRFtpXSk7XG4gICAgICAgICAgaWYgKC9cXHwvZy50ZXN0KGludGVybmFsQ29udGVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IFtsaW5rLCBsYWJlbF0gPSBpbnRlcm5hbENvbnRlbnQuc3BsaXQoJ3wnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VNZW50ID0gcmVwbGFjZU1kKGxpbmssIGxhYmVsKTtcbiAgICAgICAgICAgIG5ld0h0bWxUZXh0ID0gaHRtbFRleHQucmVwbGFjZShpbnRlcm5hbE1EW2ldLCByZXBsYWNlTWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBpbnRlcm5hbENvbnRlbnQ7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9ICcnO1xuICAgICAgICAgICAgY29uc3QgcmVwbGFjZU1lbnQgPSByZXBsYWNlTWQobGluaywgbGFiZWwpO1xuICAgICAgICAgICAgbmV3SHRtbFRleHQgPSBuZXdIdG1sVGV4dC5yZXBsYWNlKGludGVybmFsTURbaV0sIHJlcGxhY2VNZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKEVYUkVSTkFMX01EX1JFRy50ZXN0KGh0bWxUZXh0KSkge1xuICAgICAgY29uc3QgZXh0ZXJuYWxNRCA9IGh0bWxUZXh0Lm1hdGNoKEVYUkVSTkFMX01EX1JFRyk7XG4gICAgICAvLyBjb25zdCBwYXRoID0gZ2V0RmlsZShtZW1vaWQpLnBhdGg7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVybmFsTUQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCEvKGpwZWd8anBnfGdpZnxwbmd8c3ZnfGJtcHx3ZXBnKS9nLnRlc3QoZXh0ZXJuYWxNRFtpXSkpIHtcbiAgICAgICAgICBjb25zdCBsaW5rID0gZ2V0Q29udGVudEZyb21FeHRlcm5hbExpbmsoZXh0ZXJuYWxNRFtpXSk7XG4gICAgICAgICAgY29uc3QgbGFiZWwgPSBnZXRMYWJlbEZyb21FeHRlcm5hbExpbmsoZXh0ZXJuYWxNRFtpXSk7XG4gICAgICAgICAgY29uc3QgcmVwbGFjZU1lbnQgPSByZXBsYWNlTWQobGluaywgbGFiZWwpO1xuICAgICAgICAgIG5ld0h0bWxUZXh0ID0gaHRtbFRleHQucmVwbGFjZShleHRlcm5hbE1EW2ldLCByZXBsYWNlTWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBjb25zdCBleHRlcm5hbE1EID0gbWFya2VkU3RyLm1hdGNoKEVYUkVSTkFMX01EX1JFRyk7XG5cbiAgcmV0dXJuIG5ld0h0bWxUZXh0O1xufTtcblxuY29uc3QgcmVwbGFjZU1kID0gKGludGVybmFsTGluazogc3RyaW5nLCBsYWJlbDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGV9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuXG4gIGNvbnN0IGZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGRlY29kZVVSSUNvbXBvbmVudChpbnRlcm5hbExpbmspLCAnJyk7XG5cbiAgLy8gbGV0IGZpbGVQYXRoO1xuXG4gIGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAvLyBmaWxlUGF0aCA9IGZpbGUucGF0aDtcbiAgICBpZiAobGFiZWwpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGA8YSBkYXRhLWhyZWY9XCIke2ludGVybmFsTGlua31cIiBkYXRhLXR5cGU9XCJsaW5rXCIgZGF0YS1maWxlcGF0aD1cIiR7aW50ZXJuYWxMaW5rfVwiIGNsYXNzPVwiaW50ZXJuYWwtbGlua1wiPiR7bGFiZWx9PC9hPmApO1xuICAgICAgcmV0dXJuIGA8YSBkYXRhLWhyZWY9XCIke2ludGVybmFsTGlua31cIiBkYXRhLXR5cGU9XCJsaW5rXCIgZGF0YS1maWxlcGF0aD1cIiR7aW50ZXJuYWxMaW5rfVwiIGNsYXNzPVwiaW50ZXJuYWwtbGlua1wiPiR7bGFiZWx9PC9hPmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgPGEgZGF0YS1ocmVmPVwiJHtpbnRlcm5hbExpbmt9XCIgZGF0YS10eXBlPVwibGlua1wiIGRhdGEtZmlsZXBhdGg9XCIke2ludGVybmFsTGlua31cIiBjbGFzcz1cImludGVybmFsLWxpbmtcIj4ke2ludGVybmFsTGlua308L2E+YDtcbiAgICB9XG4gIH0gZWxzZSBpZiAobGFiZWwpIHtcbiAgICByZXR1cm4gYDxhIGRhdGEtaHJlZj1cIiR7aW50ZXJuYWxMaW5rfVwiIGRhdGEtdHlwZT1cImxpbmtcIiBkYXRhLWZpbGVwYXRoPVwiJHtpbnRlcm5hbExpbmt9XCIgY2xhc3M9XCJpbnRlcm5hbC1saW5rIGlzLXVucmVzb2x2ZWRcIj4ke2xhYmVsfTwvYT5gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgPGEgZGF0YS1ocmVmPVwiJHtpbnRlcm5hbExpbmt9XCIgZGF0YS10eXBlPVwibGlua1wiIGRhdGEtZmlsZXBhdGg9XCIke2ludGVybmFsTGlua31cIiBjbGFzcz1cImludGVybmFsLWxpbmsgaXMtdW5yZXNvbHZlZFwiPiR7aW50ZXJuYWxMaW5rfTwvYT5gO1xuICB9XG59O1xuXG5jb25zdCBnZXRDb250ZW50RnJvbUludGVybmFsTGluayA9IChsaW5lOiBzdHJpbmcpID0+IC9cXFtcXFsoW15cXF1dKylcXF1cXF0vZy5leGVjKGxpbmUpPy5bMV07XG5cbmNvbnN0IGdldExhYmVsRnJvbUV4dGVybmFsTGluayA9IChsaW5lOiBzdHJpbmcpID0+IEVYUkVSTkFMX01EX1JFRy5leGVjKGxpbmUpPy5bMV07XG5cbmNvbnN0IGdldENvbnRlbnRGcm9tRXh0ZXJuYWxMaW5rID0gKGxpbmU6IHN0cmluZykgPT4gL1xcWyhbXlxcXV0rKVxcXVxcKCgoW15cXF1dKykubWQpXFwpL2cuZXhlYyhsaW5lKT8uWzNdO1xuXG5jb25zdCBwYXJzZUh0bWxUb1Jhd1RleHQgPSAoaHRtbFN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGVtcEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRlbXBFbC5jbGFzc05hbWUgPSAnbWVtby1jb250ZW50LXRleHQnO1xuICB0ZW1wRWwuaW5uZXJIVE1MID0gaHRtbFN0cjtcbiAgY29uc3QgdGV4dCA9IHRlbXBFbC5pbm5lclRleHQ7XG4gIHJldHVybiB0ZXh0O1xufTtcblxuY29uc3QgcGFyc2VSYXdUZXh0VG9IdG1sID0gKHJhd1RleHRTdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGh0bWxUZXh0ID0gcmF3VGV4dFN0ci5yZXBsYWNlKC9cXG4vZywgJzxicj4nKTtcbiAgcmV0dXJuIGh0bWxUZXh0O1xufTtcblxuY29uc3QgZW5jb2RlSHRtbCA9IChodG1sU3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHQudGV4dENvbnRlbnQgPSBodG1sU3RyO1xuICByZXR1cm4gdC5pbm5lckhUTUw7XG59O1xuXG5leHBvcnQge2VuY29kZUh0bWwsIHBhcnNlTWFya2VkVG9IdG1sLCBwYXJzZUh0bWxUb1Jhd1RleHQsIHBhcnNlUmF3VGV4dFRvSHRtbH07XG4iLCJpbXBvcnQge3VzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7U3RvcmV9IGZyb20gJy4vY3JlYXRlU3RvcmUnO1xuXG5pbnRlcmZhY2UgUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3RFbGVtZW50O1xuICBzdG9yZTogU3RvcmU8YW55LCBhbnk+O1xuICBjb250ZXh0OiBSZWFjdC5Db250ZXh0PGFueT47XG59XG5cbi8qKlxuICogVG95LVJlZHV4IFByb3ZpZGVyXG4gKiBKdXN0IGZvciBkZWJ1ZyB3aXRoIHRoZSBhcHAgc3RvcmVcbiAqL1xuY29uc3QgUHJvdmlkZXI6IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wczogUHJvcHMpID0+IHtcbiAgY29uc3Qge2NoaWxkcmVuLCBzdG9yZSwgY29udGV4dDogQ29udGV4dH0gPSBwcm9wcztcbiAgY29uc3QgW2FwcFN0YXRlLCBzZXRBcHBTdGF0ZV0gPSB1c2VTdGF0ZShzdG9yZS5nZXRTdGF0ZSgpKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc3RvcmUuc3Vic2NyaWJlKChucykgPT4ge1xuICAgICAgc2V0QXBwU3RhdGUobnMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiA8Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17YXBwU3RhdGV9PntjaGlsZHJlbn08L0NvbnRleHQuUHJvdmlkZXI+O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUHJvdmlkZXI7XG4iLCJpbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcclxuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xyXG5pbXBvcnQgUHJvdmlkZXIgZnJvbSAnLi4vbGFicy9Qcm92aWRlcic7XHJcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xyXG5pbXBvcnQge0FOSU1BVElPTl9EVVJBVElPTn0gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xyXG5pbXBvcnQgJy4uL2xlc3MvZGlhbG9nLmxlc3MnO1xyXG5pbXBvcnQgUmVhY3QsIHtLZXlib2FyZEV2ZW50LCB1c2VSZWZ9IGZyb20gJ3JlYWN0JztcclxuXHJcbmludGVyZmFjZSBEaWFsb2dDb25maWcge1xyXG4gIGNsYXNzTmFtZTogc3RyaW5nO1xyXG4gIHVzZUFwcENvbnRleHQ/OiBib29sZWFuO1xyXG4gIGNsaWNrU3BhY2VEZXN0cm95PzogYm9vbGVhbjtcclxufVxyXG5cclxuaW50ZXJmYWNlIFByb3BzIGV4dGVuZHMgRGlhbG9nQ29uZmlnLCBEaWFsb2dQcm9wcyB7XHJcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcclxufVxyXG5cclxuY29uc3QgQmFzZURpYWxvZzogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xyXG4gIGNvbnN0IHtjaGlsZHJlbiwgY2xhc3NOYW1lLCBjbGlja1NwYWNlRGVzdHJveSwgZGVzdHJveX0gPSBwcm9wcztcclxuXHJcbiAgY29uc3QgaGFuZGxlU3BhY2VDbGlja2VkID0gKCkgPT4ge1xyXG4gICAgaWYgKGNsaWNrU3BhY2VEZXN0cm95KSB7XHJcbiAgICAgIGRlc3Ryb3koKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVFc2NDbGlja2VkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgY29uc3Qge2tleX0gPSBlOyBcclxuICAgIGlmIChrZXkgPT09ICdFc2NhcGUnKSB7XHJcbiAgICAgIGRlc3Ryb3koKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9e2BkaWFsb2ctd3JhcHBlciAke2NsYXNzTmFtZX1gfSBvbkNsaWNrPXtoYW5kbGVTcGFjZUNsaWNrZWR9IG9uS2V5UHJlc3M9e2hhbmRsZUVzY0NsaWNrZWR9PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1jb250YWluZXJcIiBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX0+XHJcbiAgICAgICAge2NoaWxkcmVufVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2hvd0RpYWxvZzxUIGV4dGVuZHMgRGlhbG9nUHJvcHM+KFxyXG4gIGNvbmZpZzogRGlhbG9nQ29uZmlnLFxyXG4gIERpYWxvZ0NvbXBvbmVudDogUmVhY3QuRkM8VD4sXHJcbiAgcHJvcHM/OiBPbWl0PFQsICdkZXN0cm95Jz4sXHJcbik6IERpYWxvZ0NhbGxiYWNrIHtcclxuICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmQodGVtcERpdik7XHJcblxyXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgdGVtcERpdi5maXJzdEVsZW1lbnRDaGlsZD8uY2xhc3NMaXN0LmFkZCgnc2hvd3VwJyk7XHJcbiAgfSwgMCk7XHJcblxyXG4gIGNvbnN0IGNiczogRGlhbG9nQ2FsbGJhY2sgPSB7XHJcbiAgICBkZXN0cm95OiAoKSA9PiB7XHJcbiAgICAgIHRlbXBEaXYuZmlyc3RFbGVtZW50Q2hpbGQ/LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3d1cCcpO1xyXG4gICAgICB0ZW1wRGl2LmZpcnN0RWxlbWVudENoaWxkPy5jbGFzc0xpc3QuYWRkKCdzaG93b2ZmJyk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRlbXBEaXYucmVtb3ZlKCk7XHJcbiAgICAgICAgUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSh0ZW1wRGl2KTtcclxuICAgICAgfSwgQU5JTUFUSU9OX0RVUkFUSU9OKTtcclxuICAgIH0sXHJcbiAgfTtcclxuXHJcbiAgY29uc3QgZGlhbG9nUHJvcHMgPSB7XHJcbiAgICAuLi5wcm9wcyxcclxuICAgIGRlc3Ryb3k6IGNicy5kZXN0cm95LFxyXG4gIH0gYXMgVDtcclxuXHJcbiAgbGV0IEZyYWdtZW50ID0gKFxyXG4gICAgPEJhc2VEaWFsb2cgZGVzdHJveT17Y2JzLmRlc3Ryb3l9IGNsaWNrU3BhY2VEZXN0cm95PXt0cnVlfSB7Li4uY29uZmlnfT5cclxuICAgICAgPERpYWxvZ0NvbXBvbmVudCB7Li4uZGlhbG9nUHJvcHN9IC8+XHJcbiAgICA8L0Jhc2VEaWFsb2c+XHJcbiAgKTtcclxuXHJcbiAgaWYgKGNvbmZpZy51c2VBcHBDb250ZXh0KSB7XHJcbiAgICBGcmFnbWVudCA9IChcclxuICAgICAgPFByb3ZpZGVyIHN0b3JlPXthcHBTdG9yZX0gY29udGV4dD17YXBwQ29udGV4dH0+XHJcbiAgICAgICAge0ZyYWdtZW50fVxyXG4gICAgICA8L1Byb3ZpZGVyPlxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIFJlYWN0RE9NLnJlbmRlcihGcmFnbWVudCwgdGVtcERpdik7XHJcblxyXG4gIHJldHVybiBjYnM7XHJcbn1cclxuIiwiaW1wb3J0IHt1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xyXG5pbXBvcnQge3Nob3dEaWFsb2d9IGZyb20gJy4vRGlhbG9nJztcclxuaW1wb3J0ICcuLi9sZXNzL3ByZXZpZXctaW1hZ2UtZGlhbG9nLmxlc3MnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcclxuaW1wb3J0IGNsb3NlIGZyb20gJy4uL2ljb25zL2Nsb3NlLnN2Zyc7XHJcbmltcG9ydCB7Tm90aWNlfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7dH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcblxyXG5pbnRlcmZhY2UgUHJvcHMgZXh0ZW5kcyBEaWFsb2dQcm9wcyB7XHJcbiAgaW1nVXJsOiBzdHJpbmc7XHJcbiAgZmlsZXBhdGg/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IFByZXZpZXdJbWFnZURpYWxvZzogUmVhY3QuRkM8UHJvcHM+ID0gKHtkZXN0cm95LCBpbWdVcmwsIGZpbGVwYXRofTogUHJvcHMpID0+IHtcclxuICBjb25zdCBpbWdSZWYgPSB1c2VSZWY8SFRNTEltYWdlRWxlbWVudD4obnVsbCk7XHJcbiAgY29uc3QgW2ltZ1dpZHRoLCBzZXRJbWdXaWR0aF0gPSB1c2VTdGF0ZTxudW1iZXI+KC0xKTtcclxuICBjb25zdCB7dmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgdXRpbHMuZ2V0SW1hZ2VTaXplKGltZ1VybCkudGhlbigoe3dpZHRofSkgPT4ge1xyXG4gICAgICBpZiAod2lkdGggIT09IDApIHtcclxuICAgICAgICBzZXRJbWdXaWR0aCg4MCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0SW1nV2lkdGgoMCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlQ2xvc2VCdG5DbGljayA9ICgpID0+IHtcclxuICAgIGRlc3Ryb3koKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVEZWNyZWFzZUltYWdlU2l6ZSA9ICgpID0+IHtcclxuICAgIGlmIChpbWdXaWR0aCA+IDMwKSB7XHJcbiAgICAgIHNldEltZ1dpZHRoKGltZ1dpZHRoIC0gMTApO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUluY3JlYXNlSW1hZ2VTaXplID0gKCkgPT4ge1xyXG4gICAgc2V0SW1nV2lkdGgoaW1nV2lkdGggKyAxMCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgY29udmVydEJhc2U2NFRvQmxvYiA9IChiYXNlNjQ6IHN0cmluZywgdHlwZTogc3RyaW5nKSA9PiB7XHJcbiAgICB2YXIgYnl0ZXMgPSB3aW5kb3cuYXRvYihiYXNlNjQpO1xyXG4gICAgdmFyIGFiID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVzLmxlbmd0aCk7XHJcbiAgICB2YXIgaWEgPSBuZXcgVWludDhBcnJheShhYik7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlhW2ldID0gYnl0ZXMuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgQmxvYihbYWJdLCB7dHlwZTogdHlwZX0pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGNvcHlJbWFnZVRvQ2xpcGJvYXJkID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgaWYgKChmaWxlcGF0aCA9PT0gbnVsbCB8fCBmaWxlcGF0aCA9PT0gdW5kZWZpbmVkKSAmJiBpbWdVcmwgIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgbXlCYXNlNjQgPSBpbWdVcmwuc3BsaXQoJ2Jhc2U2NCwnKVsxXTtcclxuICAgICAgY29uc3QgYmxvYklucHV0ID0gY29udmVydEJhc2U2NFRvQmxvYihteUJhc2U2NCwgJ2ltYWdlL3BuZycpO1xyXG4gICAgICBjb25zdCBjbGlwYm9hcmRJdGVtSW5wdXQgPSBuZXcgQ2xpcGJvYXJkSXRlbSh7J2ltYWdlL3BuZyc6IGJsb2JJbnB1dH0pO1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIHdpbmRvdy5uYXZpZ2F0b3JbJ2NsaXBib2FyZCddLndyaXRlKFtjbGlwYm9hcmRJdGVtSW5wdXRdKTtcclxuICAgICAgbmV3IE5vdGljZSgnU2VuZCB0byBjbGlwYm9hcmQgc3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgYnVmZmVyID0gYXdhaXQgdmF1bHQuYWRhcHRlci5yZWFkQmluYXJ5KGZpbGVwYXRoKTtcclxuICAgICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcblxyXG4gICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFthcnJdLCB7dHlwZTogJ2ltYWdlL3BuZyd9KTtcclxuICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICBjb25zdCBpdGVtID0gbmV3IENsaXBib2FyZEl0ZW0oeydpbWFnZS9wbmcnOiBibG9ifSk7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgd2luZG93Lm5hdmlnYXRvclsnY2xpcGJvYXJkJ10ud3JpdGUoW2l0ZW1dKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPD5cclxuICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gY2xvc2UtYnRuXCIgb25DbGljaz17aGFuZGxlQ2xvc2VCdG5DbGlja30+XHJcbiAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17Y2xvc2V9IC8+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbWctY29udGFpbmVyIGludGVybmFsLWVtYmVkIGltYWdlLWVtYmVkIGlzLWxvYWRlZFwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3NOYW1lPXtpbWdXaWR0aCA8PSAwID8gJ2hpZGRlbicgOiAnJ30gcmVmPXtpbWdSZWZ9IHdpZHRoPXtpbWdXaWR0aCArICclJ30gc3JjPXtpbWdVcmx9IC8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXsnbG9hZGluZy10ZXh0ICcgKyAoaW1nV2lkdGggPT09IC0xID8gJycgOiAnaGlkZGVuJyl9Pnt0KCdJbWFnZSBpcyBsb2FkaW5nLi4uJyl9PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J2xvYWRpbmctdGV4dCAnICsgKGltZ1dpZHRoID09PSAwID8gJycgOiAnaGlkZGVuJyl9PlxyXG4gICAgICAgICAge3QoJ/CfmJ8gQ2Fubm90IGxvYWQgaW1hZ2UsIGltYWdlIGxpbmsgbWF5YmUgYnJva2VuJyl9XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWN0aW9uLWJ0bnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG5cIiBvbkNsaWNrPXtoYW5kbGVEZWNyZWFzZUltYWdlU2l6ZX0+XHJcbiAgICAgICAgICDinpZcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0blwiIG9uQ2xpY2s9e2hhbmRsZUluY3JlYXNlSW1hZ2VTaXplfT5cclxuICAgICAgICAgIOKelVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17KCkgPT4gc2V0SW1nV2lkdGgoODApfT5cclxuICAgICAgICAgIOKtlVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17Y29weUltYWdlVG9DbGlwYm9hcmR9PlxyXG4gICAgICAgICAg8J+ThFxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvPlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaG93UHJldmlld0ltYWdlRGlhbG9nKGltZ1VybDogc3RyaW5nLCBmaWxlcGF0aD86IHN0cmluZyk6IHZvaWQge1xyXG4gIGlmIChmaWxlcGF0aCkge1xyXG4gICAgc2hvd0RpYWxvZyhcclxuICAgICAge1xyXG4gICAgICAgIGNsYXNzTmFtZTogJ3ByZXZpZXctaW1hZ2UtZGlhbG9nJyxcclxuICAgICAgfSxcclxuICAgICAgUHJldmlld0ltYWdlRGlhbG9nLFxyXG4gICAgICB7aW1nVXJsLCBmaWxlcGF0aH0sXHJcbiAgICApO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBzaG93RGlhbG9nKFxyXG4gICAgICB7XHJcbiAgICAgICAgY2xhc3NOYW1lOiAncHJldmlldy1pbWFnZS1kaWFsb2cnLFxyXG4gICAgICB9LFxyXG4gICAgICBQcmV2aWV3SW1hZ2VEaWFsb2csXHJcbiAgICAgIHtpbWdVcmx9LFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gIC8vICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5wcmV2aWV3LWltYWdlLWRpYWxvZ1wiKS5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgY2xvc2VXaW5kb3dCeUVzYyk7XHJcbiAgLy8gfSwgMCk7XHJcbn1cclxuXHJcbi8vIGZ1bmN0aW9uIGNsb3NlV2luZG93KCkge1xyXG4vLyAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIucHJldmlldy1pbWFnZS1kaWFsb2cgLmNsb3NlLWJ0blwiKS5jbGljaygpO1xyXG4vLyB9XHJcblxyXG4vLyBmdW5jdGlvbiBjbG9zZVdpbmRvd0J5RXNjKGUpIHtcclxuLy8gICBpZiAoIWUpIGUgPSB3aW5kb3cuZXZlbnQ7XHJcbi8vICAgdmFyIGtleUNvZGUgPSBlLmtleUNvZGUgfHwgZS53aGljaDtcclxuLy8gICBpZiAoa2V5Q29kZSA9PSAnMjcnKSB7XHJcbi8vICAgICBjbG9zZVdpbmRvdygpO1xyXG4vLyAgIH1cclxuLy8gfVxyXG4iLCJpbXBvcnQgc2hvd1ByZXZpZXdJbWFnZURpYWxvZyBmcm9tICcuL1ByZXZpZXdJbWFnZURpYWxvZyc7XG5pbXBvcnQgJy4uL2xlc3MvaW1hZ2UubGVzcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbnRlcmZhY2UgUHJvcHMge1xuICBpbWdVcmw6IHN0cmluZztcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBhbHQ6IHN0cmluZztcbiAgcmVmZXJyZXJQb2xpY3k/OiBzdHJpbmc7XG4gIGZpbGVwYXRoPzogc3RyaW5nO1xufVxuXG5jb25zdCBJbWFnZTogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xuICBjb25zdCB7Y2xhc3NOYW1lLCBpbWdVcmwsIGFsdCwgcmVmZXJyZXJQb2xpY3ksIGZpbGVwYXRofSA9IHByb3BzO1xuXG4gIGNvbnN0IGhhbmRsZUltYWdlQ2xpY2sgPSAoKSA9PiB7XG4gICAgaWYgKGZpbGVwYXRoKSB7XG4gICAgICBzaG93UHJldmlld0ltYWdlRGlhbG9nKGltZ1VybCwgZmlsZXBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93UHJldmlld0ltYWdlRGlhbG9nKGltZ1VybCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9eydpbWFnZS1jb250YWluZXIgJyArIGNsYXNzTmFtZX0gb25DbGljaz17aGFuZGxlSW1hZ2VDbGlja30gcmVmZXJyZXJQb2xpY3k9e3JlZmVycmVyUG9saWN5fT5cbiAgICAgIDxpbWcgc3JjPXtpbWdVcmx9IGFsdD17YWx0fSBkZWNvZGluZz1cImFzeW5jXCIgbG9hZGluZz1cImxhenlcIiAvPlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgSW1hZ2U7XG4iLCJpbXBvcnQge3VzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7XHJcbiAgSU1BR0VfVVJMX1JFRyxcclxuICBNQVJLRE9XTl9VUkxfUkVHLFxyXG4gIE1BUktET1dOX1dFQl9VUkxfUkVHLFxyXG4gIE1FTU9fTElOS19SRUcsXHJcbiAgV0lLSV9JTUFHRV9VUkxfUkVHLFxyXG59IGZyb20gJy4uL2hlbHBlcnMvY29uc3RzJztcclxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xyXG5pbXBvcnQge2dsb2JhbFN0YXRlU2VydmljZSwgbWVtb1NlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHtwYXJzZUh0bWxUb1Jhd1RleHR9IGZyb20gJy4uL2hlbHBlcnMvbWFya2VkJztcclxuaW1wb3J0IHtmb3JtYXRNZW1vQ29udGVudH0gZnJvbSAnLi9NZW1vJztcclxuaW1wb3J0IHtzaG93RGlhbG9nfSBmcm9tICcuL0RpYWxvZyc7XHJcbmltcG9ydCBPbmx5IGZyb20gJy4vY29tbW9uL09ubHlXaGVuJztcclxuaW1wb3J0IEltYWdlIGZyb20gJy4vSW1hZ2UnO1xyXG5pbXBvcnQgJy4uL2xlc3MvbWVtby1jYXJkLWRpYWxvZy5sZXNzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtOb3RpY2UsIFRGaWxlLCBWYXVsdH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcclxuaW1wb3J0IGNsb3NlIGZyb20gJy4uL2ljb25zL2Nsb3NlLnN2Zyc7XHJcbmltcG9ydCBlZGl0IGZyb20gJy4uL2ljb25zL2VkaXQuc3ZnJztcclxuaW1wb3J0IHsgdCB9IGZyb20gJy4uL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xyXG5cclxuaW50ZXJmYWNlIExpbmtlZE1lbW8gZXh0ZW5kcyBGb3JtYXR0ZWRNZW1vIHtcclxuICBkYXRlU3RyOiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBQcm9wcyBleHRlbmRzIERpYWxvZ1Byb3BzIHtcclxuICBtZW1vOiBNb2RlbC5NZW1vO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgTGlua01hdGNoIHtcclxuICBsaW5rVGV4dDogc3RyaW5nO1xyXG4gIGFsdFRleHQ6IHN0cmluZztcclxuICBwYXRoOiBzdHJpbmc7XHJcbiAgZmlsZXBhdGg/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRQYXRoT2ZJbWFnZSA9ICh2YXVsdDogVmF1bHQsIGltYWdlOiBURmlsZSkgPT4ge1xyXG4gIHJldHVybiB2YXVsdC5nZXRSZXNvdXJjZVBhdGgoaW1hZ2UpO1xyXG59O1xyXG5cclxuY29uc3QgZGV0ZWN0V2lraUludGVybmFsTGluayA9IChsaW5lVGV4dDogc3RyaW5nKTogTGlua01hdGNoIHwgbnVsbCA9PiB7XHJcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcclxuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gV0lLSV9JTUFHRV9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bMV07XHJcbiAgY29uc3QgaW50ZXJuYWxBbHROYW1lID0gV0lLSV9JTUFHRV9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bNV07XHJcbiAgY29uc3QgZmlsZSA9IG1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZGVjb2RlVVJJQ29tcG9uZW50KGludGVybmFsRmlsZU5hbWUpLCAnJyk7XHJcbiAgaWYgKGZpbGUgPT09IG51bGwpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXHJcbiAgICAgIHBhdGg6ICcnLFxyXG4gICAgICBmaWxlcGF0aDogJycsXHJcbiAgICB9O1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBpbWFnZVBhdGggPSBnZXRQYXRoT2ZJbWFnZSh2YXVsdCwgZmlsZSk7XHJcbiAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGUucGF0aDtcclxuICAgIGlmIChpbnRlcm5hbEFsdE5hbWUpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXHJcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxyXG4gICAgICAgIGZpbGVwYXRoOiBmaWxlUGF0aCxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgICAgYWx0VGV4dDogJycsXHJcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxyXG4gICAgICAgIGZpbGVwYXRoOiBmaWxlUGF0aCxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBkZXRlY3RNREludGVybmFsTGluayA9IChsaW5lVGV4dDogc3RyaW5nKTogTGlua01hdGNoIHwgbnVsbCA9PiB7XHJcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcclxuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xyXG4gIGNvbnN0IGludGVybmFsQWx0TmFtZSA9IE1BUktET1dOX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/LlsyXTtcclxuICBjb25zdCBmaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcclxuICBpZiAoZmlsZSA9PT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcclxuICAgICAgcGF0aDogJycsXHJcbiAgICAgIGZpbGVwYXRoOiAnJyxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IGltYWdlUGF0aCA9IGdldFBhdGhPZkltYWdlKHZhdWx0LCBmaWxlKTtcclxuICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZS5wYXRoO1xyXG4gICAgaWYgKGludGVybmFsQWx0TmFtZSkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgICBhbHRUZXh0OiAnJyxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IE1lbW9DYXJkRGlhbG9nOiBSZWFjdC5GQzxQcm9wcz4gPSAocHJvcHM6IFByb3BzKSA9PiB7XHJcbiAgY29uc3QgW21lbW8sIHNldE1lbW9dID0gdXNlU3RhdGU8Rm9ybWF0dGVkTWVtbz4oe1xyXG4gICAgLi4ucHJvcHMubWVtbyxcclxuICAgIGNyZWF0ZWRBdFN0cjogdXRpbHMuZ2V0RGF0ZVRpbWVTdHJpbmcocHJvcHMubWVtby5jcmVhdGVkQXQpLFxyXG4gIH0pO1xyXG4gIGNvbnN0IFtsaW5rTWVtb3MsIHNldExpbmtNZW1vc10gPSB1c2VTdGF0ZTxMaW5rZWRNZW1vW10+KFtdKTtcclxuICBjb25zdCBbbGlua2VkTWVtb3MsIHNldExpbmtlZE1lbW9zXSA9IHVzZVN0YXRlPExpbmtlZE1lbW9bXT4oW10pO1xyXG5cclxuICBsZXQgZXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcclxuICBsZXQgaW50ZXJuYWxJbWFnZVVybHMgPSBbXTtcclxuICBsZXQgYWxsTWFya2Rvd25MaW5rOiBzdHJpbmcgfCBhbnlbXSA9IFtdO1xyXG4gIGxldCBhbGxJbnRlcm5hbExpbmsgPSBbXSBhcyBhbnlbXTtcclxuICBpZiAoSU1BR0VfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcclxuICAgIGxldCBhbGxFeHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xyXG4gICAgbGV0IGFub3RoZXJFeHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xyXG4gICAgaWYgKE1BUktET1dOX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XHJcbiAgICAgIGFsbE1hcmtkb3duTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1VSTF9SRUcpKTtcclxuICAgIH1cclxuICAgIGlmIChXSUtJX0lNQUdFX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XHJcbiAgICAgIGFsbEludGVybmFsTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKFdJS0lfSU1BR0VfVVJMX1JFRykpO1xyXG4gICAgfVxyXG4gICAgLy8gY29uc3QgYWxsSW50ZXJuYWxMaW5rID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goV0lLSV9JTUFHRV9VUkxfUkVHKSk7XHJcbiAgICBpZiAoTUFSS0RPV05fV0VCX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XHJcbiAgICAgIGFsbEV4dGVybmFsSW1hZ2VVcmxzID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goTUFSS0RPV05fV0VCX1VSTF9SRUcpKTtcclxuICAgIH1cclxuICAgIGlmIChhbGxJbnRlcm5hbExpbmsubGVuZ3RoKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsSW50ZXJuYWxMaW5rLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IG9uZSA9IGFsbEludGVybmFsTGlua1tpXTtcclxuICAgICAgICBpbnRlcm5hbEltYWdlVXJscy5wdXNoKGRldGVjdFdpa2lJbnRlcm5hbExpbmsob25lKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChhbGxNYXJrZG93bkxpbmsubGVuZ3RoKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsTWFya2Rvd25MaW5rLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHR3byA9IGFsbE1hcmtkb3duTGlua1tpXTtcclxuICAgICAgICBpZiAoLyguKilodHRwW3NdPyguKikvLnRlc3QodHdvKSkge1xyXG4gICAgICAgICAgYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzLnB1c2goTUFSS0RPV05fVVJMX1JFRy5leGVjKHR3byk/Lls1XSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGludGVybmFsSW1hZ2VVcmxzLnB1c2goZGV0ZWN0TURJbnRlcm5hbExpbmsodHdvKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBleHRlcm5hbEltYWdlVXJscyA9IGFsbEV4dGVybmFsSW1hZ2VVcmxzLmNvbmNhdChhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMpO1xyXG4gICAgLy8gZXh0ZXJuYWxJbWFnZVVybHMgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChJTUFHRV9VUkxfUkVHKSA/PyBbXSk7XHJcbiAgfVxyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgY29uc3QgZmV0Y2hMaW5rZWRNZW1vcyA9IGFzeW5jICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBsaW5rTWVtb3M6IExpbmtlZE1lbW9bXSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IG1hdGNoZWRBcnIgPSBbLi4ubWVtby5jb250ZW50Lm1hdGNoQWxsKE1FTU9fTElOS19SRUcpXTtcclxuICAgICAgICBmb3IgKGNvbnN0IG1hdGNoUmVzIG9mIG1hdGNoZWRBcnIpIHtcclxuICAgICAgICAgIGlmIChtYXRjaFJlcyAmJiBtYXRjaFJlcy5sZW5ndGggPT09IDMpIHtcclxuICAgICAgICAgICAgY29uc3QgaWQgPSBtYXRjaFJlc1syXTtcclxuICAgICAgICAgICAgY29uc3QgbWVtb1RlbXAgPSBtZW1vU2VydmljZS5nZXRNZW1vQnlJZChpZCk7XHJcbiAgICAgICAgICAgIGlmIChtZW1vVGVtcCkge1xyXG4gICAgICAgICAgICAgIGxpbmtNZW1vcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIC4uLm1lbW9UZW1wLFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0U3RyOiB1dGlscy5nZXREYXRlVGltZVN0cmluZyhtZW1vVGVtcC5jcmVhdGVkQXQpLFxyXG4gICAgICAgICAgICAgICAgZGF0ZVN0cjogdXRpbHMuZ2V0RGF0ZVN0cmluZyhtZW1vVGVtcC5jcmVhdGVkQXQpLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldExpbmtNZW1vcyhbLi4ubGlua01lbW9zXSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxpbmtlZE1lbW9zID0gYXdhaXQgbWVtb1NlcnZpY2UuZ2V0TGlua2VkTWVtb3MobWVtby5pZCk7XHJcbiAgICAgICAgc2V0TGlua2VkTWVtb3MoXHJcbiAgICAgICAgICBsaW5rZWRNZW1vc1xyXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGIuY3JlYXRlZEF0KSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLmNyZWF0ZWRBdCkpXHJcbiAgICAgICAgICAgIC5tYXAoKG0pID0+ICh7XHJcbiAgICAgICAgICAgICAgLi4ubSxcclxuICAgICAgICAgICAgICBjcmVhdGVkQXRTdHI6IHV0aWxzLmdldERhdGVUaW1lU3RyaW5nKG0uY3JlYXRlZEF0KSxcclxuICAgICAgICAgICAgICBkYXRlU3RyOiB1dGlscy5nZXREYXRlU3RyaW5nKG0uY3JlYXRlZEF0KSxcclxuICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgLy8gZG8gbnRoXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgZmV0Y2hMaW5rZWRNZW1vcygpO1xyXG4gIH0sIFttZW1vLmlkXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZU1lbW9Db250ZW50Q2xpY2sgPSB1c2VDYWxsYmFjayhhc3luYyAoZTogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xyXG4gICAgY29uc3QgdGFyZ2V0RWwgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBpZiAodGFyZ2V0RWwuY2xhc3NOYW1lID09PSAnbWVtby1saW5rLXRleHQnKSB7XHJcbiAgICAgIGNvbnN0IG5leHRNZW1vSWQgPSB0YXJnZXRFbC5kYXRhc2V0Py52YWx1ZTtcclxuICAgICAgY29uc3QgbWVtb1RlbXAgPSBtZW1vU2VydmljZS5nZXRNZW1vQnlJZChuZXh0TWVtb0lkID8/ICcnKTtcclxuXHJcbiAgICAgIGlmIChtZW1vVGVtcCkge1xyXG4gICAgICAgIGNvbnN0IG5leHRNZW1vID0ge1xyXG4gICAgICAgICAgLi4ubWVtb1RlbXAsXHJcbiAgICAgICAgICBjcmVhdGVkQXRTdHI6IHV0aWxzLmdldERhdGVUaW1lU3RyaW5nKG1lbW9UZW1wLmNyZWF0ZWRBdCksXHJcbiAgICAgICAgfTtcclxuICAgICAgICBzZXRMaW5rTWVtb3MoW10pO1xyXG4gICAgICAgIHNldExpbmtlZE1lbW9zKFtdKTtcclxuICAgICAgICBzZXRNZW1vKG5leHRNZW1vKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXcgTm90aWNlKCdNRU1PIE5vdCBGb3VuZCcpO1xyXG4gICAgICAgIHRhcmdldEVsLmNsYXNzTGlzdC5yZW1vdmUoJ21lbW8tbGluay10ZXh0Jyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUxpbmtlZE1lbW9DbGljayA9IHVzZUNhbGxiYWNrKChtZW1vOiBGb3JtYXR0ZWRNZW1vKSA9PiB7XHJcbiAgICBzZXRMaW5rTWVtb3MoW10pO1xyXG4gICAgc2V0TGlua2VkTWVtb3MoW10pO1xyXG4gICAgc2V0TWVtbyhtZW1vKTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUVkaXRNZW1vQnRuQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICBwcm9wcy5kZXN0cm95KCk7XHJcbiAgICBnbG9iYWxTdGF0ZVNlcnZpY2Uuc2V0RWRpdE1lbW9JZChtZW1vLmlkKTtcclxuICB9LCBbbWVtby5pZF0pO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPD5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLWNhcmQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoZWFkZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aW1lLXRleHRcIj57bWVtby5jcmVhdGVkQXRTdHJ9PC9wPlxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJidG5zLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBlZGl0LWJ0blwiIG9uQ2xpY2s9e2hhbmRsZUVkaXRNZW1vQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2VkaXR9IC8+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBjbG9zZS1idG5cIiBvbkNsaWNrPXtwcm9wcy5kZXN0cm95fT5cclxuICAgICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtjbG9zZX0gLz5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbW8tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1lbW8tY29udGVudC10ZXh0XCJcclxuICAgICAgICAgICAgb25DbGljaz17aGFuZGxlTWVtb0NvbnRlbnRDbGlja31cclxuICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGZvcm1hdE1lbW9Db250ZW50KG1lbW8uY29udGVudCl9fT48L2Rpdj5cclxuICAgICAgICAgIDxPbmx5IHdoZW49e2V4dGVybmFsSW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAge2V4dGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcclxuICAgICAgICAgICAgICAgIDxJbWFnZSBrZXk9e2lkeH0gY2xhc3NOYW1lPVwibWVtby1pbWdcIiBpbWdVcmw9e2ltZ1VybH0gYWx0PVwiXCIgcmVmZXJyZXJQb2xpY3k9XCJuby1yZWZlcnJlclwiIC8+XHJcbiAgICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9Pbmx5PlxyXG4gICAgICAgICAgPE9ubHkgd2hlbj17aW50ZXJuYWxJbWFnZVVybHMubGVuZ3RoID4gMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLXdyYXBwZXIgaW50ZXJuYWwtZW1iZWQgaW1hZ2UtZW1iZWQgaXMtbG9hZGVkXCI+XHJcbiAgICAgICAgICAgICAge2ludGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcclxuICAgICAgICAgICAgICAgIDxJbWFnZVxyXG4gICAgICAgICAgICAgICAgICBrZXk9e2lkeH1cclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWVtby1pbWdcIlxyXG4gICAgICAgICAgICAgICAgICBpbWdVcmw9e2ltZ1VybC5wYXRofVxyXG4gICAgICAgICAgICAgICAgICBhbHQ9e2ltZ1VybC5hbHRUZXh0fVxyXG4gICAgICAgICAgICAgICAgICBmaWxlcGF0aD17aW1nVXJsLmZpbGVwYXRofVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICApKX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L09ubHk+XHJcbiAgICAgICAgICB7LyogPE9ubHkgd2hlbj17aW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAge2ltYWdlVXJscy5tYXAoKGltZ1VybCwgaWR4KSA9PiAoXHJcbiAgICAgICAgICAgICAgICA8SW1hZ2UgY2xhc3NOYW1lPVwibWVtby1pbWdcIiBrZXk9e2lkeH0gaW1nVXJsPXtpbWdVcmx9IC8+XHJcbiAgICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9Pbmx5PiAqL31cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxheWVyLWNvbnRhaW5lclwiPjwvZGl2PlxyXG4gICAgICAgIHtsaW5rTWVtb3MubWFwKChfLCBpZHgpID0+IHtcclxuICAgICAgICAgIGlmIChpZHggPCA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmFja2dyb3VuZC1sYXllci1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAga2V5PXtpZHh9XHJcbiAgICAgICAgICAgICAgICBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICBib3R0b206IChpZHggKyAxKSAqIC0zICsgJ3B4JyxcclxuICAgICAgICAgICAgICAgICAgbGVmdDogKGlkeCArIDEpICogNSArICdweCcsXHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBgY2FsYygxMDAlIC0gJHsoaWR4ICsgMSkgKiAxMH1weClgLFxyXG4gICAgICAgICAgICAgICAgICB6SW5kZXg6IC1pZHggLSAxLFxyXG4gICAgICAgICAgICAgICAgfX0+PC9kaXY+XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KX1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIHtsaW5rTWVtb3MubGVuZ3RoID4gMCA/IChcclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxpbmtlZC1tZW1vcy13cmFwcGVyXCI+XHJcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPnt0KCdMSU5LRUQnKX0ge2xpbmtNZW1vcy5sZW5ndGh9IE1FTU8gPC9wPlxyXG4gICAgICAgICAge2xpbmtNZW1vcy5tYXAoKG0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmF3dGV4dCA9IHBhcnNlSHRtbFRvUmF3VGV4dChmb3JtYXRNZW1vQ29udGVudChtLmNvbnRlbnQpKS5yZXBsYWNlQWxsKCdcXG4nLCAnICcpO1xyXG4gICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGlua2VkLW1lbW8tY29udGFpbmVyXCIga2V5PXttLmlkfSBvbkNsaWNrPXsoKSA9PiBoYW5kbGVMaW5rZWRNZW1vQ2xpY2sobSl9PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGltZS10ZXh0XCI+e20uZGF0ZVN0cn0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAge3Jhd3RleHR9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKSA6IG51bGx9XHJcbiAgICAgIHtsaW5rZWRNZW1vcy5sZW5ndGggPiAwID8gKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGlua2VkLW1lbW9zLXdyYXBwZXJcIj5cclxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm5vcm1hbC10ZXh0XCI+e2xpbmtlZE1lbW9zLmxlbmd0aH0gTUVNTyB7dCgnTElOSyBUTyBUSEUnKX0gTUVNTzwvcD5cclxuICAgICAgICAgIHtsaW5rZWRNZW1vcy5tYXAoKG0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmF3dGV4dCA9IHBhcnNlSHRtbFRvUmF3VGV4dChmb3JtYXRNZW1vQ29udGVudChtLmNvbnRlbnQpKS5yZXBsYWNlQWxsKCdcXG4nLCAnICcpO1xyXG4gICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGlua2VkLW1lbW8tY29udGFpbmVyXCIga2V5PXttLmlkfSBvbkNsaWNrPXsoKSA9PiBoYW5kbGVMaW5rZWRNZW1vQ2xpY2sobSl9PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGltZS10ZXh0XCI+e20uZGF0ZVN0cn0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAge3Jhd3RleHR9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgKSA6IG51bGx9XHJcbiAgICA8Lz5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hvd01lbW9DYXJkRGlhbG9nKG1lbW86IE1vZGVsLk1lbW8pOiB2b2lkIHtcclxuICBzaG93RGlhbG9nKFxyXG4gICAge1xyXG4gICAgICBjbGFzc05hbWU6ICdtZW1vLWNhcmQtZGlhbG9nJyxcclxuICAgIH0sXHJcbiAgICBNZW1vQ2FyZERpYWxvZyxcclxuICAgIHttZW1vfSxcclxuICApO1xyXG59XHJcbiIsImltcG9ydCB7ZGFpbHlOb3Rlc1NlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcclxuLy8gaW1wb3J0IHtyZXF1ZXN0fSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG5jb25zdCBjYWNoZWRSZXNvdXJjZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcblxyXG5jb25zdCBjb252ZXJ0UmVzb3VyY2VUb0RhdGFVUkwgPSBhc3luYyAodXJsOiBzdHJpbmcsIHVzZUNhY2hlID0gdHJ1ZSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgY29uc3Qge3ZhdWx0fSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCkuYXBwO1xyXG5cclxuICBpZiAodXNlQ2FjaGUgJiYgY2FjaGVkUmVzb3VyY2VNYXAuaGFzKHVybCkpIHtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2FjaGVkUmVzb3VyY2VNYXAuZ2V0KHVybCkgYXMgc3RyaW5nKTtcclxuICB9XHJcblxyXG4gIC8vIGxldCByZXM7XHJcblxyXG4gIGlmICghLyhodHRwfGh0dHBzKS9nLnRlc3QodXJsKSkge1xyXG4gICAgaWYgKGF3YWl0IHZhdWx0LmFkYXB0ZXIuZXhpc3RzKHVybCkpIHtcclxuICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgdmF1bHQuYWRhcHRlci5yZWFkQmluYXJ5KHVybCk7XHJcbiAgICAgIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcblxyXG4gICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2Fycl0sIHt0eXBlOiAnaW1hZ2UvcG5nJ30pO1xyXG4gICAgICAvLyB2YXIgbGVuID0gYXJyLmJ5dGVMZW5ndGg7XHJcbiAgICAgIC8vIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgLy8gICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBhcnJbIGkgXSApO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICAvLyByZXR1cm4gd2luZG93LmJ0b2EoIGJpbmFyeSApO1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBiYXNlNjRVcmwgPSByZWFkZXIucmVzdWx0IGFzIHN0cmluZztcclxuICAgICAgICAgIGNhY2hlZFJlc291cmNlTWFwLnNldCh1cmwsIGJhc2U2NFVybCk7XHJcbiAgICAgICAgICByZXNvbHZlKGJhc2U2NFVybCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIGdldEJhc2U2NEltYWdlKHVybCk7XHJcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IChhd2FpdCBkb3dubG9hZEZpbGUodXJsKSkuYnVmZmVyO1xyXG4gICAgICAvLyBjb25zdCBkb3dubG9hZCA9IGF3YWl0IHJlcXVlc3Qoe1xyXG4gICAgICAvLyAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgIC8vICAgdXJsOiB1cmwsXHJcbiAgICAgIC8vICAgY29udGVudFR5cGU6ICdpbWFnZS9hdmlmLGltYWdlL3dlYnAsaW1hZ2UvYXBuZyxpbWFnZS9zdmcreG1sLGltYWdlLyosKi8qO3E9MC44JyxcclxuICAgICAgLy8gICAvLyBoZWFkZXJzOiB7XHJcbiAgICAgIC8vICAgLy8gICBcIkNvbnRlbnQtVHlwZVwiOiBcImltYWdlL2F2aWYsaW1hZ2Uvd2VicCxpbWFnZS9hcG5nLGltYWdlL3N2Zyt4bWwsaW1hZ2UvKiwqLyo7cT0wLjhcIixcclxuICAgICAgLy8gICAvLyAgIEFjY2VwdDogXCJpbWFnZS9hdmlmLGltYWdlL3dlYnAsaW1hZ2UvYXBuZyxpbWFnZS9zdmcreG1sLGltYWdlLyosKi8qO3E9MC44XCIsXHJcbiAgICAgIC8vICAgLy8gICBcIlByb3h5LUNvbm5lY3Rpb25cIjogXCJrZWVwLWFsaXZlXCIsXHJcbiAgICAgIC8vICAgLy8gICBQcmFnbWE6IFwibm8tY2FjaGVcIixcclxuICAgICAgLy8gICAvLyAgIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLWNhY2hlXCIsXHJcbiAgICAgIC8vICAgLy8gICBcIlVzZXItQWdlbnRcIjogXCJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBvYnNpZGlhbi8wLjEyLjE5IENocm9tZS85MS4wLjQ0NzIuMTY0IEVsZWN0cm9uLzEzLjUuMiBTYWZhcmkvNTM3LjM2XCIsXHJcbiAgICAgIC8vICAgLy8gfSxcclxuICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAvLyBjb25zdCBlbmMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZG93bmxvYWQpOyAvLyBhbHdheXMgdXRmLThcclxuICAgICAgLy8gY29uc3QgYmYgPSBlbmM7XHJcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge3R5cGU6ICdpbWFnZS9wbmcnfSk7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGJhc2U2NFVybCA9IHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nO1xyXG4gICAgICAgICAgY2FjaGVkUmVzb3VyY2VNYXAuc2V0KHVybCwgYmFzZTY0VXJsKTtcclxuICAgICAgICAgIHJlc29sdmUoYmFzZTY0VXJsKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xyXG4gICAgICB9KTtcclxuICAgICAgLy8gcmV0dXJuICgoZG93bmxvYWQgPT09IFwiTm90IEZvdW5kXCIgfHwgZG93bmxvYWQgPT09IGB7XCJlcnJvclwiOlwiTm90IEZvdW5kXCJ9YCkgPyBudWxsIDogZG93bmxvYWQpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGluIGdyYWJSZWxlYXNlRmlsZUZyb21SZXBvc2l0b3J5JywgVVJMLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxuLy8gY29uc3QgZ2V0QmFzZTY0SW1hZ2UgPSAoaW1nOiBhbnkpID0+IHtcclxuXHJcbi8vICAgaW1nLmNyb3NzT3JpZ2luID0gJyc7XHJcblxyXG4vLyAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4vLyAgIGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcclxuLy8gICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcclxuXHJcbi8vICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbi8vICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xyXG5cclxuLy8gICB2YXIgZGF0YVVSTCA9IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIik7XHJcblxyXG4vLyAgIGNvbnNvbGUubG9nKGRhdGFVUkwucmVwbGFjZSgvXmRhdGE6aW1hZ2VcXC8ocG5nfGpwZyk7YmFzZTY0LC8sIFwiXCIpKTtcclxuXHJcbi8vICAgcmV0dXJuIDA7XHJcbi8vIH1cclxuXHJcbmNvbnN0IGRvd25sb2FkRmlsZSA9IGFzeW5jICh1cmw6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAvLyBtZXRob2Q6ICdHRVQnLFxyXG4gICAgbW9kZTogJ25vLWNvcnMnLFxyXG4gIH0pO1xyXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgb2s6IGZhbHNlLFxyXG4gICAgICBtc2c6IHJlc3BvbnNlLnN0YXR1c1RleHQsXHJcbiAgICB9O1xyXG4gIH1cclxuICBjb25zdCBidWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBvazogdHJ1ZSxcclxuICAgICAgbXNnOiAnb2snLFxyXG4gICAgICBidWZmZXI6IGJ1ZmZlcixcclxuICAgIH07XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBvazogZmFsc2UsXHJcbiAgICAgIG1zZzogZXJyLFxyXG4gICAgfTtcclxuICB9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjb252ZXJ0UmVzb3VyY2VUb0RhdGFVUkw7XHJcbiIsIi8vIGltcG9ydCBjb252ZXJ0UmVzb3VyY2VUb0RhdGFVUkwgZnJvbSBcIi4vY29udmVydFJlc291cmNlVG9EYXRhVVJMXCI7XHJcbi8vIGltcG9ydCB7IGRhaWx5Tm90ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xyXG5cclxuaW1wb3J0IGNvbnZlcnRSZXNvdXJjZVRvRGF0YVVSTCBmcm9tICcuL2NvbnZlcnRSZXNvdXJjZVRvRGF0YVVSTCc7XHJcblxyXG5jb25zdCBnZXRDbG9uZVN0eWxlZEVsZW1lbnQgPSBhc3luYyAoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcclxuICBjb25zdCBjbG9uZWRFbGVtZW50Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbGVtZW50LnRhZ05hbWUpO1xyXG4gIC8vIGNvbnN0IHsgdmF1bHQgfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCkuYXBwO1xyXG4gIGNsb25lZEVsZW1lbnRDb250YWluZXIuaW5uZXJIVE1MID0gZWxlbWVudC5pbm5lckhUTUw7XHJcblxyXG4gIGNvbnN0IGFwcGx5U3R5bGVzID0gYXN5bmMgKHNvdXJjZUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbG9uZWRFbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgaWYgKCFzb3VyY2VFbGVtZW50IHx8ICFjbG9uZWRFbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzb3VyY2VTdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzb3VyY2VFbGVtZW50KTtcclxuXHJcbiAgICBpZiAoc291cmNlRWxlbWVudC50YWdOYW1lID09PSAnSU1HJykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGNvbnZlcnRSZXNvdXJjZVRvRGF0YVVSTChcclxuICAgICAgICAgIHNvdXJjZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdwYXRoJykgPz8gc291cmNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3NyYycpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgKGNsb25lZEVsZW1lbnQgYXMgSFRNTEltYWdlRWxlbWVudCkuc3JjID0gdXJsO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIC8vIGRvIG50aFxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHNvdXJjZUVsZW1lbnQuY2xhc3NOYW1lID09PSAncHJvcGVydHktaW1hZ2UnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2VVcmwgPSBzb3VyY2VFbGVtZW50LnN0eWxlLmJhY2tncm91bmRJbWFnZTtcclxuICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBjb252ZXJ0UmVzb3VyY2VUb0RhdGFVUkwoaW1hZ2VVcmwpO1xyXG4gICAgICAgIChjbG9uZWRFbGVtZW50IGFzIEhUTUxJbWFnZUVsZW1lbnQpLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IHVybDtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAvLyBkbyBudGhcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBzb3VyY2VTdHlsZXMpIHtcclxuICAgICAgY2xvbmVkRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcclxuICAgICAgICBpdGVtLFxyXG4gICAgICAgIHNvdXJjZVN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKGl0ZW0pLFxyXG4gICAgICAgIHNvdXJjZVN0eWxlcy5nZXRQcm9wZXJ0eVByaW9yaXR5KGl0ZW0pLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xvbmVkRWxlbWVudC5jaGlsZEVsZW1lbnRDb3VudDsgaSsrKSB7XHJcbiAgICAgIGF3YWl0IGFwcGx5U3R5bGVzKHNvdXJjZUVsZW1lbnQuY2hpbGRyZW5baV0gYXMgSFRNTEVsZW1lbnQsIGNsb25lZEVsZW1lbnQuY2hpbGRyZW5baV0gYXMgSFRNTEVsZW1lbnQpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGF3YWl0IGFwcGx5U3R5bGVzKGVsZW1lbnQsIGNsb25lZEVsZW1lbnRDb250YWluZXIpO1xyXG5cclxuICByZXR1cm4gY2xvbmVkRWxlbWVudENvbnRhaW5lcjtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGdldENsb25lU3R5bGVkRWxlbWVudDtcclxuIiwiLy8gaW1wb3J0IGNvbnZlcnRSZXNvdXJjZVRvRGF0YVVSTCBmcm9tIFwiLi9jb252ZXJ0UmVzb3VyY2VUb0RhdGFVUkxcIjtcblxuY29uc3QgZ2V0Rm9udHNTdHlsZUVsZW1lbnQgPSBhc3luYyAoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcbiAgY29uc3Qgc3R5bGVTaGVldHMgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHM7XG4gIGNvbnN0IGZvbnRGYW1pbHlTdHlsZXM6IENTU1N0eWxlRGVjbGFyYXRpb25bXSA9IFtdO1xuXG4gIGZvciAoY29uc3Qgc2hlZXQgb2Ygc3R5bGVTaGVldHMpIHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2Ygc2hlZXQuY3NzUnVsZXMpIHtcbiAgICAgIGlmIChydWxlLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdDU1NGb250RmFjZVJ1bGUnKSB7XG4gICAgICAgIGZvbnRGYW1pbHlTdHlsZXMucHVzaCgocnVsZSBhcyBDU1NGb250RmFjZVJ1bGUpLnN0eWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuXG4gIC8vIGZvciAoY29uc3QgZiBvZiBmb250RmFtaWx5U3R5bGVzKSB7XG4gIC8vIGNvbnN0IGZvbnRGYW1pbHkgPSBmLmdldFByb3BlcnR5VmFsdWUoXCJmb250LWZhbWlseVwiKTtcbiAgLy8gY29uc3QgZm9udFdlaWdodCA9IGYuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtd2VpZ2h0XCIpO1xuICAvLyBjb25zdCBzcmMgPSBmLmdldFByb3BlcnR5VmFsdWUoXCJzcmNcIik7XG4gIC8vIGNvbnN0IHJlc291cmNlVXJscyA9IHNyYy5zcGxpdChcIixcIikubWFwKChzKSA9PiB7XG4gIC8vICAgcmV0dXJuIHMucmVwbGFjZSgvdXJsXFwoXCI/KC4rPylcIj9cXCkvLCBcIiQxXCIpO1xuICAvLyB9KTtcbiAgLy8gY29uc3QgYmFzZTY0VXJsczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBmb3IgKGNvbnN0IHVybCBvZiByZXNvdXJjZVVybHMpIHtcbiAgLy8gICB0cnkge1xuICAvLyAgICAgY29uc3QgYmFzZTY0VXJsID0gYXdhaXQgY29udmVydFJlc291cmNlVG9EYXRhVVJMKHVybCk7XG4gIC8vICAgICBiYXNlNjRVcmxzLnB1c2goYHVybChcIiR7YmFzZTY0VXJsfVwiKWApO1xuICAvLyAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gIC8vICAgICAvLyBkbyBudGhcbiAgLy8gICB9XG4gIC8vIH1cblxuICAvLyBzdHlsZUVsZW1lbnQuaW5uZXJIVE1MICs9IGBcbiAgLy8gICBAZm9udC1mYWNlIHtcbiAgLy8gICAgIGZvbnQtZmFtaWx5OiBcIiR7Zm9udEZhbWlseX1cIjtcbiAgLy8gICAgIHNyYzogJHtiYXNlNjRVcmxzLmpvaW4oXCIsXCIpfTtcbiAgLy8gICAgIGZvbnQtd2VpZ2h0OiAke2ZvbnRXZWlnaHR9O1xuICAvLyAgIH1gO1xuICAvLyB9XG5cbiAgcmV0dXJuIHN0eWxlRWxlbWVudDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGdldEZvbnRzU3R5bGVFbGVtZW50O1xuIiwiLyoqXG4gKiBIVE1MIHRvIEltYWdlXG4gKlxuICogUmVmZXJlbmNlczpcbiAqIDEuIGh0bWwtdG8taW1hZ2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9idWJrb28vaHRtbC10by1pbWFnZVxuICogMi4gPGZvcmVpZ25PYmplY3Q+OiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TVkcvRWxlbWVudC9mb3JlaWduT2JqZWN0XG4gKi9cbmltcG9ydCBnZXRDbG9uZVN0eWxlZEVsZW1lbnQgZnJvbSAnLi9nZXRDbG9uZVN0eWxlZEVsZW1lbnQnO1xuaW1wb3J0IGdldEZvbnRzU3R5bGVFbGVtZW50IGZyb20gJy4vZ2V0Rm9udHNTdHlsZUVsZW1lbnQnO1xuXG50eXBlIE9wdGlvbnMgPSBQYXJ0aWFsPHtcbiAgYmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG4gIHBpeGVsUmF0aW86IG51bWJlcjtcbn0+O1xuXG5jb25zdCBnZXRFbGVtZW50U2l6ZSA9IChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiBwYXJzZUludCh3aWR0aC5yZXBsYWNlKCdweCcsICcnKSksXG4gICAgaGVpZ2h0OiBwYXJzZUludChoZWlnaHQucmVwbGFjZSgncHgnLCAnJykpLFxuICB9O1xufTtcblxuY29uc3QgY29udmVydFNWR1RvRGF0YVVSTCA9IChzdmc6IFNWR0VsZW1lbnQpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB4bWwgPSBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHN2Zyk7XG4gIGNvbnN0IHVybCA9IGVuY29kZVVSSUNvbXBvbmVudCh4bWwpO1xuICByZXR1cm4gYGRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCR7dXJsfWA7XG59O1xuXG5jb25zdCBnZW5lcmF0ZVNWR0VsZW1lbnQgPSAod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogU1ZHU1ZHRWxlbWVudCA9PiB7XG4gIGNvbnN0IHhtbE5TID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcbiAgY29uc3Qgc3ZnRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh4bWxOUywgJ3N2ZycpO1xuXG4gIHN2Z0VsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIGAke3dpZHRofWApO1xuICBzdmdFbGVtZW50LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgYCR7aGVpZ2h0fWApO1xuICBzdmdFbGVtZW50LnNldEF0dHJpYnV0ZSgndmlld0JveCcsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG5cbiAgY29uc3QgZm9yZWlnbk9iamVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh4bWxOUywgJ2ZvcmVpZ25PYmplY3QnKTtcblxuICBmb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMTAwJScpO1xuICBmb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgJzEwMCUnKTtcbiAgZm9yZWlnbk9iamVjdC5zZXRBdHRyaWJ1dGUoJ3gnLCAnMCcpO1xuICBmb3JlaWduT2JqZWN0LnNldEF0dHJpYnV0ZSgneScsICcwJyk7XG4gIGZvcmVpZ25PYmplY3Quc2V0QXR0cmlidXRlKCdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJywgJ3RydWUnKTtcblxuICBmb3JlaWduT2JqZWN0LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICBzdmdFbGVtZW50LmFwcGVuZENoaWxkKGZvcmVpZ25PYmplY3QpO1xuXG4gIHJldHVybiBzdmdFbGVtZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IHRvU1ZHID0gYXN5bmMgKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogT3B0aW9ucykgPT4ge1xuICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBnZXRFbGVtZW50U2l6ZShlbGVtZW50KTtcblxuICBjb25zdCBjbG9uZWRFbGVtZW50ID0gYXdhaXQgZ2V0Q2xvbmVTdHlsZWRFbGVtZW50KGVsZW1lbnQpO1xuXG4gIGlmIChvcHRpb25zPy5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICBjbG9uZWRFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICB9XG5cbiAgY29uc3Qgc3ZnID0gZ2VuZXJhdGVTVkdFbGVtZW50KHdpZHRoLCBoZWlnaHQsIGNsb25lZEVsZW1lbnQpO1xuICBzdmcucHJlcGVuZChhd2FpdCBnZXRGb250c1N0eWxlRWxlbWVudChlbGVtZW50KSk7XG5cbiAgY29uc3QgdXJsID0gY29udmVydFNWR1RvRGF0YVVSTChzdmcpO1xuXG4gIHJldHVybiB1cmw7XG59O1xuXG5leHBvcnQgY29uc3QgdG9DYW52YXMgPSBhc3luYyAoZWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBPcHRpb25zKTogUHJvbWlzZTxIVE1MQ2FudmFzRWxlbWVudD4gPT4ge1xuICBjb25zdCB1cmwgPSBhd2FpdCB0b1NWRyhlbGVtZW50LCBvcHRpb25zKTtcblxuICBjb25zdCBpbWFnZUVsID0gbmV3IEltYWdlKCk7XG4gIGltYWdlRWwuc3JjID0gdXJsO1xuXG4gIGNvbnN0IHJhdGlvID0gb3B0aW9ucz8ucGl4ZWxSYXRpbyB8fCAxO1xuICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBnZXRFbGVtZW50U2l6ZShlbGVtZW50KTtcblxuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gIGlmICghY29udGV4dCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnQ2FudmFzIGVycm9yJyk7XG4gIH1cblxuICBjYW52YXMud2lkdGggPSB3aWR0aCAqIHJhdGlvO1xuICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogcmF0aW87XG5cbiAgY2FudmFzLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9YDtcbiAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1gO1xuXG4gIGlmIChvcHRpb25zPy5iYWNrZ3JvdW5kQ29sb3IgfHwgZG9jdW1lbnQuYm9keS5jbGFzc05hbWUuY29udGFpbnMoJ3RoZW1lLWRhcmsnKSkge1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IgfHwgJyMxZjFmMWYnO1xuICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGltYWdlRWwub25sb2FkID0gKCkgPT4ge1xuICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1hZ2VFbCwgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgICAgcmVzb2x2ZShjYW52YXMpO1xuICAgIH07XG4gIH0pO1xufTtcblxuY29uc3QgdG9JbWFnZSA9IGFzeW5jIChlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IE9wdGlvbnMpID0+IHtcbiAgY29uc3QgY2FudmFzID0gYXdhaXQgdG9DYW52YXMoZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgLy8gY2FudmFzLnRvQmxvYihmdW5jdGlvbiBkZWFsKGJsb2IpIHtcbiAgLy8gICB2YXIgY2xpcGJvYXJkSXRlbSA9IG5ldyBDbGlwYm9hcmRJdGVtKHtbYGltYWdlL3BuZ2BdOiBibG9ifSk7XG4gIC8vICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZShbY2xpcGJvYXJkSXRlbV0pLnRoZW4oKCkgPT4ge1xuICAvLyAgICAgICBhbGVydCgn5aSN5Yi25oiQ5YqfJyk7XG4gIC8vICAgfSk7XG4gIC8vIH0sKTtcbiAgLy8gY29uc29sZS5sb2coY2FudmFzKTtcblxuICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgdG9JbWFnZTtcbiIsImltcG9ydCB7dXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XHJcbi8vIGltcG9ydCB7IHVzZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzXCI7XHJcbmltcG9ydCB0b0ltYWdlIGZyb20gJy4uL2xhYnMvaHRtbDJpbWFnZSc7XHJcbmltcG9ydCB7XHJcbiAgQU5JTUFUSU9OX0RVUkFUSU9OLFxyXG4gIElNQUdFX1VSTF9SRUcsXHJcbiAgTUFSS0RPV05fVVJMX1JFRyxcclxuICBNQVJLRE9XTl9XRUJfVVJMX1JFRyxcclxuICBXSUtJX0lNQUdFX1VSTF9SRUcsXHJcbn0gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xyXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XHJcbmltcG9ydCB7c2hvd0RpYWxvZ30gZnJvbSAnLi9EaWFsb2cnO1xyXG5pbXBvcnQge2Zvcm1hdE1lbW9Db250ZW50fSBmcm9tICcuL01lbW8nO1xyXG5pbXBvcnQgT25seSBmcm9tICcuL2NvbW1vbi9Pbmx5V2hlbic7XHJcbmltcG9ydCAnLi4vbGVzcy9zaGFyZS1tZW1vLWltYWdlLWRpYWxvZy5sZXNzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtOb3RpY2UsIFRGaWxlLCBWYXVsdCwgbW9tZW50LCBQbGF0Zm9ybX0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcclxuaW1wb3J0IHtcclxuICBTaGFyZUZvb3RlckVuZCxcclxuICBVc2VyTmFtZSxcclxuICBTaGFyZUZvb3RlclN0YXJ0LFxyXG4gIEF1dG9TYXZlV2hlbk9uTW9iaWxlLFxyXG4gIERlZmF1bHRMaWdodEJhY2tncm91bmRJbWFnZSxcclxuICBEZWZhdWx0RGFya0JhY2tncm91bmRJbWFnZSxcclxufSBmcm9tICcuLi9tZW1vcyc7XHJcbmltcG9ydCBjbG9zZSBmcm9tICcuLi9pY29ucy9jbG9zZS5zdmcnO1xyXG5pbXBvcnQgc2hhcmUgZnJvbSAnLi4vaWNvbnMvc2hhcmUuc3ZnJztcclxuaW1wb3J0IGxpZ2h0QmFja2dyb3VuZCBmcm9tICcuLi9pY29ucy9saWdodEJhY2tncm91bmQuc3ZnJztcclxuaW1wb3J0IGRhcmtCYWNrZ3JvdW5kIGZyb20gJy4uL2ljb25zL2RhcmtCYWNrZ3JvdW5kLnN2Zyc7XHJcbmltcG9ydCB7Z2V0QWxsRGFpbHlOb3Rlc30gZnJvbSAnb2JzaWRpYW4tZGFpbHktbm90ZXMtaW50ZXJmYWNlJztcclxuaW1wb3J0IHt0fSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuaW1wb3J0IHtkYWlseU5vdGVzU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMnO1xyXG5cclxuaW50ZXJmYWNlIFByb3BzIGV4dGVuZHMgRGlhbG9nUHJvcHMge1xyXG4gIG1lbW86IE1vZGVsLk1lbW87XHJcbn1cclxuXHJcbmludGVyZmFjZSBMaW5rTWF0Y2gge1xyXG4gIGxpbmtUZXh0OiBzdHJpbmc7XHJcbiAgYWx0VGV4dDogc3RyaW5nO1xyXG4gIHBhdGg6IHN0cmluZztcclxuICBmaWxlUGF0aD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldFBhdGhPZkltYWdlID0gKHZhdWx0OiBWYXVsdCwgaW1hZ2U6IFRGaWxlKSA9PiB7XHJcbiAgcmV0dXJuIHZhdWx0LmdldFJlc291cmNlUGF0aChpbWFnZSk7XHJcbn07XHJcblxyXG5jb25zdCBkZXRlY3RXaWtpSW50ZXJuYWxMaW5rID0gKGxpbmVUZXh0OiBzdHJpbmcpOiBMaW5rTWF0Y2ggfCBudWxsID0+IHtcclxuICBjb25zdCB7bWV0YWRhdGFDYWNoZSwgdmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG4gIGNvbnN0IGludGVybmFsRmlsZU5hbWUgPSBXSUtJX0lNQUdFX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/LlsxXTtcclxuICBjb25zdCBpbnRlcm5hbEFsdE5hbWUgPSBXSUtJX0lNQUdFX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/Lls1XTtcclxuICBjb25zdCBmaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcclxuXHJcbiAgaWYgKGZpbGUgPT09IG51bGwpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXHJcbiAgICAgIHBhdGg6ICcnLFxyXG4gICAgICBmaWxlUGF0aDogJycsXHJcbiAgICB9O1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBpbWFnZVBhdGggPSBnZXRQYXRoT2ZJbWFnZSh2YXVsdCwgZmlsZSk7XHJcbiAgICBpZiAoaW50ZXJuYWxBbHROYW1lKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxyXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcclxuICAgICAgICBmaWxlUGF0aDogZmlsZS5wYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgICBhbHRUZXh0OiAnJyxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZVBhdGg6IGZpbGUucGF0aCxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBkZXRlY3RNREludGVybmFsTGluayA9IChsaW5lVGV4dDogc3RyaW5nKTogTGlua01hdGNoIHwgbnVsbCA9PiB7XHJcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcclxuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xyXG4gIGNvbnN0IGludGVybmFsQWx0TmFtZSA9IE1BUktET1dOX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/LlsyXTtcclxuICBjb25zdCBmaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcclxuXHJcbiAgaWYgKGZpbGUgPT09IG51bGwpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXHJcbiAgICAgIHBhdGg6ICcnLFxyXG4gICAgICBmaWxlUGF0aDogJycsXHJcbiAgICB9O1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBpbWFnZVBhdGggPSBnZXRQYXRoT2ZJbWFnZSh2YXVsdCwgZmlsZSk7XHJcbiAgICBpZiAoaW50ZXJuYWxBbHROYW1lKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxyXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcclxuICAgICAgICBmaWxlUGF0aDogZmlsZS5wYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgICBhbHRUZXh0OiAnJyxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZVBhdGg6IGZpbGUucGF0aCxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBTaGFyZU1lbW9JbWFnZURpYWxvZzogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xyXG4gIGNvbnN0IHttZW1vOiBwcm9wc01lbW8sIGRlc3Ryb3l9ID0gcHJvcHM7XHJcbiAgY29uc3Qge21lbW9zfSA9IGFwcFN0b3JlLmdldFN0YXRlKCkubWVtb1N0YXRlO1xyXG4gIGxldCBtZW1vc0xlbmd0aDtcclxuICBsZXQgY3JlYXRlZERheXM7XHJcbiAgaWYgKG1lbW9zLmxlbmd0aCkge1xyXG4gICAgbWVtb3NMZW5ndGggPSBtZW1vcy5sZW5ndGggLSAxO1xyXG4gICAgY3JlYXRlZERheXMgPSBtZW1vc1xyXG4gICAgICA/IE1hdGguY2VpbCgoRGF0ZS5ub3coKSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShtZW1vc1ttZW1vc0xlbmd0aF0uY3JlYXRlZEF0KSkgLyAxMDAwIC8gMzYwMCAvIDI0KVxyXG4gICAgICA6IDA7XHJcbiAgfVxyXG4gIC8vIGNvbnN0IHsgdXNlcjogdXNlcmluZm8gfSA9IHVzZXJTZXJ2aWNlLmdldFN0YXRlKCk7XHJcbiAgY29uc3QgbWVtbzogRm9ybWF0dGVkTWVtbyA9IHtcclxuICAgIC4uLnByb3BzTWVtbyxcclxuICAgIGNyZWF0ZWRBdFN0cjogdXRpbHMuZ2V0RGF0ZVRpbWVTdHJpbmcocHJvcHNNZW1vLmNyZWF0ZWRBdCksXHJcbiAgfTtcclxuICAvLyBjb25zdCBtZW1vSW1nVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpID8/IFtdKTtcclxuICAvLyBjb25zdCBtZW1vc051bSA9IG1lbW9zLmxlbmd0aDtcclxuXHJcbiAgY29uc3QgZm9vdGVyRW5kID0gU2hhcmVGb290ZXJFbmQucmVwbGFjZSgne1VzZXJOYW1lfScsIFVzZXJOYW1lKTtcclxuICBjb25zdCBmb290ZXJTdGFydCA9IFNoYXJlRm9vdGVyU3RhcnQucmVwbGFjZSgne01lbW9zTnVtfScsIG1lbW9zLmxlbmd0aC50b1N0cmluZygpKS5yZXBsYWNlKFxyXG4gICAgJ3tVc2VkRGF5fScsXHJcbiAgICBjcmVhdGVkRGF5cy50b1N0cmluZygpLFxyXG4gICk7XHJcblxyXG4gIGxldCBleHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xyXG4gIGxldCBpbnRlcm5hbEltYWdlVXJscyA9IFtdO1xyXG4gIGxldCBhbGxNYXJrZG93bkxpbms6IHN0cmluZyB8IGFueVtdID0gW107XHJcbiAgbGV0IGFsbEludGVybmFsTGluayA9IFtdIGFzIGFueVtdO1xyXG4gIGlmIChJTUFHRV9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xyXG4gICAgbGV0IGFsbEV4dGVybmFsSW1hZ2VVcmxzID0gW10gYXMgc3RyaW5nW107XHJcbiAgICBsZXQgYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzID0gW10gYXMgc3RyaW5nW107XHJcbiAgICBpZiAoTUFSS0RPV05fVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcclxuICAgICAgYWxsTWFya2Rvd25MaW5rID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goTUFSS0RPV05fVVJMX1JFRykpO1xyXG4gICAgfVxyXG4gICAgaWYgKFdJS0lfSU1BR0VfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcclxuICAgICAgYWxsSW50ZXJuYWxMaW5rID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goV0lLSV9JTUFHRV9VUkxfUkVHKSk7XHJcbiAgICB9XHJcbiAgICAvLyBjb25zdCBhbGxJbnRlcm5hbExpbmsgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChXSUtJX0lNQUdFX1VSTF9SRUcpKTtcclxuICAgIGlmIChNQVJLRE9XTl9XRUJfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcclxuICAgICAgYWxsRXh0ZXJuYWxJbWFnZVVybHMgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChNQVJLRE9XTl9XRUJfVVJMX1JFRykpO1xyXG4gICAgfVxyXG4gICAgaWYgKGFsbEludGVybmFsTGluay5sZW5ndGgpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxJbnRlcm5hbExpbmsubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgb25lID0gYWxsSW50ZXJuYWxMaW5rW2ldO1xyXG4gICAgICAgIGludGVybmFsSW1hZ2VVcmxzLnB1c2goZGV0ZWN0V2lraUludGVybmFsTGluayhvbmUpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGFsbE1hcmtkb3duTGluay5sZW5ndGgpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxNYXJrZG93bkxpbmsubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgdHdvID0gYWxsTWFya2Rvd25MaW5rW2ldO1xyXG4gICAgICAgIGlmICgvKC4qKWh0dHBbc10/KC4qKS8udGVzdCh0d28pKSB7XHJcbiAgICAgICAgICBhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMucHVzaChNQVJLRE9XTl9VUkxfUkVHLmV4ZWModHdvKT8uWzVdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaW50ZXJuYWxJbWFnZVVybHMucHVzaChkZXRlY3RNREludGVybmFsTGluayh0d28pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGV4dGVybmFsSW1hZ2VVcmxzID0gYWxsRXh0ZXJuYWxJbWFnZVVybHMuY29uY2F0KGFub3RoZXJFeHRlcm5hbEltYWdlVXJscyk7XHJcbiAgICAvLyBleHRlcm5hbEltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpID8/IFtdKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IFtzaG9ydGN1dEltZ1VybCwgc2V0U2hvcnRjdXRJbWdVcmxdID0gdXNlU3RhdGUoJycpO1xyXG4gIGNvbnN0IFtpbWdBbW91bnQsIHNldEltZ0Ftb3VudF0gPSB1c2VTdGF0ZShleHRlcm5hbEltYWdlVXJscy5sZW5ndGgpO1xyXG4gIGNvbnN0IG1lbW9FbFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAoaW1nQW1vdW50ID4gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlQmFja2dyb3VuZEltYWdlKCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICghbWVtb0VsUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBzaGFyZURpYWxvZ0JhY2tncm91bmRDb2xvcjtcclxuXHJcbiAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNsYXNzTmFtZS5jb250YWlucygndGhlbWUtZGFyaycpKSB7XHJcbiAgICAgICAgc2hhcmVEaWFsb2dCYWNrZ3JvdW5kQ29sb3IgPSAnIzcyNzE3MSc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2hhcmVEaWFsb2dCYWNrZ3JvdW5kQ29sb3IgPSAnI2VhZWFlYSc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRvSW1hZ2UobWVtb0VsUmVmLmN1cnJlbnQsIHtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHNoYXJlRGlhbG9nQmFja2dyb3VuZENvbG9yLFxyXG4gICAgICAgIHBpeGVsUmF0aW86IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogMixcclxuICAgICAgfSlcclxuICAgICAgICAudGhlbigodXJsKSA9PiB7XHJcbiAgICAgICAgICBzZXRTaG9ydGN1dEltZ1VybCh1cmwpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgIC8vIGRvIG50aFxyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgQU5JTUFUSU9OX0RVUkFUSU9OKTtcclxuICB9LCBbaW1nQW1vdW50XSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUNsb3NlQnRuQ2xpY2sgPSAoKSA9PiB7XHJcbiAgICBkZXN0cm95KCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgY29udmVydEJhc2U2NFRvQmxvYiA9IChiYXNlNjQ6IHN0cmluZywgdHlwZTogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCBieXRlcyA9IHdpbmRvdy5hdG9iKGJhc2U2NCk7XHJcbiAgICBjb25zdCBhYiA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xyXG4gICAgY29uc3QgaWEgPSBuZXcgVWludDhBcnJheShhYik7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlhW2ldID0gYnl0ZXMuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgQmxvYihbYWJdLCB7dHlwZTogdHlwZX0pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGNvbnZlcnRCYWNrZ3JvdW5kVG9CYXNlNjQgPSBhc3luYyAocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcclxuICAgIGNvbnN0IHt2YXVsdH0gPSBkYWlseU5vdGVzU2VydmljZS5nZXRTdGF0ZSgpLmFwcDtcclxuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHZhdWx0LmFkYXB0ZXIucmVhZEJpbmFyeShwYXRoKTtcclxuICAgIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcblxyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFthcnJdLCB7dHlwZTogJ2ltYWdlL3BuZyd9KTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBiYXNlNjRVcmwgPSByZWFkZXIucmVzdWx0IGFzIHN0cmluZztcclxuICAgICAgICAvLyBjYWNoZWRSZXNvdXJjZU1hcC5zZXQodXJsLCBiYXNlNjRVcmwpO1xyXG4gICAgICAgIHJlc29sdmUoYmFzZTY0VXJsKTtcclxuICAgICAgfTtcclxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XHJcbiAgICB9KTtcclxuICB9O1xyXG5cclxuICBjb25zdCBjaGFuZ2VCYWNrZ3JvdW5kSW1hZ2UgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCB7YXBwfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XHJcbiAgICBsZXQgaW1hZ2VVcmw7XHJcbiAgICBsZXQgaW1hZ2VQYXRoO1xyXG4gICAgY29uc3QgbGlnaHRCYWNrZ3JvdW5kSW1hZ2UgPSBlbmNvZGVVUkkobGlnaHRCYWNrZ3JvdW5kKTtcclxuICAgIGNvbnN0IGRhcmtCYWNrZ3JvdW5kSW1hZ2UgPSBlbmNvZGVVUkkoZGFya0JhY2tncm91bmQpO1xyXG4gICAgaWYgKGRvY3VtZW50LmJvZHkuY2xhc3NOYW1lLmNvbnRhaW5zKCd0aGVtZS1saWdodCcpKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKERlZmF1bHRMaWdodEJhY2tncm91bmRJbWFnZSkpICYmXHJcbiAgICAgICAgL1xcLihwbmd8c3ZnfGpwZ3xqcGVnKS9nLnRlc3QoRGVmYXVsdExpZ2h0QmFja2dyb3VuZEltYWdlKVxyXG4gICAgICApIHtcclxuICAgICAgICBpbWFnZVBhdGggPSBEZWZhdWx0TGlnaHRCYWNrZ3JvdW5kSW1hZ2U7XHJcbiAgICAgICAgaW1hZ2VVcmwgPSBhd2FpdCBjb252ZXJ0QmFja2dyb3VuZFRvQmFzZTY0KGltYWdlUGF0aCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW1hZ2VVcmwgPSBsaWdodEJhY2tncm91bmRJbWFnZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChkb2N1bWVudC5ib2R5LmNsYXNzTmFtZS5jb250YWlucygndGhlbWUtZGFyaycpKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKERlZmF1bHREYXJrQmFja2dyb3VuZEltYWdlKSkgJiZcclxuICAgICAgICAvXFwuKHBuZ3xzdmd8anBnfGpwZWcpL2cudGVzdChEZWZhdWx0RGFya0JhY2tncm91bmRJbWFnZSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgaW1hZ2VQYXRoID0gRGVmYXVsdERhcmtCYWNrZ3JvdW5kSW1hZ2U7XHJcbiAgICAgICAgaW1hZ2VVcmwgPSBhd2FpdCBjb252ZXJ0QmFja2dyb3VuZFRvQmFzZTY0KGltYWdlUGF0aCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW1hZ2VVcmwgPSBkYXJrQmFja2dyb3VuZEltYWdlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBtZW1vU2hhcmVEaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZGlhbG9nLXdyYXBwZXIgLm1lbW8tYmFja2dyb3VuZCAucHJvcGVydHktaW1hZ2UnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIG1lbW9TaGFyZURpdi5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBcInVybCgnXCIgKyBpbWFnZVVybCArIFwiJylcIjtcclxuICAgIGlmIChkb2N1bWVudC5ib2R5LmNsYXNzTmFtZS5jb250YWlucygndGhlbWUtZGFyaycpKSB7XHJcbiAgICAgIG1lbW9TaGFyZURpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnIzFmMWYxZic7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlQ29weXRvQ2xpcGJvYXJkQnRuQ2xpY2sgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBjb25zdCB7dmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG4gICAgY29uc3QgZGl2cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZW1vLXNob3J0Y3V0LWltZycpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29uc3QgbXlCYXNlNjQgPSBkaXZzLmdldEF0dHJpYnV0ZSgnc3JjJykuc3BsaXQoJ2Jhc2U2NCwnKVsxXTtcclxuICAgIGNvbnN0IGJsb2JJbnB1dCA9IGNvbnZlcnRCYXNlNjRUb0Jsb2IobXlCYXNlNjQsICdpbWFnZS9wbmcnKTtcclxuICAgIGxldCBhRmlsZTogVEZpbGU7XHJcbiAgICBsZXQgbmV3RmlsZTtcclxuICAgIGlmIChBdXRvU2F2ZVdoZW5Pbk1vYmlsZSAmJiBQbGF0Zm9ybS5pc01vYmlsZSkge1xyXG4gICAgICBibG9iSW5wdXQuYXJyYXlCdWZmZXIoKS50aGVuKGFzeW5jIChidWZmZXIpID0+IHtcclxuICAgICAgICBjb25zdCBleHQgPSAncG5nJztcclxuICAgICAgICBjb25zdCBkYWlseU5vdGVzID0gZ2V0QWxsRGFpbHlOb3RlcygpO1xyXG4gICAgICAgIGZvciAoY29uc3Qgc3RyaW5nIGluIGRhaWx5Tm90ZXMpIHtcclxuICAgICAgICAgIGlmIChkYWlseU5vdGVzW3N0cmluZ10gaW5zdGFuY2VvZiBURmlsZSkge1xyXG4gICAgICAgICAgICBhRmlsZSA9IGRhaWx5Tm90ZXNbc3RyaW5nXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhRmlsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBuZXdGaWxlID0gYXdhaXQgdmF1bHQuY3JlYXRlQmluYXJ5KFxyXG4gICAgICAgICAgICAvL0B0cy1leHBlY3QtZXJyb3IsIHByaXZhdGUgbWV0aG9kXHJcbiAgICAgICAgICAgIGF3YWl0IHZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50cyhgUGFzdGVkIEltYWdlICR7bW9tZW50KCkuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpfWAsIGV4dCwgYUZpbGUpLFxyXG4gICAgICAgICAgICBidWZmZXIsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjbGlwYm9hcmRJdGVtSW5wdXQgPSBuZXcgQ2xpcGJvYXJkSXRlbSh7J2ltYWdlL3BuZyc6IGJsb2JJbnB1dH0pO1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgd2luZG93Lm5hdmlnYXRvclsnY2xpcGJvYXJkJ10ud3JpdGUoW2NsaXBib2FyZEl0ZW1JbnB1dF0pO1xyXG4gICAgbmV3IE5vdGljZSgnU2VuZCB0byBjbGlwYm9hcmQgc3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlSW1hZ2VPbkxvYWQgPSAoZXY6IFJlYWN0LlN5bnRoZXRpY0V2ZW50PEhUTUxJbWFnZUVsZW1lbnQ+KSA9PiB7XHJcbiAgICBpZiAoZXYudHlwZSA9PT0gJ2Vycm9yJykge1xyXG4gICAgICBuZXcgTm90aWNlKCfmnInkuKrlm77niYfliqDovb3lpLHotKXkuobwn5ifJyk7XHJcbiAgICAgIChldi50YXJnZXQgYXMgSFRNTEltYWdlRWxlbWVudCkucmVtb3ZlKCk7XHJcbiAgICB9XHJcbiAgICBzZXRJbWdBbW91bnQoaW1nQW1vdW50IC0gMSk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDw+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGlhbG9nLWhlYWRlci1jb250YWluZXJcIj5cclxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXRsZS10ZXh0XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uLXRleHRcIj7wn6WwPC9zcGFuPlxyXG4gICAgICAgICAge3QoJ1NoYXJlIE1lbW8gSW1hZ2UnKX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJidG4tZ3JvdXBcIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGNvcHktYnRuXCIgb25DbGljaz17aGFuZGxlQ29weXRvQ2xpcGJvYXJkQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtzaGFyZX0gLz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gY2xvc2UtYnRuXCIgb25DbGljaz17aGFuZGxlQ2xvc2VCdG5DbGlja30+XHJcbiAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2Nsb3NlfSAvPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1jb250ZW50LWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgdGlwLXdvcmRzLWNvbnRhaW5lciAke3Nob3J0Y3V0SW1nVXJsID8gJ2ZpbmlzaCcgOiAnbG9hZGluZyd9YH0+XHJcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPntzaG9ydGN1dEltZ1VybCA/IHQoJ+KGl0NsaWNrIHRoZSBidXR0b24gdG8gc2F2ZScpIDogdCgnSW1hZ2UgaXMgZ2VuZXJhdGluZy4uLicpfTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbW8tY29udGFpbmVyXCIgcmVmPXttZW1vRWxSZWZ9PlxyXG4gICAgICAgICAgPE9ubHkgd2hlbj17c2hvcnRjdXRJbWdVcmwgIT09ICcnfT5cclxuICAgICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJtZW1vLXNob3J0Y3V0LWltZ1wiIHNyYz17c2hvcnRjdXRJbWdVcmx9IC8+XHJcbiAgICAgICAgICA8L09ubHk+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbW8tYmFja2dyb3VuZFwiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicHJvcGVydHktaW1hZ2VcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kU2l6ZTogJ2NvdmVyJyxcclxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRSZXBlYXQ6ICduby1yZXBlYXQnLFxyXG4gICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgey8qIDxzcGFuIGNsYXNzTmFtZT1cInRpbWUtdGV4dFwiPnttZW1vLmNyZWF0ZWRBdFN0cn08L3NwYW4+ICovfVxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJiYWNrZ3JvdW5kLWNvbnRhaW5lclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1lbW8tY29udGVudC10ZXh0XCJcclxuICAgICAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e19faHRtbDogZm9ybWF0TWVtb0NvbnRlbnQobWVtby5jb250ZW50KX19XHJcbiAgICAgICAgICAgID48L2Rpdj5cclxuICAgICAgICAgICAgPE9ubHkgd2hlbj17ZXh0ZXJuYWxJbWFnZVVybHMubGVuZ3RoID4gMH0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbWFnZXMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICB7ZXh0ZXJuYWxJbWFnZVVybHMubWFwKChpbWdVcmwsIGlkeCkgPT4gKFxyXG4gICAgICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3NPcmlnaW49XCJhbm9ueW1vdXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlY29kaW5nPVwiYXN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAgIGtleT17aWR4fVxyXG4gICAgICAgICAgICAgICAgICAgIHNyYz17aW1nVXJsfVxyXG4gICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3k9XCJuby1yZWZlcnJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgb25Mb2FkPXtoYW5kbGVJbWFnZU9uTG9hZH1cclxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yPXtoYW5kbGVJbWFnZU9uTG9hZH1cclxuICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICkpfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L09ubHk+XHJcbiAgICAgICAgICAgIDxPbmx5IHdoZW49e2ludGVybmFsSW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLWNvbnRhaW5lciBpbnRlcm5hbC1lbWJlZCBpbWFnZS1lbWJlZCBpcy1sb2FkZWRcIj5cclxuICAgICAgICAgICAgICAgIHtpbnRlcm5hbEltYWdlVXJscy5tYXAoKGltZ1VybCwgaWR4KSA9PiAoXHJcbiAgICAgICAgICAgICAgICAgIDxpbWcga2V5PXtpZHh9IGNsYXNzTmFtZT1cIm1lbW8taW1nXCIgc3JjPXtpbWdVcmwucGF0aH0gYWx0PXtpbWdVcmwuYWx0VGV4dH0gcGF0aD17aW1nVXJsLmZpbGVQYXRofSAvPlxyXG4gICAgICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvT25seT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3YXRlcm1hcmstY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHQgZm9vdGVyLXN0YXJ0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInByb3BlcnR5LXNvY2lhbC1pY29uc1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibmFtZS10ZXh0XCI+e2Zvb3RlclN0YXJ0fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHQgZm9vdGVyLWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibmFtZS10ZXh0XCI+e2Zvb3RlckVuZH08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvPlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaG93U2hhcmVNZW1vSW1hZ2VEaWFsb2cobWVtbzogTW9kZWwuTWVtbyk6IHZvaWQge1xyXG4gIHNob3dEaWFsb2coXHJcbiAgICB7XHJcbiAgICAgIGNsYXNzTmFtZTogJ3NoYXJlLW1lbW8taW1hZ2UtZGlhbG9nJyxcclxuICAgIH0sXHJcbiAgICBTaGFyZU1lbW9JbWFnZURpYWxvZyxcclxuICAgIHttZW1vfSxcclxuICApO1xyXG59XHJcbiIsImltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgZGFpbHlOb3Rlc1NlcnZpY2UgZnJvbSAnLi4vc2VydmljZXMvZGFpbHlOb3Rlc1NlcnZpY2UnO1xuaW1wb3J0IHtnZXREYWlseU5vdGV9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XG5pbXBvcnQge1BsYXRmb3JtfSBmcm9tICdvYnNpZGlhbic7XG5cbmV4cG9ydCBjb25zdCBzaG93TWVtb0luRGFpbHlOb3RlcyA9IGFzeW5jIChtZW1vSWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiA9PiB7XG4gIGNvbnN0IHthcHAsIGRhaWx5Tm90ZXN9ID0gZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKTtcblxuICBjb25zdCBsaW5lTnVtID0gcGFyc2VJbnQobWVtb0lkLnNsaWNlKDE0KSk7XG4gIGNvbnN0IG1lbW9EYXRlU3RyaW5nID0gbWVtb0lkLnNsaWNlKDAsIDE0KTtcbiAgY29uc3QgZGF0ZSA9IG1vbWVudChtZW1vRGF0ZVN0cmluZywgJ1lZWVlNTURESEhtbXNzJyk7XG4gIGNvbnN0IGZpbGUgPSBnZXREYWlseU5vdGUoZGF0ZSwgZGFpbHlOb3Rlcyk7XG4gIGlmICghUGxhdGZvcm0uaXNNb2JpbGUpIHtcbiAgICBjb25zdCBsZWFmID0gYXBwLndvcmtzcGFjZS5zcGxpdEFjdGl2ZUxlYWYoKTtcbiAgICBsZWFmLm9wZW5GaWxlKGZpbGUsIHtlU3RhdGU6IHtsaW5lOiBsaW5lTnVtfX0pO1xuICB9IGVsc2Uge1xuICAgIGxldCBsZWFmID0gYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xuICAgIGlmIChsZWFmID09PSBudWxsKSB7XG4gICAgICBsZWFmID0gYXBwLndvcmtzcGFjZS5nZXRMZWFmKHRydWUpO1xuICAgIH1cbiAgICBsZWFmLm9wZW5GaWxlKGZpbGUsIHtlU3RhdGU6IHtsaW5lOiBsaW5lTnVtfX0pO1xuICB9XG4gIHJldHVybjtcbn07XG4iLCJpbXBvcnQge21lbW8sIHVzZUNhbGxiYWNrfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7XHJcbiAgRklSU1RfVEFHX1JFRyxcclxuICBJTUFHRV9VUkxfUkVHLFxyXG4gIExJTktfUkVHLFxyXG4gIE1BUktET1dOX1VSTF9SRUcsXHJcbiAgTUFSS0RPV05fV0VCX1VSTF9SRUcsXHJcbiAgTURfTElOS19SRUcsXHJcbiAgTUVNT19MSU5LX1JFRyxcclxuICBUQUdfUkVHLFxyXG4gIFdJS0lfSU1BR0VfVVJMX1JFRyxcclxufSBmcm9tICcuLi9oZWxwZXJzL2NvbnN0cyc7XHJcbmltcG9ydCB7ZW5jb2RlSHRtbCwgcGFyc2VNYXJrZWRUb0h0bWwsIHBhcnNlUmF3VGV4dFRvSHRtbH0gZnJvbSAnLi4vaGVscGVycy9tYXJrZWQnO1xyXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XHJcbmltcG9ydCB1c2VUb2dnbGUgZnJvbSAnLi4vaG9va3MvdXNlVG9nZ2xlJztcclxuaW1wb3J0IHtnbG9iYWxTdGF0ZVNlcnZpY2UsIG1lbW9TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCBPbmx5IGZyb20gJy4vY29tbW9uL09ubHlXaGVuJztcclxuaW1wb3J0IEltYWdlIGZyb20gJy4vSW1hZ2UnO1xyXG5pbXBvcnQgc2hvd01lbW9DYXJkRGlhbG9nIGZyb20gJy4vTWVtb0NhcmREaWFsb2cnO1xyXG5pbXBvcnQgc2hvd1NoYXJlTWVtb0ltYWdlRGlhbG9nIGZyb20gJy4vU2hhcmVNZW1vSW1hZ2VEaWFsb2cnO1xyXG5pbXBvcnQgJy4uL2xlc3MvbWVtby5sZXNzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtOb3RpY2UsIFRGaWxlLCBWYXVsdH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi4vc3RvcmVzL2FwcFN0b3JlJztcclxuaW1wb3J0IHtzaG93TWVtb0luRGFpbHlOb3Rlc30gZnJvbSAnLi4vb2JDb21wb25lbnRzL29iU2hvd01lbW8nO1xyXG5pbXBvcnQgbW9yZSBmcm9tICcuLi9pY29ucy9tb3JlLnN2Zyc7XHJcbmltcG9ydCB0YXNrIGZyb20gJy4uL2ljb25zL3Rhc2suc3ZnJztcclxuaW1wb3J0IHRhc2tCbGFuayBmcm9tICcuLi9pY29ucy90YXNrLWJsYW5rLnN2Zyc7XHJcbmltcG9ydCB7VXNlQnV0dG9uVG9TaG93RWRpdG9yLCBEZWZhdWx0RWRpdG9yTG9jYXRpb24sIFNob3dUYXNrTGFiZWx9IGZyb20gJy4uL21lbW9zJztcclxuaW1wb3J0IHt0fSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuXHJcbmludGVyZmFjZSBQcm9wcyB7XHJcbiAgbWVtbzogTW9kZWwuTWVtbztcclxufVxyXG5cclxuaW50ZXJmYWNlIExpbmtNYXRjaCB7XHJcbiAgbGlua1RleHQ6IHN0cmluZztcclxuICBhbHRUZXh0OiBzdHJpbmc7XHJcbiAgcGF0aDogc3RyaW5nO1xyXG4gIGZpbGVwYXRoPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0UGF0aE9mSW1hZ2UgPSAodmF1bHQ6IFZhdWx0LCBpbWFnZTogVEZpbGUpID0+IHtcclxuICByZXR1cm4gdmF1bHQuZ2V0UmVzb3VyY2VQYXRoKGltYWdlKTtcclxufTtcclxuXHJcbmNvbnN0IGRldGVjdFdpa2lJbnRlcm5hbExpbmsgPSAobGluZVRleHQ6IHN0cmluZyk6IExpbmtNYXRjaCB8IG51bGwgPT4ge1xyXG4gIGNvbnN0IHttZXRhZGF0YUNhY2hlLCB2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XHJcbiAgY29uc3QgaW50ZXJuYWxGaWxlTmFtZSA9IFdJS0lfSU1BR0VfVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzFdO1xyXG4gIGNvbnN0IGludGVybmFsQWx0TmFtZSA9IFdJS0lfSU1BR0VfVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xyXG4gIGNvbnN0IGZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGRlY29kZVVSSUNvbXBvbmVudChpbnRlcm5hbEZpbGVOYW1lKSwgJycpO1xyXG4gIC8vIGNvbnNvbGUubG9nKGZpbGUucGF0aCk7XHJcbiAgaWYgKGZpbGUgPT09IG51bGwpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXHJcbiAgICAgIHBhdGg6ICcnLFxyXG4gICAgICBmaWxlcGF0aDogJycsXHJcbiAgICB9O1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBpbWFnZVBhdGggPSBnZXRQYXRoT2ZJbWFnZSh2YXVsdCwgZmlsZSk7XHJcbiAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGUucGF0aDtcclxuICAgIGlmIChpbnRlcm5hbEFsdE5hbWUpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXHJcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxyXG4gICAgICAgIGZpbGVwYXRoOiBmaWxlUGF0aCxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgICAgYWx0VGV4dDogJycsXHJcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxyXG4gICAgICAgIGZpbGVwYXRoOiBmaWxlUGF0aCxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBkZXRlY3RNREludGVybmFsTGluayA9IChsaW5lVGV4dDogc3RyaW5nKTogTGlua01hdGNoIHwgbnVsbCA9PiB7XHJcbiAgY29uc3Qge21ldGFkYXRhQ2FjaGUsIHZhdWx0fSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlLmFwcDtcclxuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xyXG4gIGNvbnN0IGludGVybmFsQWx0TmFtZSA9IE1BUktET1dOX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/LlsyXTtcclxuICBjb25zdCBmaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcclxuICBpZiAoZmlsZSA9PT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcclxuICAgICAgcGF0aDogJycsXHJcbiAgICAgIGZpbGVwYXRoOiAnJyxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IGltYWdlUGF0aCA9IGdldFBhdGhPZkltYWdlKHZhdWx0LCBmaWxlKTtcclxuICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZS5wYXRoO1xyXG4gICAgaWYgKGludGVybmFsQWx0TmFtZSkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgICBhbHRUZXh0OiAnJyxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IE1lbW86IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wczogUHJvcHMpID0+IHtcclxuICBjb25zdCB7bWVtbzogcHJvcHNNZW1vfSA9IHByb3BzO1xyXG4gIGNvbnN0IG1lbW86IEZvcm1hdHRlZE1lbW8gPSB7XHJcbiAgICAuLi5wcm9wc01lbW8sXHJcbiAgICBjcmVhdGVkQXRTdHI6IHV0aWxzLmdldERhdGVUaW1lU3RyaW5nKHByb3BzTWVtby5jcmVhdGVkQXQpLFxyXG4gIH07XHJcbiAgY29uc3QgW3Nob3dDb25maXJtRGVsZXRlQnRuLCB0b2dnbGVDb25maXJtRGVsZXRlQnRuXSA9IHVzZVRvZ2dsZShmYWxzZSk7XHJcblxyXG4gIC8vIGNvbnN0IGltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpID8/IFtdKTtcclxuXHJcbiAgbGV0IGV4dGVybmFsSW1hZ2VVcmxzID0gW10gYXMgc3RyaW5nW107XHJcbiAgbGV0IGludGVybmFsSW1hZ2VVcmxzID0gW107XHJcbiAgbGV0IGFsbE1hcmtkb3duTGluazogc3RyaW5nIHwgYW55W10gPSBbXTtcclxuICBsZXQgYWxsSW50ZXJuYWxMaW5rID0gW10gYXMgYW55W107XHJcbiAgaWYgKElNQUdFX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XHJcbiAgICBsZXQgYWxsRXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcclxuICAgIGxldCBhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcclxuICAgIGlmIChNQVJLRE9XTl9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xyXG4gICAgICBhbGxNYXJrZG93bkxpbmsgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChNQVJLRE9XTl9VUkxfUkVHKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoV0lLSV9JTUFHRV9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xyXG4gICAgICBhbGxJbnRlcm5hbExpbmsgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChXSUtJX0lNQUdFX1VSTF9SRUcpKTtcclxuICAgIH1cclxuICAgIC8vIGNvbnN0IGFsbEludGVybmFsTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKFdJS0lfSU1BR0VfVVJMX1JFRykpO1xyXG4gICAgaWYgKE1BUktET1dOX1dFQl9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xyXG4gICAgICBhbGxFeHRlcm5hbEltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1dFQl9VUkxfUkVHKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoYWxsSW50ZXJuYWxMaW5rLmxlbmd0aCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEludGVybmFsTGluay5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBvbmUgPSBhbGxJbnRlcm5hbExpbmtbaV07XHJcbiAgICAgICAgaW50ZXJuYWxJbWFnZVVybHMucHVzaChkZXRlY3RXaWtpSW50ZXJuYWxMaW5rKG9uZSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoYWxsTWFya2Rvd25MaW5rLmxlbmd0aCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbE1hcmtkb3duTGluay5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCB0d28gPSBhbGxNYXJrZG93bkxpbmtbaV07XHJcbiAgICAgICAgaWYgKC8oLiopaHR0cFtzXT8oLiopLy50ZXN0KHR3bykpIHtcclxuICAgICAgICAgIGFub3RoZXJFeHRlcm5hbEltYWdlVXJscy5wdXNoKE1BUktET1dOX1VSTF9SRUcuZXhlYyh0d28pPy5bNV0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpbnRlcm5hbEltYWdlVXJscy5wdXNoKGRldGVjdE1ESW50ZXJuYWxMaW5rKHR3bykpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZXh0ZXJuYWxJbWFnZVVybHMgPSBhbGxFeHRlcm5hbEltYWdlVXJscy5jb25jYXQoYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzKTtcclxuICAgIC8vIGV4dGVybmFsSW1hZ2VVcmxzID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goSU1BR0VfVVJMX1JFRykgPz8gW10pO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgaGFuZGxlU2hvd01lbW9TdG9yeURpYWxvZyA9ICgpID0+IHtcclxuICAgIHNob3dNZW1vQ2FyZERpYWxvZyhtZW1vKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVNYXJrTWVtb0NsaWNrID0gKCkgPT4ge1xyXG4gICAgaWYgKFVzZUJ1dHRvblRvU2hvd0VkaXRvciAmJiBEZWZhdWx0RWRpdG9yTG9jYXRpb24gPT09ICdCb3R0b20nKSB7XHJcbiAgICAgIGxldCBlbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICBcImRpdltkYXRhLXR5cGU9J21lbW9zX3ZpZXcnXSAudmlldy1jb250ZW50IC5tZW1vLXNob3ctZWRpdG9yLWJ1dHRvblwiLFxyXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBpZiAodHlwZW9mIGVsZW0ub25jbGljayA9PSAnZnVuY3Rpb24nICYmIGVsZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGVsZW0ub25jbGljay5hcHBseShlbGVtKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRNYXJrTWVtb0lkKG1lbW8uaWQpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUVkaXRNZW1vQ2xpY2sgPSAoKSA9PiB7XHJcbiAgICBpZiAoVXNlQnV0dG9uVG9TaG93RWRpdG9yICYmIERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gJ0JvdHRvbScpIHtcclxuICAgICAgbGV0IGVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgIFwiZGl2W2RhdGEtdHlwZT0nbWVtb3NfdmlldyddIC52aWV3LWNvbnRlbnQgLm1lbW8tc2hvdy1lZGl0b3ItYnV0dG9uXCIsXHJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGlmICh0eXBlb2YgZWxlbS5vbmNsaWNrID09ICdmdW5jdGlvbicgJiYgZWxlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZWxlbS5vbmNsaWNrLmFwcGx5KGVsZW0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldEVkaXRNZW1vSWQobWVtby5pZCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlU291cmNlTWVtb0NsaWNrID0gKCkgPT4ge1xyXG4gICAgc2hvd01lbW9JbkRhaWx5Tm90ZXMobWVtby5pZCk7XHJcbiAgfTtcclxuXHJcbiAgLy8gY29uc3QgaGFuZGxlQ3JlYXRlTmV3Tm90ZUNsaWNrID0gKCkgPT4ge1xyXG4gIC8vICAgdHVybkludG9Ob3RlKG1lbW8uaWQpO1xyXG4gIC8vIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZURlbGV0ZU1lbW9DbGljayA9IGFzeW5jICgpID0+IHtcclxuICAgIGlmIChzaG93Q29uZmlybURlbGV0ZUJ0bikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IG1lbW9TZXJ2aWNlLmhpZGVNZW1vQnlJZChtZW1vLmlkKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChnbG9iYWxTdGF0ZVNlcnZpY2UuZ2V0U3RhdGUoKS5lZGl0TWVtb0lkID09PSBtZW1vLmlkKSB7XHJcbiAgICAgICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldEVkaXRNZW1vSWQoJycpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0b2dnbGVDb25maXJtRGVsZXRlQnRuKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTW91c2VMZWF2ZU1lbW9XcmFwcGVyID0gKCkgPT4ge1xyXG4gICAgaWYgKHNob3dDb25maXJtRGVsZXRlQnRuKSB7XHJcbiAgICAgIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG4oZmFsc2UpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUdlbk1lbW9JbWFnZUJ0bkNsaWNrID0gKCkgPT4ge1xyXG4gICAgc2hvd1NoYXJlTWVtb0ltYWdlRGlhbG9nKG1lbW8pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZU1lbW9UeXBlU2hvdyA9ICgpID0+IHtcclxuICAgIGlmKCFTaG93VGFza0xhYmVsKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKG1lbW8ubWVtb1R5cGUgPT09ICdUQVNLLVRPRE8nKSB7XHJcbiAgICAgIHJldHVybiB0YXNrQmxhbms7XHJcbiAgICB9ZWxzZSBpZihtZW1vLm1lbW9UeXBlID09PSAnVEFTSy1ET05FJyl7XHJcbiAgICAgIHJldHVybiB0YXNrO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZU1lbW9LZXlEb3duID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XHJcbiAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7XHJcbiAgICAgIGhhbmRsZVNvdXJjZU1lbW9DbGljaygpO1xyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTWVtb0RvdWJsZUNsaWNrID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgaGFuZGxlRWRpdE1lbW9DbGljaygpO1xyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTWVtb0NvbnRlbnRDbGljayA9IGFzeW5jIChlOiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XHJcbiAgICBjb25zdCB0YXJnZXRFbCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGlmICh0YXJnZXRFbC5jbGFzc05hbWUgPT09ICdtZW1vLWxpbmstdGV4dCcpIHtcclxuICAgICAgY29uc3QgbWVtb0lkID0gdGFyZ2V0RWwuZGF0YXNldD8udmFsdWU7XHJcbiAgICAgIGNvbnN0IG1lbW9UZW1wID0gbWVtb1NlcnZpY2UuZ2V0TWVtb0J5SWQobWVtb0lkID8/ICcnKTtcclxuXHJcbiAgICAgIGlmIChtZW1vVGVtcCkge1xyXG4gICAgICAgIHNob3dNZW1vQ2FyZERpYWxvZyhtZW1vVGVtcCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmV3IE5vdGljZSgnTUVNTyBOb3QgRm91bmQnKTtcclxuICAgICAgICB0YXJnZXRFbC5jbGFzc0xpc3QucmVtb3ZlKCdtZW1vLWxpbmstdGV4dCcpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRhcmdldEVsLmNsYXNzTmFtZSA9PT0gJ3RvZG8tYmxvY2snKSB7XHJcbiAgICAgIC8vIGRvIG50aFxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzTmFtZT17YG1lbW8td3JhcHBlciAkeydtZW1vcy0nICsgbWVtby5pZH0gJHttZW1vLm1lbW9UeXBlfWB9XHJcbiAgICAgIG9uTW91c2VMZWF2ZT17aGFuZGxlTW91c2VMZWF2ZU1lbW9XcmFwcGVyfVxyXG4gICAgICBvbk1vdXNlRG93bj17aGFuZGxlTWVtb0tleURvd259XHJcbiAgICAgIG9uRG91YmxlQ2xpY2s9e2hhbmRsZU1lbW9Eb3VibGVDbGlja31cclxuICAgID5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLXRvcC13cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLXRvcC1sZWZ0LXdyYXBwZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRpbWUtdGV4dFwiIG9uQ2xpY2s9e2hhbmRsZVNob3dNZW1vU3RvcnlEaWFsb2d9PlxyXG4gICAgICAgICAgICB7bWVtby5jcmVhdGVkQXRTdHJ9XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YG1lbW8tdHlwZS1pbWcgJHsobWVtby5tZW1vVHlwZSA9PT0gJ1RBU0stVE9ETycgfHwgbWVtby5tZW1vVHlwZSA9PT0gJ1RBU0stRE9ORScpICYmIFNob3dUYXNrTGFiZWwgPyAnJyA6ICdoaWRkZW4nfWB9PlxyXG4gICAgICAgICAgICA8aW1nIHNyYz17aGFuZGxlTWVtb1R5cGVTaG93KCkgPz8gJyd9IGFsdD1cIm1lbW8tdHlwZVwiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ0bnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG4gbW9yZS1hY3Rpb24tYnRuXCI+XHJcbiAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e21vcmV9IC8+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vcmUtYWN0aW9uLWJ0bnMtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vcmUtYWN0aW9uLWJ0bnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17aGFuZGxlU2hvd01lbW9TdG9yeURpYWxvZ30+XHJcbiAgICAgICAgICAgICAgICB7dCgnUkVBRCcpfVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG5cIiBvbkNsaWNrPXtoYW5kbGVNYXJrTWVtb0NsaWNrfT5cclxuICAgICAgICAgICAgICAgIHt0KCdNQVJLJyl9XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0blwiIG9uQ2xpY2s9e2hhbmRsZUdlbk1lbW9JbWFnZUJ0bkNsaWNrfT5cclxuICAgICAgICAgICAgICAgIHt0KCdTSEFSRScpfVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG5cIiBvbkNsaWNrPXtoYW5kbGVFZGl0TWVtb0NsaWNrfT5cclxuICAgICAgICAgICAgICAgIHt0KCdFRElUJyl9XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0blwiIG9uQ2xpY2s9e2hhbmRsZVNvdXJjZU1lbW9DbGlja30+XHJcbiAgICAgICAgICAgICAgICB7dCgnU09VUkNFJyl9XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BidG4gZGVsZXRlLWJ0biAke3Nob3dDb25maXJtRGVsZXRlQnRuID8gJ2ZpbmFsLWNvbmZpcm0nIDogJyd9YH1cclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZURlbGV0ZU1lbW9DbGlja31cclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7c2hvd0NvbmZpcm1EZWxldGVCdG4gPyB0KCdDT05GSVJN77yBJykgOiB0KCdERUxFVEUnKX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3NOYW1lPVwibWVtby1jb250ZW50LXRleHRcIlxyXG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZU1lbW9Db250ZW50Q2xpY2t9XHJcbiAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGZvcm1hdE1lbW9Db250ZW50KG1lbW8uY29udGVudCwgbWVtby5pZCl9fVxyXG4gICAgICA+PC9kaXY+XHJcbiAgICAgIDxPbmx5IHdoZW49e2V4dGVybmFsSW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLXdyYXBwZXJcIj5cclxuICAgICAgICAgIHtleHRlcm5hbEltYWdlVXJscy5tYXAoKGltZ1VybCwgaWR4KSA9PiAoXHJcbiAgICAgICAgICAgIDxJbWFnZSBhbHQ9XCJcIiBrZXk9e2lkeH0gY2xhc3NOYW1lPVwibWVtby1pbWdcIiBpbWdVcmw9e2ltZ1VybH0gcmVmZXJyZXJQb2xpY3k9XCJuby1yZWZlcnJlclwiIC8+XHJcbiAgICAgICAgICApKX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9Pbmx5PlxyXG4gICAgICA8T25seSB3aGVuPXtpbnRlcm5hbEltYWdlVXJscy5sZW5ndGggPiAwfT5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyIGludGVybmFsLWVtYmVkIGltYWdlLWVtYmVkIGlzLWxvYWRlZFwiPlxyXG4gICAgICAgICAge2ludGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcclxuICAgICAgICAgICAgPEltYWdlXHJcbiAgICAgICAgICAgICAga2V5PXtpZHh9XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWVtby1pbWdcIlxyXG4gICAgICAgICAgICAgIGltZ1VybD17aW1nVXJsLnBhdGh9XHJcbiAgICAgICAgICAgICAgYWx0PXtpbWdVcmwuYWx0VGV4dH1cclxuICAgICAgICAgICAgICBmaWxlcGF0aD17aW1nVXJsLmZpbGVwYXRofVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgKSl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvT25seT5cclxuICAgICAgey8qIDxPbmx5IHdoZW49e2ltYWdlVXJscy5sZW5ndGggPiAwfT5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyXCI+XHJcbiAgICAgICAgICB7aW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcclxuICAgICAgICAgICAgPEltYWdlIGNsYXNzTmFtZT1cIm1lbW8taW1nXCIga2V5PXtpZHh9IGltZ1VybD17aW1nVXJsfSAvPlxyXG4gICAgICAgICAgKSl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvT25seT4gKi99XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE1lbW9Db250ZW50KGNvbnRlbnQ6IHN0cmluZywgbWVtb2lkPzogc3RyaW5nKSB7XHJcbiAgY29udGVudCA9IGVuY29kZUh0bWwoY29udGVudCk7XHJcbiAgY29udGVudCA9IHBhcnNlUmF3VGV4dFRvSHRtbChjb250ZW50KVxyXG4gICAgLnNwbGl0KCc8YnI+JylcclxuICAgIC5tYXAoKHQpID0+IHtcclxuICAgICAgcmV0dXJuIGA8cD4ke3QgIT09ICcnID8gdCA6ICc8YnI+J308L3A+YDtcclxuICAgIH0pXHJcbiAgICAuam9pbignJyk7XHJcblxyXG4gIGNvbnN0IHtzaG91bGRVc2VNYXJrZG93blBhcnNlciwgc2hvdWxkSGlkZUltYWdlVXJsfSA9IGdsb2JhbFN0YXRlU2VydmljZS5nZXRTdGF0ZSgpO1xyXG5cclxuICBpZiAoc2hvdWxkVXNlTWFya2Rvd25QYXJzZXIpIHtcclxuICAgIGNvbnRlbnQgPSBwYXJzZU1hcmtlZFRvSHRtbChjb250ZW50LCBtZW1vaWQpO1xyXG4gIH1cclxuXHJcbiAgaWYgKHNob3VsZEhpZGVJbWFnZVVybCkge1xyXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShXSUtJX0lNQUdFX1VSTF9SRUcsICcnKS5yZXBsYWNlKE1BUktET1dOX1VSTF9SRUcsICcnKS5yZXBsYWNlKElNQUdFX1VSTF9SRUcsICcnKTtcclxuICB9XHJcblxyXG4gIC8vIGNvbnNvbGUubG9nKGNvbnRlbnQpO1xyXG5cclxuICAvLyDkuK3oi7HmlofkuYvpl7TliqDnqbrmoLxcclxuICAvLyBpZiAoc2hvdWxkU3BsaXRNZW1vV29yZCkge1xyXG4gIC8vICAgY29udGVudCA9IGNvbnRlbnRcclxuICAvLyAgICAgLnJlcGxhY2UoLyhbXFx1NGUwMC1cXHU5ZmE1XSkoW0EtWmEtejAtOT8uLDtbXFxdXSspL2csIFwiJDEgJDJcIilcclxuICAvLyAgICAgLnJlcGxhY2UoLyhbQS1aYS16MC05Py4sO1tcXF1dKykoW1xcdTRlMDAtXFx1OWZhNV0pL2csIFwiJDEgJDJcIik7XHJcbiAgLy8gfVxyXG5cclxuICBjb250ZW50ID0gY29udGVudFxyXG4gICAgLnJlcGxhY2UoVEFHX1JFRywgXCI8c3BhbiBjbGFzcz0ndGFnLXNwYW4nPiMkMTwvc3Bhbj5cIilcclxuICAgIC5yZXBsYWNlKEZJUlNUX1RBR19SRUcsIFwiPHA+PHNwYW4gY2xhc3M9J3RhZy1zcGFuJz4jJDI8L3NwYW4+XCIpXHJcbiAgICAucmVwbGFjZShMSU5LX1JFRywgXCIkMTxhIGNsYXNzPSdsaW5rJyB0YXJnZXQ9J19ibGFuaycgcmVsPSdub3JlZmVycmVyJyBocmVmPSckMic+JDI8L2E+XCIpXHJcbiAgICAucmVwbGFjZShNRF9MSU5LX1JFRywgXCI8YSBjbGFzcz0nbGluaycgdGFyZ2V0PSdfYmxhbmsnIHJlbD0nbm9yZWZlcnJlcicgaHJlZj0nJDInPiQxPC9hPlwiKVxyXG4gICAgLnJlcGxhY2UoTUVNT19MSU5LX1JFRywgXCI8c3BhbiBjbGFzcz0nbWVtby1saW5rLXRleHQnIGRhdGEtdmFsdWU9JyQyJz4kMTwvc3Bhbj5cIik7XHJcblxyXG4gIC8vIGNvbnN0IGNvbnRlbnRNYXJrID0gY29udGVudC5zcGxpdCgnJyk7XHJcblxyXG4gIC8vIGlmKC8oLiopPGEoLiopL2cudGVzdChjb250ZW50KSl7XHJcblxyXG4gIC8vIH1cclxuICAvLyAgIGZvcihsZXQgaT0wOyBpPGNvbnRlbnQubGVuZ3RoO2krKyl7XHJcbiAgLy8gICAgIGxldCBtYXJrID0gZmFsc2U7XHJcbiAgLy8gICAgIGxldCBhTWFyayA9IGZhbHNlO1xyXG4gIC8vICAgICBpZihjb250ZW50TWFya1tpXSlcclxuICAvLyAgIH1cclxuXHJcbiAgY29uc3QgdGVtcERpdkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gIHRlbXBEaXZDb250YWluZXIuaW5uZXJIVE1MID0gY29udGVudDtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXBEaXZDb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IGMgPSB0ZW1wRGl2Q29udGFpbmVyLmNoaWxkcmVuW2ldO1xyXG5cclxuICAgIGlmIChjLnRhZ05hbWUgPT09ICdQJyAmJiBjLnRleHRDb250ZW50ID09PSAnJyAmJiBjLmZpcnN0RWxlbWVudENoaWxkPy50YWdOYW1lICE9PSAnQlInKSB7XHJcbiAgICAgIGMucmVtb3ZlKCk7XHJcbiAgICAgIGktLTtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdGVtcERpdkNvbnRhaW5lci5pbm5lckhUTUw7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG1lbW8oTWVtbyk7XHJcbiIsImltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XHJcbmltcG9ydCB7bG9jYXRpb25TZXJ2aWNlLCBtZW1vU2VydmljZSwgcXVlcnlTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7RklSU1RfVEFHX1JFRywgSU1BR0VfVVJMX1JFRywgTElOS19SRUcsIE1FTU9fTElOS19SRUcsIE5PUF9GSVJTVF9UQUdfUkVHLCBUQUdfUkVHfSBmcm9tICcuLi9oZWxwZXJzL2NvbnN0cyc7XHJcbmltcG9ydCB1dGlscyBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcclxuaW1wb3J0IHtjaGVja1Nob3VsZFNob3dNZW1vV2l0aEZpbHRlcnN9IGZyb20gJy4uL2hlbHBlcnMvZmlsdGVyJztcclxuaW1wb3J0IE1lbW8gZnJvbSAnLi9NZW1vJztcclxuLy8gaW1wb3J0IHRvYXN0SGVscGVyIGZyb20gXCIuL1RvYXN0XCI7XHJcbmltcG9ydCAnLi4vbGVzcy9tZW1vbGlzdC5sZXNzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IGRhaWx5Tm90ZXNTZXJ2aWNlIGZyb20gJy4uL3NlcnZpY2VzL2RhaWx5Tm90ZXNTZXJ2aWNlJztcclxuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XHJcbmltcG9ydCB7Tm90aWNlLCBQbGF0Zm9ybX0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQge0hpZGVEb25lVGFza3N9IGZyb20gJy4uL21lbW9zJztcclxuLy8gaW1wb3J0IHttb21lbnR9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHt0fSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuLy8gaW1wb3J0IHsgRGVmYXVsdEVkaXRvckxvY2F0aW9uIH0gZnJvbSAnLi4vbWVtb3MnO1xyXG5cclxuaW50ZXJmYWNlIFByb3BzIHt9XHJcblxyXG5leHBvcnQgbGV0IGNvcHlTaG93bk1lbW9zOiBNb2RlbC5NZW1vW107XHJcblxyXG5jb25zdCBNZW1vTGlzdDogUmVhY3QuRkM8UHJvcHM+ID0gKCkgPT4ge1xyXG4gIGNvbnN0IHtcclxuICAgIGxvY2F0aW9uU3RhdGU6IHtxdWVyeX0sXHJcbiAgICBtZW1vU3RhdGU6IHttZW1vc30sXHJcbiAgfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XHJcbiAgLy8gbGV0IHJldmVyc2VNZW1vczogTW9kZWwuTWVtb1tdO1xyXG4gIC8vIGlmKERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9PT0gXCJCb3R0b21cIiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDg3NSAmJiBQbGF0Zm9ybS5pc01vYmlsZSl7XHJcbiAgLy8gICByZXZlcnNlTWVtb3MgPSBtZW1vcy5yZXZlcnNlKCk7XHJcbiAgLy8gfVxyXG4gIGNvbnN0IFtpc0ZldGNoaW5nLCBzZXRGZXRjaFN0YXR1c10gPSB1c2VTdGF0ZSh0cnVlKTtcclxuICBjb25zdCB3cmFwcGVyRWxlbWVudCA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XHJcbiAgY29uc3Qge3RhZzogdGFnUXVlcnksIGR1cmF0aW9uLCB0eXBlOiBtZW1vQ29udGVudFR5cGUsIHRleHQ6IHRleHRRdWVyeSwgZmlsdGVyOiBxdWVyeUlkfSA9IHF1ZXJ5O1xyXG4gIC8vIGNvbnN0IHNob3dNZW1vRmlsdGVyID0gQm9vbGVhbih0YWdRdWVyeSB8fCAoZHVyYXRpb24gJiYgZHVyYXRpb24uZnJvbSA8IGR1cmF0aW9uLnRvKSB8fCBtZW1vVHlwZSB8fCB0ZXh0UXVlcnkgfHwgcXVlcnlJZCk7XHJcbiAgY29uc3QgcXVlcnlGaWx0ZXIgPSBxdWVyeVNlcnZpY2UuZ2V0UXVlcnlCeUlkKHF1ZXJ5SWQpO1xyXG4gIGNvbnN0IHNob3dNZW1vRmlsdGVyID0gQm9vbGVhbihcclxuICAgIHRhZ1F1ZXJ5IHx8IChkdXJhdGlvbiAmJiBkdXJhdGlvbi5mcm9tIDwgZHVyYXRpb24udG8pIHx8IG1lbW9Db250ZW50VHlwZSB8fCB0ZXh0UXVlcnkgfHwgcXVlcnlGaWx0ZXIsXHJcbiAgKTtcclxuXHJcbiAgY29uc3Qgc2hvd25NZW1vcyA9XHJcbiAgICBzaG93TWVtb0ZpbHRlciB8fCBxdWVyeUZpbHRlciB8fCBIaWRlRG9uZVRhc2tzXHJcbiAgICAgID8gbWVtb3MuZmlsdGVyKChtZW1vKSA9PiB7XHJcbiAgICAgICAgICBsZXQgc2hvdWxkU2hvdyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgaWYgKG1lbW8ubWVtb1R5cGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAoSGlkZURvbmVUYXNrcyAmJiBtZW1vLm1lbW9UeXBlID09PSAnVEFTSy1ET05FJykge1xyXG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChxdWVyeUZpbHRlcikge1xyXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gSlNPTi5wYXJzZShxdWVyeUZpbHRlci5xdWVyeXN0cmluZykgYXMgRmlsdGVyW107XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcnMpKSB7XHJcbiAgICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGNoZWNrU2hvdWxkU2hvd01lbW9XaXRoRmlsdGVycyhtZW1vLCBmaWx0ZXJzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0YWdRdWVyeSkge1xyXG4gICAgICAgICAgICBjb25zdCB0YWdzU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChUQUdfUkVHKSA/PyBbXSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0YWcgPSB0LnJlcGxhY2UoVEFHX1JFRywgJyQxJykudHJpbSgpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGFnLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgICAgbGV0IHRlbXAgPSAnJztcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIHRlbXAgKz0gaTtcclxuICAgICAgICAgICAgICAgIHRhZ3NTZXQuYWRkKHRlbXApO1xyXG4gICAgICAgICAgICAgICAgdGVtcCArPSAnLyc7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChOT1BfRklSU1RfVEFHX1JFRykgPz8gW10pKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdGFnID0gdC5yZXBsYWNlKE5PUF9GSVJTVF9UQUdfUkVHLCAnJDEnKS50cmltKCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0YWcuc3BsaXQoJy8nKTtcclxuICAgICAgICAgICAgICBsZXQgdGVtcCA9ICcnO1xyXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBpdGVtcykge1xyXG4gICAgICAgICAgICAgICAgdGVtcCArPSBpO1xyXG4gICAgICAgICAgICAgICAgdGFnc1NldC5hZGQodGVtcCk7XHJcbiAgICAgICAgICAgICAgICB0ZW1wICs9ICcvJztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKEZJUlNUX1RBR19SRUcpID8/IFtdKSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRhZyA9IHQucmVwbGFjZShGSVJTVF9UQUdfUkVHLCAnJDInKS50cmltKCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0YWcuc3BsaXQoJy8nKTtcclxuICAgICAgICAgICAgICBsZXQgdGVtcCA9ICcnO1xyXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBpdGVtcykge1xyXG4gICAgICAgICAgICAgICAgdGVtcCArPSBpO1xyXG4gICAgICAgICAgICAgICAgdGFnc1NldC5hZGQodGVtcCk7XHJcbiAgICAgICAgICAgICAgICB0ZW1wICs9ICcvJztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0YWdzU2V0Lmhhcyh0YWdRdWVyeSkpIHtcclxuICAgICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgZHVyYXRpb24gJiZcclxuICAgICAgICAgICAgZHVyYXRpb24uZnJvbSA8IGR1cmF0aW9uLnRvICYmXHJcbiAgICAgICAgICAgICh1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUobWVtby5jcmVhdGVkQXQpIDwgZHVyYXRpb24uZnJvbSB8fFxyXG4gICAgICAgICAgICAgIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShtZW1vLmNyZWF0ZWRBdCkgPiBkdXJhdGlvbi50bylcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobWVtb0NvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICBtZW1vQ29udGVudFR5cGUgPT09ICdOT1RfVEFHR0VEJyAmJlxyXG4gICAgICAgICAgICAgIChtZW1vLmNvbnRlbnQubWF0Y2goVEFHX1JFRykgIT09IG51bGwgfHwgbWVtby5jb250ZW50Lm1hdGNoKE5PUF9GSVJTVF9UQUdfUkVHKSAhPT0gbnVsbClcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lbW9Db250ZW50VHlwZSA9PT0gJ0xJTktFRCcgJiYgbWVtby5jb250ZW50Lm1hdGNoKExJTktfUkVHKSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChtZW1vQ29udGVudFR5cGUgPT09ICdJTUFHRUQnICYmIG1lbW8uY29udGVudC5tYXRjaChJTUFHRV9VUkxfUkVHKSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChtZW1vQ29udGVudFR5cGUgPT09ICdDT05ORUNURUQnICYmIG1lbW8uY29udGVudC5tYXRjaChNRU1PX0xJTktfUkVHKSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRleHRRdWVyeSAmJiAhbWVtby5jb250ZW50LmluY2x1ZGVzKHRleHRRdWVyeSkpIHtcclxuICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBzaG91bGRTaG93O1xyXG4gICAgICAgIH0pXHJcbiAgICAgIDogbWVtb3M7XHJcblxyXG4gIGNvcHlTaG93bk1lbW9zID0gc2hvd25NZW1vcztcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIG1lbW9TZXJ2aWNlXHJcbiAgICAgIC5mZXRjaEFsbE1lbW9zKClcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHNldEZldGNoU3RhdHVzKGZhbHNlKTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKCgpID0+IHtcclxuICAgICAgICBuZXcgTm90aWNlKCfwn5itIEZldGNoIEVycm9yJyk7XHJcbiAgICAgIH0pO1xyXG4gICAgZGFpbHlOb3Rlc1NlcnZpY2VcclxuICAgICAgLmdldE15QWxsRGFpbHlOb3RlcygpXHJcbiAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICBzZXRGZXRjaFN0YXR1cyhmYWxzZSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgbmV3IE5vdGljZSgn8J+YrSBGZXRjaCBEYWlseU5vdGVzIEVycm9yJyk7XHJcbiAgICAgIH0pO1xyXG4gICAgZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKTtcclxuICB9LCBbXSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICB3cmFwcGVyRWxlbWVudC5jdXJyZW50Py5zY3JvbGxUbyh7dG9wOiAwfSk7XHJcbiAgfSwgW3F1ZXJ5XSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZU1lbW9MaXN0Q2xpY2sgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcclxuICAgIGNvbnN0IHt3b3Jrc3BhY2V9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG5cclxuICAgIGNvbnN0IHRhcmdldEVsID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKHRhcmdldEVsLnRhZ05hbWUgPT09ICdTUEFOJyAmJiB0YXJnZXRFbC5jbGFzc05hbWUgPT09ICd0YWctc3BhbicpIHtcclxuICAgICAgY29uc3QgdGFnTmFtZSA9IHRhcmdldEVsLmlubmVyVGV4dC5zbGljZSgxKTtcclxuICAgICAgY29uc3QgY3VyclRhZ1F1ZXJ5ID0gbG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkudGFnO1xyXG4gICAgICBpZiAoY3VyclRhZ1F1ZXJ5ID09PSB0YWdOYW1lKSB7XHJcbiAgICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldFRhZ1F1ZXJ5KCcnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0VGFnUXVlcnkodGFnTmFtZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGFyZ2V0RWwudGFnTmFtZSA9PT0gJ0EnICYmIHRhcmdldEVsLmNsYXNzTmFtZSA9PT0gJ2ludGVybmFsLWxpbmsnKSB7XHJcbiAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSB0YXJnZXRFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmlsZXBhdGgnKTtcclxuICAgICAgaWYgKFBsYXRmb3JtLmlzTW9iaWxlKSB7XHJcbiAgICAgICAgd29ya3NwYWNlLm9wZW5MaW5rVGV4dChzb3VyY2VQYXRoLCBzb3VyY2VQYXRoLCBmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgd29ya3NwYWNlLm9wZW5MaW5rVGV4dChzb3VyY2VQYXRoLCBzb3VyY2VQYXRoLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXZcclxuICAgICAgY2xhc3NOYW1lPXtgbWVtb2xpc3Qtd3JhcHBlciAke2lzRmV0Y2hpbmcgPyAnJyA6ICdjb21wbGV0ZWQnfWB9XHJcbiAgICAgIG9uQ2xpY2s9e2hhbmRsZU1lbW9MaXN0Q2xpY2t9XHJcbiAgICAgIHJlZj17d3JhcHBlckVsZW1lbnR9XHJcbiAgICA+XHJcbiAgICAgIHtzaG93bk1lbW9zLm1hcCgobWVtbykgPT4gKFxyXG4gICAgICAgIDxNZW1vIGtleT17YCR7bWVtby5pZH0tJHttZW1vLnVwZGF0ZWRBdH1gfSBtZW1vPXttZW1vfSAvPlxyXG4gICAgICApKX1cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzdGF0dXMtdGV4dC1jb250YWluZXJcIj5cclxuICAgICAgICA8cCBjbGFzc05hbWU9XCJzdGF0dXMtdGV4dFwiPlxyXG4gICAgICAgICAge2lzRmV0Y2hpbmdcclxuICAgICAgICAgICAgPyB0KCdGZXRjaGluZyBkYXRhLi4uJylcclxuICAgICAgICAgICAgOiBzaG93bk1lbW9zLmxlbmd0aCA9PT0gMFxyXG4gICAgICAgICAgICA/IHQoJ05vb29vcCEnKVxyXG4gICAgICAgICAgICA6IHNob3dNZW1vRmlsdGVyXHJcbiAgICAgICAgICAgID8gJydcclxuICAgICAgICAgICAgOiB0KCdBbGwgRGF0YSBpcyBMb2FkZWQg8J+OiScpfVxyXG4gICAgICAgIDwvcD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVtb0xpc3Q7XHJcbiIsImltcG9ydCB7bW9tZW50fSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7Z2V0RGFpbHlOb3RlU2V0dGluZ3N9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XHJcbmltcG9ydCB7QWRkQmxhbmtMaW5lV2hlbkRhdGUsIFNob3dEYXRlLCBTaG93VGltZSwgRGVmYXVsdE1lbW9Db21wb3NpdGlvbn0gZnJvbSAnLi4vbWVtb3MnO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldE1lbW9zQnlEYXRlID0gKG1lbW9zOiBNb2RlbC5NZW1vW10pID0+IHtcclxuICBjb25zdCBkYXRhQXJyID0gW10gYXMgYW55W107XHJcbiAgbWVtb3MubWFwKChtYXBJdGVtKSA9PiB7XHJcbiAgICBpZiAoZGF0YUFyci5sZW5ndGggPT0gMCkge1xyXG4gICAgICBkYXRhQXJyLnB1c2goe2RhdGU6IG1vbWVudChtYXBJdGVtLmNyZWF0ZWRBdCwgJ1lZWVkvTU0vREQgSEg6bW06c3MnKS5mb3JtYXQoJ1lZWVktTU0tREQnKSwgaGF2ZTogW21hcEl0ZW1dfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCByZXMgPSBkYXRhQXJyLnNvbWUoKGl0ZW0pID0+IHtcclxuICAgICAgICAvL+WIpOaWreebuOWQjOaXpeacn++8jOacieWwsea3u+WKoOWIsOW9k+WJjemhuVxyXG4gICAgICAgIGlmIChpdGVtLmRhdGUgPT0gbW9tZW50KG1hcEl0ZW0uY3JlYXRlZEF0LCAnWVlZWS9NTS9ERCBISDptbTpzcycpLmZvcm1hdCgnWVlZWS1NTS1ERCcpKSB7XHJcbiAgICAgICAgICBpdGVtLmhhdmUucHVzaChtYXBJdGVtKTtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmICghcmVzKSB7XHJcbiAgICAgICAgLy/lpoLmnpzmsqHmib7nm7jlkIzml6XmnJ/mt7vliqDkuIDkuKrmlrDlr7nosaFcclxuICAgICAgICBkYXRhQXJyLnB1c2goe2RhdGU6IG1vbWVudChtYXBJdGVtLmNyZWF0ZWRBdCwgJ1lZWVkvTU0vREQgSEg6bW06c3MnKS5mb3JtYXQoJ1lZWVktTU0tREQnKSwgaGF2ZTogW21hcEl0ZW1dfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIGRhdGFBcnI7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgdHJhbnNmZXJNZW1vc0ludG9UZXh0ID0gKGRhaWx5TWVtb3M6IEFycmF5PGFueT4pOiBzdHJpbmcgPT4ge1xyXG4gIGxldCBvdXRwdXRUZXh0ID0gJycgYXMgc3RyaW5nO1xyXG4gIGxldCBkYXRhQXJyID0gW10gYXMgYW55W107XHJcbiAgbGV0IGluZGVudCA9ICcnIGFzIHN0cmluZztcclxuICBjb25zdCB7Zm9ybWF0fSA9IGdldERhaWx5Tm90ZVNldHRpbmdzKCk7XHJcbiAgZGFpbHlNZW1vcy5tYXAoKG1hcEl0ZW0pID0+IHtcclxuICAgIGRhdGFBcnIgPSBtYXBJdGVtLmhhdmU7XHJcbiAgICBpZiAoU2hvd0RhdGUpIHtcclxuICAgICAgb3V0cHV0VGV4dCA9IG91dHB1dFRleHQgKyAnLSBbWycgKyBtb21lbnQobWFwSXRlbS5kYXRlLCAnWVlZWS1NTS1ERCcpLmZvcm1hdChmb3JtYXQpICsgJ11dXFxuJztcclxuICAgICAgaW5kZW50ID0gJyAgICAnO1xyXG4gICAgfVxyXG4gICAgaWYgKFNob3dUaW1lKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHRpbWUgPSBtb21lbnQoZGF0YUFycltpXS5jcmVhdGVkQXQsICdZWVlZL01NL0REIEhIOm1tOnNzJykuZm9ybWF0KCdISDptbScpO1xyXG4gICAgICAgIGxldCBmb3JtYXRDb250ZW50O1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24gIT0gJycgJiZcclxuICAgICAgICAgIC97VElNRX0vZy50ZXN0KERlZmF1bHRNZW1vQ29tcG9zaXRpb24pICYmXHJcbiAgICAgICAgICAve0NPTlRFTlR9L2cudGVzdChEZWZhdWx0TWVtb0NvbXBvc2l0aW9uKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgZm9ybWF0Q29udGVudCA9IERlZmF1bHRNZW1vQ29tcG9zaXRpb24ucmVwbGFjZSgve1RJTUV9L2csIHRpbWUpLnJlcGxhY2UoL3tDT05URU5UfS9nLCBkYXRhQXJyW2ldLmNvbnRlbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmb3JtYXRDb250ZW50ID0gdGltZSArICcgJyArIGRhdGFBcnJbaV0uY29udGVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRhdGFBcnJbaV0ubWVtb1R5cGUgPT09ICdKT1VSTkFMJykge1xyXG4gICAgICAgICAgLy8gaWYgKC88YnI+L2cudGVzdChkYXRhQXJyW2ldLmNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAvLyAgIGNvbnN0IGZvcm1hdGVkQ29udGVudCA9IGRhdGFBcnJbaV0uY29udGVudC5yZXBsYWNlKC88YnI+L2csICdcXG4gICAgJyk7XHJcbiAgICAgICAgICAvLyAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gJyArIHRpbWUgKyAnICcgKyBmb3JtYXRlZENvbnRlbnQgKyAnXFxuJztcclxuICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctICcgKyBmb3JtYXRDb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChkYXRhQXJyW2ldLm1lbW9UeXBlID09PSAnVEFTSy1UT0RPJykge1xyXG4gICAgICAgICAgICAvLyBpZiAoLzxicj4vZy50ZXN0KGRhdGFBcnJbaV0uY29udGVudCkpIHtcclxuICAgICAgICAgICAgLy8gICBjb25zdCBmb3JtYXRlZENvbnRlbnQgPSBkYXRhQXJyW2ldLmNvbnRlbnQucmVwbGFjZSgvPGJyPi9nLCAnXFxuICAgICcpO1xyXG4gICAgICAgICAgICAvLyAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gWyBdICcgKyB0aW1lICsgJyAnICsgZm9ybWF0ZWRDb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gWyBdICcgKyBmb3JtYXRDb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YUFycltpXS5tZW1vVHlwZSA9PT0gJ1RBU0stRE9ORScpIHtcclxuICAgICAgICAgICAgLy8gaWYgKC88YnI+L2cudGVzdChkYXRhQXJyW2ldLmNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgIC8vICAgY29uc3QgZm9ybWF0ZWRDb250ZW50ID0gZGF0YUFycltpXS5jb250ZW50LnJlcGxhY2UoLzxicj4vZywgJ1xcbiAgICAnKTtcclxuICAgICAgICAgICAgLy8gICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctIFt4XSAnICsgdGltZSArICcgJyArIGZvcm1hdGVkQ29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctIFt4XSAnICsgZm9ybWF0Q29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0YXNrTWFyayA9IGRhdGFBcnJbaV0ubWVtb1R5cGUubWF0Y2goL1RBU0stKC4qKT8vZylbMV07XHJcbiAgICAgICAgICAgIC8vIGlmICgvPGJyPi9nLnRlc3QoZGF0YUFycltpXS5jb250ZW50KSkge1xyXG4gICAgICAgICAgICAvLyAgIGNvbnN0IGZvcm1hdGVkQ29udGVudCA9IGRhdGFBcnJbaV0uY29udGVudC5yZXBsYWNlKC88YnI+L2csICdcXG4gICAgJyk7XHJcbiAgICAgICAgICAgIC8vICAgb3V0cHV0VGV4dCA9IG91dHB1dFRleHQgKyBpbmRlbnQgKyAnLSBbJyArIHRhc2tNYXJrICsgJ10gJyArIHRpbWUgKyAnICcgKyBmb3JtYXRlZENvbnRlbnQgKyAnXFxuJztcclxuICAgICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgICAgb3V0cHV0VGV4dCA9IG91dHB1dFRleHQgKyBpbmRlbnQgKyAnLSBbJyArIHRhc2tNYXJrICsgJ10gJyArIGZvcm1hdENvbnRlbnQgKyAnXFxuJztcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhQXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy8gY29uc3QgdGltZSA9IG1vbWVudChkYXRhQXJyW2ldLmNyZWF0ZWRBdCwgJ1lZWVkvTU0vREQgSEg6bW06c3MnKS5mb3JtYXQoJ0hIOm1tJyk7XHJcbiAgICAgICAgaWYgKGRhdGFBcnJbaV0ubWVtb1R5cGUgPT09ICdKT1VSTkFMJykge1xyXG4gICAgICAgICAgLy8gaWYgKC88YnI+L2cudGVzdChkYXRhQXJyW2ldLmNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAvLyAgIGNvbnN0IGZvcm1hdGVkQ29udGVudCA9IGRhdGFBcnJbaV0uY29udGVudC5yZXBsYWNlKC88YnI+L2csICdcXG4gICAgJyk7XHJcbiAgICAgICAgICAvLyAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gJyArIGZvcm1hdGVkQ29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gJyArIGRhdGFBcnJbaV0uY29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoZGF0YUFycltpXS5tZW1vVHlwZSA9PT0gJ1RBU0stVE9ETycpIHtcclxuICAgICAgICAgICAgLy8gaWYgKC88YnI+L2cudGVzdChkYXRhQXJyW2ldLmNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgIC8vICAgY29uc3QgZm9ybWF0ZWRDb250ZW50ID0gZGF0YUFycltpXS5jb250ZW50LnJlcGxhY2UoLzxicj4vZywgJ1xcbiAgICAnKTtcclxuICAgICAgICAgICAgLy8gICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctIFsgXSAnICsgZm9ybWF0ZWRDb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gWyBdICcgKyBkYXRhQXJyW2ldLmNvbnRlbnQgKyAnXFxuJztcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhQXJyW2ldLm1lbW9UeXBlID09PSAnVEFTSy1ET05FJykge1xyXG4gICAgICAgICAgICAvLyBpZiAoLzxicj4vZy50ZXN0KGRhdGFBcnJbaV0uY29udGVudCkpIHtcclxuICAgICAgICAgICAgLy8gICBjb25zdCBmb3JtYXRlZENvbnRlbnQgPSBkYXRhQXJyW2ldLmNvbnRlbnQucmVwbGFjZSgvPGJyPi9nLCAnXFxuICAgICcpO1xyXG4gICAgICAgICAgICAvLyAgIG91dHB1dFRleHQgPSBvdXRwdXRUZXh0ICsgaW5kZW50ICsgJy0gW3hdICcgKyBmb3JtYXRlZENvbnRlbnQgKyAnXFxuJztcclxuICAgICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgICAgb3V0cHV0VGV4dCA9IG91dHB1dFRleHQgKyBpbmRlbnQgKyAnLSBbeF0gJyArIGRhdGFBcnJbaV0uY29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0YXNrTWFyayA9IGRhdGFBcnJbaV0ubWVtb1R5cGUubWF0Y2goL1RBU0stKC4qKT8vZylbMV07XHJcbiAgICAgICAgICAgIC8vIGlmICgvPGJyPi9nLnRlc3QoZGF0YUFycltpXS5jb250ZW50KSkge1xyXG4gICAgICAgICAgICAvLyAgIGNvbnN0IGZvcm1hdGVkQ29udGVudCA9IGRhdGFBcnJbaV0uY29udGVudC5yZXBsYWNlKC88YnI+L2csICdcXG4gICAgJyk7XHJcbiAgICAgICAgICAgIC8vICAgb3V0cHV0VGV4dCA9IG91dHB1dFRleHQgKyBpbmRlbnQgKyAnLSBbJyArIHRhc2tNYXJrICsgJ10gJyArIGZvcm1hdGVkQ29udGVudCArICdcXG4nO1xyXG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArIGluZGVudCArICctIFsnICsgdGFza01hcmsgKyAnXSAnICsgZGF0YUFycltpXS5jb250ZW50ICsgJ1xcbic7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChTaG93RGF0ZSAmJiBBZGRCbGFua0xpbmVXaGVuRGF0ZSkge1xyXG4gICAgICBvdXRwdXRUZXh0ID0gb3V0cHV0VGV4dCArICdcXG4nO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIGNvbnN0IHJlbW92ZUJyQ29udGVudCA9IG91dHB1dFRleHQucmVwbGFjZSgvPGJyPi9nLCAnXFxuICAgICcpO1xyXG4gIHJldHVybiByZW1vdmVCckNvbnRlbnQ7XHJcbn07XHJcbiIsImltcG9ydCB7dXNlQ29udGV4dH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XHJcbmltcG9ydCB7bG9jYXRpb25TZXJ2aWNlLCBxdWVyeVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL2hlbHBlcnMvdXRpbHMnO1xyXG5pbXBvcnQge2dldFRleHRXaXRoTWVtb1R5cGV9IGZyb20gJy4uL2hlbHBlcnMvZmlsdGVyJztcclxuaW1wb3J0ICcuLi9sZXNzL21lbW8tZmlsdGVyLmxlc3MnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge21vbWVudH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgY29weSBmcm9tICcuLi9pY29ucy9jb3B5LnN2Zyc7XHJcbmltcG9ydCB7Y29weVNob3duTWVtb3N9IGZyb20gJy4vTWVtb0xpc3QnO1xyXG5pbXBvcnQge2dldE1lbW9zQnlEYXRlLCB0cmFuc2Zlck1lbW9zSW50b1RleHR9IGZyb20gJy4uL29iQ29tcG9uZW50cy9vYkNvcHlNZW1vcyc7XHJcbmltcG9ydCB7dH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcblxyXG5pbnRlcmZhY2UgRmlsdGVyUHJvcHMge31cclxuXHJcbmNvbnN0IE1lbW9GaWx0ZXI6IFJlYWN0LkZDPEZpbHRlclByb3BzPiA9ICgpID0+IHtcclxuICBjb25zdCB7XHJcbiAgICBsb2NhdGlvblN0YXRlOiB7cXVlcnl9LFxyXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xyXG5cclxuICBjb25zdCB7dGFnOiB0YWdRdWVyeSwgZHVyYXRpb24sIHR5cGU6IG1lbW9UeXBlLCB0ZXh0OiB0ZXh0UXVlcnksIGZpbHRlcn0gPSBxdWVyeTtcclxuXHJcbiAgY29uc3QgcXVlcnlGaWx0ZXIgPSBxdWVyeVNlcnZpY2UuZ2V0UXVlcnlCeUlkKGZpbHRlcik7XHJcbiAgY29uc3Qgc2hvd0ZpbHRlciA9IEJvb2xlYW4oXHJcbiAgICB0YWdRdWVyeSB8fCAoZHVyYXRpb24gJiYgZHVyYXRpb24uZnJvbSA8IGR1cmF0aW9uLnRvKSB8fCBtZW1vVHlwZSB8fCB0ZXh0UXVlcnkgfHwgcXVlcnlGaWx0ZXIsXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlQ29weUNsaWNrID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgaWYgKGNvcHlTaG93bk1lbW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgbWVtb3NCeURhdGUgPSBnZXRNZW1vc0J5RGF0ZShjb3B5U2hvd25NZW1vcyk7XHJcbiAgICAgIGNvbnN0IHF1ZXJ5RGFpbHlNZW1vcyA9IHRyYW5zZmVyTWVtb3NJbnRvVGV4dChtZW1vc0J5RGF0ZSk7XHJcbiAgICAgIGF3YWl0IHV0aWxzLmNvcHlUZXh0VG9DbGlwYm9hcmQocXVlcnlEYWlseU1lbW9zKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9e2BmaWx0ZXItcXVlcnktY29udGFpbmVyICR7c2hvd0ZpbHRlciA/ICcnIDogJ2hpZGRlbid9YH0+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmlsdGVyLXF1ZXJ5XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGlwLXRleHRcIj5GSUxURVI6IDwvc3Bhbj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzc05hbWU9eydmaWx0ZXItaXRlbS1jb250YWluZXIgJyArIChxdWVyeUZpbHRlciA/ICcnIDogJ2hpZGRlbicpfVxyXG4gICAgICAgICAgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0TWVtb0ZpbHRlcignJyk7XHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb24tdGV4dFwiPvCflJY8L3NwYW4+IHtxdWVyeUZpbHRlcj8udGl0bGV9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3NOYW1lPXsnZmlsdGVyLWl0ZW0tY29udGFpbmVyICcgKyAodGFnUXVlcnkgPyAnJyA6ICdoaWRkZW4nKX1cclxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldFRhZ1F1ZXJ5KCcnKTtcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaWNvbi10ZXh0XCI+8J+Pt++4jzwvc3Bhbj4ge3RhZ1F1ZXJ5fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzTmFtZT17J2ZpbHRlci1pdGVtLWNvbnRhaW5lciAnICsgKG1lbW9UeXBlID8gJycgOiAnaGlkZGVuJyl9XHJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRNZW1vVHlwZVF1ZXJ5KCcnKTtcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaWNvbi10ZXh0XCI+8J+Tpjwvc3Bhbj4ge2dldFRleHRXaXRoTWVtb1R5cGUobWVtb1R5cGUgYXMgTWVtb1NwZWNUeXBlKX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICB7ZHVyYXRpb24gJiYgZHVyYXRpb24uZnJvbSA8IGR1cmF0aW9uLnRvID8gKFxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJmaWx0ZXItaXRlbS1jb250YWluZXJcIlxyXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldEZyb21BbmRUb1F1ZXJ5KDAsIDApO1xyXG4gICAgICAgICAgICB9fVxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uLXRleHRcIj7wn5eT77iPPC9zcGFuPiB7bW9tZW50KGR1cmF0aW9uLmZyb20sICd4JykuZm9ybWF0KCdZWVlZL01NL0REJyl9IHt0KCd0bycpfXsnICd9XHJcbiAgICAgICAgICAgIHttb21lbnQoZHVyYXRpb24udG8sICd4JykuYWRkKDEsICdkYXlzJykuZm9ybWF0KCdZWVlZL01NL0REJyl9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApIDogbnVsbH1cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzc05hbWU9eydmaWx0ZXItaXRlbS1jb250YWluZXIgJyArICh0ZXh0UXVlcnkgPyAnJyA6ICdoaWRkZW4nKX1cclxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldFRleHRRdWVyeSgnJyk7XHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb24tdGV4dFwiPvCflI08L3NwYW4+IHt0ZXh0UXVlcnl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvcHktbWVtb1wiPlxyXG4gICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2NvcHl9IG9uQ2xpY2s9e2hhbmRsZUNvcHlDbGlja30gLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVtb0ZpbHRlcjtcclxuIiwiaW1wb3J0IE1lbW9FZGl0b3IgZnJvbSAnLi4vY29tcG9uZW50cy9NZW1vRWRpdG9yJztcbmltcG9ydCBNZW1vc0hlYWRlciBmcm9tICcuLi9jb21wb25lbnRzL01lbW9zSGVhZGVyJztcbmltcG9ydCBNZW1vRmlsdGVyIGZyb20gJy4uL2NvbXBvbmVudHMvTWVtb0ZpbHRlcic7XG5pbXBvcnQgTWVtb0xpc3QgZnJvbSAnLi4vY29tcG9uZW50cy9NZW1vTGlzdCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtQbGF0Zm9ybX0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtEZWZhdWx0RWRpdG9yTG9jYXRpb259IGZyb20gJy4uL21lbW9zJztcblxuZnVuY3Rpb24gTWVtb3MoKSB7XG4gIGlmIChQbGF0Zm9ybS5pc01vYmlsZSAmJiBEZWZhdWx0RWRpdG9yTG9jYXRpb24gPT09ICdCb3R0b20nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxNZW1vc0hlYWRlciAvPlxuICAgICAgICA8TWVtb0ZpbHRlciAvPlxuICAgICAgICA8TWVtb0xpc3QgLz5cbiAgICAgICAgPE1lbW9FZGl0b3IgLz5cbiAgICAgIDwvPlxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxNZW1vc0hlYWRlciAvPlxuICAgICAgICA8TWVtb0VkaXRvciAvPlxuICAgICAgICA8TWVtb0ZpbHRlciAvPlxuICAgICAgICA8TWVtb0xpc3QgLz5cbiAgICAgIDwvPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWVtb3M7XG4iLCJpbXBvcnQge3VzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5cbmZ1bmN0aW9uIHVzZUxvYWRpbmcoaW5pdGlhbFN0YXRlID0gdHJ1ZSkge1xuICBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IHVzZVN0YXRlKHtpc0xvYWRpbmc6IGluaXRpYWxTdGF0ZSwgaXNGYWlsZWQ6IGZhbHNlLCBpc1N1Y2NlZWQ6IGZhbHNlfSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzZXRMb2FkaW5nOiAoKSA9PiB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgICAgIGlzRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgaXNTdWNjZWVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2V0RmluaXNoOiAoKSA9PiB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBpc0ZhaWxlZDogZmFsc2UsXG4gICAgICAgIGlzU3VjY2VlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2V0RXJyb3I6ICgpID0+IHtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGlzRmFpbGVkOiB0cnVlLFxuICAgICAgICBpc1N1Y2NlZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlTG9hZGluZztcbiIsImltcG9ydCB7SU1BR0VfVVJMX1JFRywgTUFSS0RPV05fVVJMX1JFRywgTUFSS0RPV05fV0VCX1VSTF9SRUcsIFdJS0lfSU1BR0VfVVJMX1JFR30gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xyXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XHJcbmltcG9ydCB1c2VUb2dnbGUgZnJvbSAnLi4vaG9va3MvdXNlVG9nZ2xlJztcclxuaW1wb3J0IHttZW1vU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMnO1xyXG5pbXBvcnQgT25seSBmcm9tICcuL2NvbW1vbi9Pbmx5V2hlbic7XHJcbmltcG9ydCBJbWFnZSBmcm9tICcuL0ltYWdlJztcclxuaW1wb3J0IHtmb3JtYXRNZW1vQ29udGVudH0gZnJvbSAnLi9NZW1vJztcclxuaW1wb3J0ICcuLi9sZXNzL21lbW8ubGVzcyc7XHJcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7Tm90aWNlLCBURmlsZSwgVmF1bHR9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XHJcbmltcG9ydCBtb3JlIGZyb20gJy4uL2ljb25zL21vcmUuc3ZnJztcclxuaW1wb3J0IHsgdCB9IGZyb20gJy4uL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xyXG5cclxuaW50ZXJmYWNlIFByb3BzIHtcclxuICBtZW1vOiBNb2RlbC5NZW1vO1xyXG4gIGhhbmRsZURlbGV0ZWRNZW1vQWN0aW9uOiAobWVtb0lkOiBzdHJpbmcpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmludGVyZmFjZSBMaW5rTWF0Y2gge1xyXG4gIGxpbmtUZXh0OiBzdHJpbmc7XHJcbiAgYWx0VGV4dDogc3RyaW5nO1xyXG4gIHBhdGg6IHN0cmluZztcclxuICBmaWxlcGF0aD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldFBhdGhPZkltYWdlID0gKHZhdWx0OiBWYXVsdCwgaW1hZ2U6IFRGaWxlKSA9PiB7XHJcbiAgcmV0dXJuIHZhdWx0LmdldFJlc291cmNlUGF0aChpbWFnZSk7XHJcbn07XHJcblxyXG5jb25zdCBkZXRlY3RXaWtpSW50ZXJuYWxMaW5rID0gKGxpbmVUZXh0OiBzdHJpbmcpOiBMaW5rTWF0Y2ggfCBudWxsID0+IHtcclxuICBjb25zdCB7bWV0YWRhdGFDYWNoZSwgdmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG4gIGNvbnN0IGludGVybmFsRmlsZU5hbWUgPSBXSUtJX0lNQUdFX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/LlsxXTtcclxuICBjb25zdCBpbnRlcm5hbEFsdE5hbWUgPSBXSUtJX0lNQUdFX1VSTF9SRUcuZXhlYyhsaW5lVGV4dCk/Lls1XTtcclxuICBjb25zdCBmaWxlID0gbWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcclxuICBpZiAoZmlsZSA9PT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcclxuICAgICAgcGF0aDogJycsXHJcbiAgICAgIGZpbGVwYXRoOiAnJyxcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IGltYWdlUGF0aCA9IGdldFBhdGhPZkltYWdlKHZhdWx0LCBmaWxlKTtcclxuICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZS5wYXRoO1xyXG4gICAgaWYgKGludGVybmFsQWx0TmFtZSkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgICBhbHRUZXh0OiAnJyxcclxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXHJcbiAgICAgICAgZmlsZXBhdGg6IGZpbGVQYXRoLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IGRldGVjdE1ESW50ZXJuYWxMaW5rID0gKGxpbmVUZXh0OiBzdHJpbmcpOiBMaW5rTWF0Y2ggfCBudWxsID0+IHtcclxuICBjb25zdCB7bWV0YWRhdGFDYWNoZSwgdmF1bHR9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xyXG4gIGNvbnN0IGludGVybmFsRmlsZU5hbWUgPSBNQVJLRE9XTl9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bNV07XHJcbiAgY29uc3QgaW50ZXJuYWxBbHROYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzJdO1xyXG4gIGNvbnN0IGZpbGUgPSBtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGRlY29kZVVSSUNvbXBvbmVudChpbnRlcm5hbEZpbGVOYW1lKSwgJycpO1xyXG4gIGlmIChmaWxlID09PSBudWxsKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsaW5rVGV4dDogaW50ZXJuYWxGaWxlTmFtZSxcclxuICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxyXG4gICAgICBwYXRoOiAnJyxcclxuICAgICAgZmlsZXBhdGg6ICcnLFxyXG4gICAgfTtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgaW1hZ2VQYXRoID0gZ2V0UGF0aE9mSW1hZ2UodmF1bHQsIGZpbGUpO1xyXG4gICAgY29uc3QgZmlsZVBhdGggPSBmaWxlLnBhdGg7XHJcbiAgICBpZiAoaW50ZXJuYWxBbHROYW1lKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXHJcbiAgICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxyXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcclxuICAgICAgICBmaWxlcGF0aDogZmlsZVBhdGgsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxyXG4gICAgICAgIGFsdFRleHQ6ICcnLFxyXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcclxuICAgICAgICBmaWxlcGF0aDogZmlsZVBhdGgsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgRGVsZXRlZE1lbW86IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wczogUHJvcHMpID0+IHtcclxuICAvLyBjb25zdCB7IGFwcCB9ICA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlO1xyXG5cclxuICBjb25zdCB7bWVtbzogcHJvcHNNZW1vLCBoYW5kbGVEZWxldGVkTWVtb0FjdGlvbn0gPSBwcm9wcztcclxuICBjb25zdCBtZW1vOiBGb3JtYXR0ZWRNZW1vID0ge1xyXG4gICAgLi4ucHJvcHNNZW1vLFxyXG4gICAgY3JlYXRlZEF0U3RyOiB1dGlscy5nZXREYXRlVGltZVN0cmluZyhwcm9wc01lbW8uY3JlYXRlZEF0KSxcclxuICAgIGRlbGV0ZWRBdFN0cjogdXRpbHMuZ2V0RGF0ZVRpbWVTdHJpbmcocHJvcHNNZW1vLmRlbGV0ZWRBdCA/PyBEYXRlLm5vdygpKSxcclxuICB9O1xyXG4gIGNvbnN0IFtzaG93Q29uZmlybURlbGV0ZUJ0biwgdG9nZ2xlQ29uZmlybURlbGV0ZUJ0bl0gPSB1c2VUb2dnbGUoZmFsc2UpO1xyXG4gIC8vIGNvbnN0IGltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKElNQUdFX1VSTF9SRUcpID8/IFtdKTtcclxuICBsZXQgZXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcclxuICBsZXQgaW50ZXJuYWxJbWFnZVVybHMgPSBbXTtcclxuICBsZXQgYWxsTWFya2Rvd25MaW5rOiBzdHJpbmcgfCBhbnlbXSA9IFtdO1xyXG4gIGxldCBhbGxJbnRlcm5hbExpbmsgPSBbXSBhcyBhbnlbXTtcclxuICBpZiAoSU1BR0VfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcclxuICAgIGxldCBhbGxFeHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xyXG4gICAgbGV0IGFub3RoZXJFeHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xyXG4gICAgaWYgKE1BUktET1dOX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XHJcbiAgICAgIGFsbE1hcmtkb3duTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1VSTF9SRUcpKTtcclxuICAgIH1cclxuICAgIGlmIChXSUtJX0lNQUdFX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XHJcbiAgICAgIGFsbEludGVybmFsTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKFdJS0lfSU1BR0VfVVJMX1JFRykpO1xyXG4gICAgfVxyXG4gICAgLy8gY29uc3QgYWxsSW50ZXJuYWxMaW5rID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goV0lLSV9JTUFHRV9VUkxfUkVHKSk7XHJcbiAgICBpZiAoTUFSS0RPV05fV0VCX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XHJcbiAgICAgIGFsbEV4dGVybmFsSW1hZ2VVcmxzID0gQXJyYXkuZnJvbShtZW1vLmNvbnRlbnQubWF0Y2goTUFSS0RPV05fV0VCX1VSTF9SRUcpKTtcclxuICAgIH1cclxuICAgIGlmIChhbGxJbnRlcm5hbExpbmsubGVuZ3RoKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsSW50ZXJuYWxMaW5rLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IG9uZSA9IGFsbEludGVybmFsTGlua1tpXTtcclxuICAgICAgICBpbnRlcm5hbEltYWdlVXJscy5wdXNoKGRldGVjdFdpa2lJbnRlcm5hbExpbmsob25lKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChhbGxNYXJrZG93bkxpbmsubGVuZ3RoKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsTWFya2Rvd25MaW5rLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHR3byA9IGFsbE1hcmtkb3duTGlua1tpXTtcclxuICAgICAgICBpZiAoLyguKilodHRwW3NdPyguKikvLnRlc3QodHdvKSkge1xyXG4gICAgICAgICAgYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzLnB1c2goTUFSS0RPV05fVVJMX1JFRy5leGVjKHR3byk/Lls1XSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGludGVybmFsSW1hZ2VVcmxzLnB1c2goZGV0ZWN0TURJbnRlcm5hbExpbmsodHdvKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBleHRlcm5hbEltYWdlVXJscyA9IGFsbEV4dGVybmFsSW1hZ2VVcmxzLmNvbmNhdChhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMpO1xyXG4gICAgLy8gZXh0ZXJuYWxJbWFnZVVybHMgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChJTUFHRV9VUkxfUkVHKSA/PyBbXSk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBoYW5kbGVEZWxldGVNZW1vQ2xpY2sgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBpZiAoc2hvd0NvbmZpcm1EZWxldGVCdG4pIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCBtZW1vU2VydmljZS5kZWxldGVNZW1vQnlJZChtZW1vLmlkKTtcclxuICAgICAgICBoYW5kbGVEZWxldGVkTWVtb0FjdGlvbihtZW1vLmlkKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG4oKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVSZXN0b3JlTWVtb0NsaWNrID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgbWVtb1NlcnZpY2UucmVzdG9yZU1lbW9CeUlkKG1lbW8uaWQpO1xyXG4gICAgICBoYW5kbGVEZWxldGVkTWVtb0FjdGlvbihtZW1vLmlkKTtcclxuICAgICAgbmV3IE5vdGljZSgnUkVTVE9SRSBTVUNDRUVEJyk7XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTW91c2VMZWF2ZU1lbW9XcmFwcGVyID0gKCkgPT4ge1xyXG4gICAgaWYgKHNob3dDb25maXJtRGVsZXRlQnRuKSB7XHJcbiAgICAgIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG4oZmFsc2UpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGNsYXNzTmFtZT17YG1lbW8td3JhcHBlciAkeydtZW1vcy0nICsgbWVtby5pZH1gfSBvbk1vdXNlTGVhdmU9e2hhbmRsZU1vdXNlTGVhdmVNZW1vV3JhcHBlcn0+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWVtby10b3Atd3JhcHBlclwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRpbWUtdGV4dFwiPnt0KCdERUxFVEUgQVQnKX0ge21lbW8uZGVsZXRlZEF0U3RyfTwvc3Bhbj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ0bnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG4gbW9yZS1hY3Rpb24tYnRuXCI+XHJcbiAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e21vcmV9IC8+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vcmUtYWN0aW9uLWJ0bnMtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vcmUtYWN0aW9uLWJ0bnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuIHJlc3RvcmUtYnRuXCIgb25DbGljaz17aGFuZGxlUmVzdG9yZU1lbW9DbGlja30+XHJcbiAgICAgICAgICAgICAgICB7dCgnUkVTVE9SRScpfVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgYnRuIGRlbGV0ZS1idG4gJHtzaG93Q29uZmlybURlbGV0ZUJ0biA/ICdmaW5hbC1jb25maXJtJyA6ICcnfWB9XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVEZWxldGVNZW1vQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAge3Nob3dDb25maXJtRGVsZXRlQnRuID8gdCgnQ09ORklSTe+8gScpIDogdCgnREVMRVRFJyl9XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLWNvbnRlbnQtdGV4dFwiIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBmb3JtYXRNZW1vQ29udGVudChtZW1vLmNvbnRlbnQpfX0+PC9kaXY+XHJcbiAgICAgIDxPbmx5IHdoZW49e2V4dGVybmFsSW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLXdyYXBwZXJcIj5cclxuICAgICAgICAgIHtleHRlcm5hbEltYWdlVXJscy5tYXAoKGltZ1VybCwgaWR4KSA9PiAoXHJcbiAgICAgICAgICAgIDxJbWFnZSBhbHQ9XCJcIiBrZXk9e2lkeH0gY2xhc3NOYW1lPVwibWVtby1pbWdcIiBpbWdVcmw9e2ltZ1VybH0gcmVmZXJyZXJQb2xpY3k9XCJuby1yZWZlcnJlclwiIC8+XHJcbiAgICAgICAgICApKX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9Pbmx5PlxyXG4gICAgICA8T25seSB3aGVuPXtpbnRlcm5hbEltYWdlVXJscy5sZW5ndGggPiAwfT5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyIGludGVybmFsLWVtYmVkIGltYWdlLWVtYmVkIGlzLWxvYWRlZFwiPlxyXG4gICAgICAgICAge2ludGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcclxuICAgICAgICAgICAgPEltYWdlXHJcbiAgICAgICAgICAgICAga2V5PXtpZHh9XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWVtby1pbWdcIlxyXG4gICAgICAgICAgICAgIGltZ1VybD17aW1nVXJsLnBhdGh9XHJcbiAgICAgICAgICAgICAgYWx0PXtpbWdVcmwuYWx0VGV4dH1cclxuICAgICAgICAgICAgICBmaWxlcGF0aD17aW1nVXJsLmZpbGVwYXRofVxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgKSl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvT25seT5cclxuICAgICAgey8qIDxPbmx5IHdoZW49e2ltYWdlVXJscy5sZW5ndGggPiAwfT5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlcy13cmFwcGVyXCI+XHJcbiAgICAgICAgICB7aW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcclxuICAgICAgICAgICAgPEltYWdlIGNsYXNzTmFtZT1cIm1lbW8taW1nXCIga2V5PXtpZHh9IGltZ1VybD17aW1nVXJsfSAvPlxyXG4gICAgICAgICAgKSl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvT25seT4gKi99XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgRGVsZXRlZE1lbW87XHJcbiIsImltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xyXG5pbXBvcnQgdXNlTG9hZGluZyBmcm9tICcuLi9ob29rcy91c2VMb2FkaW5nJztcclxuaW1wb3J0IHtnbG9iYWxTdGF0ZVNlcnZpY2UsIGxvY2F0aW9uU2VydmljZSwgbWVtb1NlcnZpY2UsIHF1ZXJ5U2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMnO1xyXG5pbXBvcnQge0lNQUdFX1VSTF9SRUcsIExJTktfUkVHLCBNRU1PX0xJTktfUkVHLCBOT1BfRklSU1RfVEFHX1JFRywgVEFHX1JFR30gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xyXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XHJcbmltcG9ydCB7Y2hlY2tTaG91bGRTaG93TWVtb1dpdGhGaWx0ZXJzfSBmcm9tICcuLi9oZWxwZXJzL2ZpbHRlcic7XHJcbmltcG9ydCBPbmx5IGZyb20gJy4uL2NvbXBvbmVudHMvY29tbW9uL09ubHlXaGVuJztcclxuaW1wb3J0IERlbGV0ZWRNZW1vIGZyb20gJy4uL2NvbXBvbmVudHMvRGVsZXRlZE1lbW8nO1xyXG5pbXBvcnQgTWVtb0ZpbHRlciBmcm9tICcuLi9jb21wb25lbnRzL01lbW9GaWx0ZXInO1xyXG5pbXBvcnQgJy4uL2xlc3MvbWVtby10cmFzaC5sZXNzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IG1lbnVTdmcgZnJvbSAnLi4vaWNvbnMvbWVudS5zdmcnO1xyXG5pbXBvcnQge05vdGljZX0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcblxyXG5pbnRlcmZhY2UgUHJvcHMge31cclxuXHJcbmNvbnN0IE1lbW9UcmFzaDogUmVhY3QuRkM8UHJvcHM+ID0gKCkgPT4ge1xyXG4gIGNvbnN0IHtcclxuICAgIGxvY2F0aW9uU3RhdGU6IHtxdWVyeX0sXHJcbiAgICBnbG9iYWxTdGF0ZToge2lzTW9iaWxlVmlld30sXHJcbiAgfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XHJcbiAgY29uc3QgbG9hZGluZ1N0YXRlID0gdXNlTG9hZGluZygpO1xyXG4gIGNvbnN0IFtkZWxldGVkTWVtb3MsIHNldERlbGV0ZWRNZW1vc10gPSB1c2VTdGF0ZTxNb2RlbC5NZW1vW10+KFtdKTtcclxuXHJcbiAgY29uc3Qge3RhZzogdGFnUXVlcnksIGR1cmF0aW9uLCB0eXBlOiBtZW1vVHlwZSwgdGV4dDogdGV4dFF1ZXJ5LCBmaWx0ZXI6IHF1ZXJ5SWR9ID0gcXVlcnk7XHJcbiAgY29uc3QgcXVlcnlGaWx0ZXIgPSBxdWVyeVNlcnZpY2UuZ2V0UXVlcnlCeUlkKHF1ZXJ5SWQpO1xyXG4gIGNvbnN0IHNob3dNZW1vRmlsdGVyID0gQm9vbGVhbihcclxuICAgIHRhZ1F1ZXJ5IHx8IChkdXJhdGlvbiAmJiBkdXJhdGlvbi5mcm9tIDwgZHVyYXRpb24udG8pIHx8IG1lbW9UeXBlIHx8IHRleHRRdWVyeSB8fCBxdWVyeUZpbHRlcixcclxuICApO1xyXG5cclxuICBjb25zdCBzaG93bk1lbW9zID1cclxuICAgIHNob3dNZW1vRmlsdGVyIHx8IHF1ZXJ5RmlsdGVyXHJcbiAgICAgID8gZGVsZXRlZE1lbW9zLmZpbHRlcigobWVtbykgPT4ge1xyXG4gICAgICAgICAgbGV0IHNob3VsZFNob3cgPSB0cnVlO1xyXG5cclxuICAgICAgICAgIGlmIChxdWVyeUZpbHRlcikge1xyXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gSlNPTi5wYXJzZShxdWVyeUZpbHRlci5xdWVyeXN0cmluZykgYXMgRmlsdGVyW107XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcnMpKSB7XHJcbiAgICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGNoZWNrU2hvdWxkU2hvd01lbW9XaXRoRmlsdGVycyhtZW1vLCBmaWx0ZXJzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0YWdRdWVyeSkge1xyXG4gICAgICAgICAgICBjb25zdCB0YWdzU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChUQUdfUkVHKSA/PyBbXSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0YWcgPSB0LnJlcGxhY2UoVEFHX1JFRywgJyQxJykudHJpbSgpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGFnLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgICAgbGV0IHRlbXAgPSAnJztcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIHRlbXAgKz0gaTtcclxuICAgICAgICAgICAgICAgIHRhZ3NTZXQuYWRkKHRlbXApO1xyXG4gICAgICAgICAgICAgICAgdGVtcCArPSAnLyc7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChOT1BfRklSU1RfVEFHX1JFRykgPz8gW10pKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdGFnID0gdC5yZXBsYWNlKE5PUF9GSVJTVF9UQUdfUkVHLCAnJDEnKS50cmltKCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0YWcuc3BsaXQoJy8nKTtcclxuICAgICAgICAgICAgICBsZXQgdGVtcCA9ICcnO1xyXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBpdGVtcykge1xyXG4gICAgICAgICAgICAgICAgdGVtcCArPSBpO1xyXG4gICAgICAgICAgICAgICAgdGFnc1NldC5hZGQodGVtcCk7XHJcbiAgICAgICAgICAgICAgICB0ZW1wICs9ICcvJztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0YWdzU2V0Lmhhcyh0YWdRdWVyeSkpIHtcclxuICAgICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgZHVyYXRpb24gJiZcclxuICAgICAgICAgICAgZHVyYXRpb24uZnJvbSA8IGR1cmF0aW9uLnRvICYmXHJcbiAgICAgICAgICAgICh1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUobWVtby5jcmVhdGVkQXQpIDwgZHVyYXRpb24uZnJvbSB8fFxyXG4gICAgICAgICAgICAgIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShtZW1vLmNyZWF0ZWRBdCkgPiBkdXJhdGlvbi50bylcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobWVtb1R5cGUpIHtcclxuICAgICAgICAgICAgaWYgKG1lbW9UeXBlID09PSAnTk9UX1RBR0dFRCcgJiYgbWVtby5jb250ZW50Lm1hdGNoKFRBR19SRUcpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lbW9UeXBlID09PSAnTElOS0VEJyAmJiBtZW1vLmNvbnRlbnQubWF0Y2goTElOS19SRUcpID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1lbW9UeXBlID09PSAnSU1BR0VEJyAmJiBtZW1vLmNvbnRlbnQubWF0Y2goSU1BR0VfVVJMX1JFRykgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICBzaG91bGRTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtb1R5cGUgPT09ICdDT05ORUNURUQnICYmIG1lbW8uY29udGVudC5tYXRjaChNRU1PX0xJTktfUkVHKSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIHNob3VsZFNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRleHRRdWVyeSAmJiAhbWVtby5jb250ZW50LmluY2x1ZGVzKHRleHRRdWVyeSkpIHtcclxuICAgICAgICAgICAgc2hvdWxkU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBzaG91bGRTaG93O1xyXG4gICAgICAgIH0pXHJcbiAgICAgIDogZGVsZXRlZE1lbW9zO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgbWVtb1NlcnZpY2UuZmV0Y2hBbGxNZW1vcygpO1xyXG4gICAgbWVtb1NlcnZpY2VcclxuICAgICAgLmZldGNoRGVsZXRlZE1lbW9zKClcclxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICBzZXREZWxldGVkTWVtb3MocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICBuZXcgTm90aWNlKCdGYWlsZWQgdG8gZmV0Y2ggZGVsZXRlZCBtZW1vczogJywgZXJyb3IpO1xyXG4gICAgICB9KVxyXG4gICAgICAuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgbG9hZGluZ1N0YXRlLnNldEZpbmlzaCgpO1xyXG4gICAgICB9KTtcclxuICAgIGxvY2F0aW9uU2VydmljZS5jbGVhclF1ZXJ5KCk7XHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBoYW5kbGVEZWxldGVkTWVtb0FjdGlvbiA9IHVzZUNhbGxiYWNrKChtZW1vSWQ6IHN0cmluZykgPT4ge1xyXG4gICAgc2V0RGVsZXRlZE1lbW9zKChkZWxldGVkTWVtb3MpID0+IGRlbGV0ZWRNZW1vcy5maWx0ZXIoKG1lbW8pID0+IG1lbW8uaWQgIT09IG1lbW9JZCkpO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlU2hvd1NpZGViYXJCdG5DbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcclxuICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRTaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcodHJ1ZSk7XHJcbiAgfSwgW10pO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLXRyYXNoLXdyYXBwZXJcIj5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZWN0aW9uLWhlYWRlci1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj5cclxuICAgICAgICAgIDxPbmx5IHdoZW49e2lzTW9iaWxlVmlld30+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYWN0aW9uLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZVNob3dTaWRlYmFyQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e21lbnVTdmd9IGFsdD1cIm1lbnVcIiAvPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvT25seT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm5vcm1hbC10ZXh0XCI+e3QoJ1JlY3ljbGUgYmluJyl9PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPE1lbW9GaWx0ZXIgLz5cclxuICAgICAge2xvYWRpbmdTdGF0ZS5pc0xvYWRpbmcgPyAoXHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0aXAtdGV4dC1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRpcC10ZXh0XCI+e3QoJ0ZldGNoaW5nIGRhdGEuLi4nKX08L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICkgOiBkZWxldGVkTWVtb3MubGVuZ3RoID09PSAwID8gKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGlwLXRleHQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPnt0KCdIZXJlIGlzIE5vIFpldHRlbHMuJyl9PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApIDogKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGVsZXRlZC1tZW1vcy1jb250YWluZXJcIj5cclxuICAgICAgICAgIHtzaG93bk1lbW9zLm1hcCgobWVtbykgPT4gKFxyXG4gICAgICAgICAgICA8RGVsZXRlZE1lbW9cclxuICAgICAgICAgICAgICBrZXk9e2Ake21lbW8uaWR9LSR7bWVtby51cGRhdGVkQXR9YH1cclxuICAgICAgICAgICAgICBtZW1vPXttZW1vfVxyXG4gICAgICAgICAgICAgIGhhbmRsZURlbGV0ZWRNZW1vQWN0aW9uPXtoYW5kbGVEZWxldGVkTWVtb0FjdGlvbn1cclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICkpfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICApfVxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1lbW9UcmFzaDtcclxuIiwiaW1wb3J0IHt1c2VDb250ZXh0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XG5pbXBvcnQge2dsb2JhbFN0YXRlU2VydmljZSwgbWVtb1NlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCB7cGFyc2VIdG1sVG9SYXdUZXh0fSBmcm9tICcuLi9oZWxwZXJzL21hcmtlZCc7XG5pbXBvcnQge2Zvcm1hdE1lbW9Db250ZW50fSBmcm9tICcuL01lbW8nO1xuaW1wb3J0ICcuLi9sZXNzL3ByZWZlcmVuY2VzLXNlY3Rpb24ubGVzcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNoZWNrYm94QWN0aXZlIGZyb20gJy4uL2ljb25zL2NoZWNrYm94LWFjdGl2ZS5zdmcnO1xuaW1wb3J0IGNoZWNrYm94IGZyb20gJy4uL2ljb25zL2NoZWNrYm94LnN2Zyc7XG5cbmludGVyZmFjZSBQcm9wcyB7fVxuXG5jb25zdCBQcmVmZXJlbmNlc1NlY3Rpb246IFJlYWN0LkZDPFByb3BzPiA9ICgpID0+IHtcbiAgY29uc3Qge2dsb2JhbFN0YXRlfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XG4gIGNvbnN0IHt1c2VUaW55VW5kb0hpc3RvcnlDYWNoZSwgc2hvdWxkSGlkZUltYWdlVXJsLCBzaG91bGRTcGxpdE1lbW9Xb3JkLCBzaG91bGRVc2VNYXJrZG93blBhcnNlcn0gPSBnbG9iYWxTdGF0ZTtcblxuICBjb25zdCBkZW1vTWVtb0NvbnRlbnQgPVxuICAgICfwn5GLIOS9oOWlveWRgO+9nuasoui/juS9v+eUqG1lbW9zIVxcbiog4pyoICoq5byA5rqQ6aG555uuKirvvJtcXG4qIPCfmIsg57K+576O5LiU57uG6IqC55qE6KeG6KeJ5qC35byP77ybXFxuKiDwn5ORIOS9k+mqjOS8mOiJr+eahOS6pOS6kumAu+i+ke+8myc7XG5cbiAgY29uc3QgaGFuZGxlT3BlblRpbnlVbmRvQ2hhbmdlZCA9ICgpID0+IHtcbiAgICBnbG9iYWxTdGF0ZVNlcnZpY2Uuc2V0QXBwU2V0dGluZyh7XG4gICAgICB1c2VUaW55VW5kb0hpc3RvcnlDYWNoZTogIXVzZVRpbnlVbmRvSGlzdG9yeUNhY2hlLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNwbGl0V29yZHNWYWx1ZUNoYW5nZWQgPSAoKSA9PiB7XG4gICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldEFwcFNldHRpbmcoe1xuICAgICAgc2hvdWxkU3BsaXRNZW1vV29yZDogIXNob3VsZFNwbGl0TWVtb1dvcmQsXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlSGlkZUltYWdlVXJsVmFsdWVDaGFuZ2VkID0gKCkgPT4ge1xuICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRBcHBTZXR0aW5nKHtcbiAgICAgIHNob3VsZEhpZGVJbWFnZVVybDogIXNob3VsZEhpZGVJbWFnZVVybCxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVVc2VNYXJrZG93blBhcnNlckNoYW5nZWQgPSAoKSA9PiB7XG4gICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldEFwcFNldHRpbmcoe1xuICAgICAgc2hvdWxkVXNlTWFya2Rvd25QYXJzZXI6ICFzaG91bGRVc2VNYXJrZG93blBhcnNlcixcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVFeHBvcnRCdG5DbGljayA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmb3JtYXRlZE1lbW9zID0gbWVtb1NlcnZpY2UuZ2V0U3RhdGUoKS5tZW1vcy5tYXAoKG0pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm0sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QganNvblN0ciA9IEpTT04uc3RyaW5naWZ5KGZvcm1hdGVkTWVtb3MpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChqc29uU3RyKSk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgJ2RhdGEuanNvbicpO1xuICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIGVsZW1lbnQuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICB9O1xuXG4gIC8vIGNvbnN0IGhhbmRsZUZvcm1hdE1lbW9zQnRuQ2xpY2sgPSBhc3luYyAoKSA9PiB7XG4gIC8vICAgY29uc3QgbWVtb3MgPSBtZW1vU2VydmljZS5nZXRTdGF0ZSgpLm1lbW9zO1xuICAvLyAgIGZvciAoY29uc3QgbSBvZiBtZW1vcykge1xuICAvLyAgICAgbWVtb1NlcnZpY2UudXBkYXRlTWVtbyhtLmlkLCBwYXJzZUh0bWxUb1Jhd1RleHQobS5jb250ZW50KSk7XG4gIC8vICAgfVxuICAvLyB9O1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VjdGlvbi1jb250YWluZXIgcHJlZmVyZW5jZXMtc2VjdGlvbi1jb250YWluZXJcIj5cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwidGl0bGUtdGV4dFwiPk1lbW8g5pi+56S655u45YWzPC9wPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPVwiZGVtby1jb250ZW50LWNvbnRhaW5lciBtZW1vLWNvbnRlbnQtdGV4dFwiXG4gICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGZvcm1hdE1lbW9Db250ZW50KGRlbW9NZW1vQ29udGVudCl9fT48L2Rpdj5cbiAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImZvcm0tbGFiZWwgY2hlY2tib3gtZm9ybS1sYWJlbFwiIG9uQ2xpY2s9e2hhbmRsZVNwbGl0V29yZHNWYWx1ZUNoYW5nZWR9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm5vcm1hbC10ZXh0XCI+5Lit6Iux5paH5YaF5a656Ieq5Yqo6Ze06ZqUPC9zcGFuPlxuICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e3Nob3VsZFNwbGl0TWVtb1dvcmQgPyBjaGVja2JveEFjdGl2ZSA6IGNoZWNrYm94fSAvPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZm9ybS1sYWJlbCBjaGVja2JveC1mb3JtLWxhYmVsXCIgb25DbGljaz17aGFuZGxlVXNlTWFya2Rvd25QYXJzZXJDaGFuZ2VkfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPumDqOWIhiBtYXJrZG93biDmoLzlvI/op6PmnpA8L3NwYW4+XG4gICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17c2hvdWxkVXNlTWFya2Rvd25QYXJzZXIgPyBjaGVja2JveEFjdGl2ZSA6IGNoZWNrYm94fSAvPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiZm9ybS1sYWJlbCBjaGVja2JveC1mb3JtLWxhYmVsXCIgb25DbGljaz17aGFuZGxlSGlkZUltYWdlVXJsVmFsdWVDaGFuZ2VkfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPumakOiXj+WbvueJh+mTvuaOpeWcsOWdgDwvc3Bhbj5cbiAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtzaG91bGRIaWRlSW1hZ2VVcmwgPyBjaGVja2JveEFjdGl2ZSA6IGNoZWNrYm94fSAvPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlY3Rpb24tY29udGFpbmVyIHByZWZlcmVuY2VzLXNlY3Rpb24tY29udGFpbmVyXCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj7nvJbovpHlmag8L3A+XG4gICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJmb3JtLWxhYmVsIGNoZWNrYm94LWZvcm0tbGFiZWxcIiBvbkNsaWNrPXtoYW5kbGVPcGVuVGlueVVuZG9DaGFuZ2VkfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPlxuICAgICAgICAgICAg5ZCv55SoeycgJ31cbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vYm9vamFjay90aW55LXVuZG9cIlxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgICAgICAgICAgICAgcmVsPVwibm9yZWZlcnJlclwiPlxuICAgICAgICAgICAgICB0aW55LXVuZG9cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17dXNlVGlueVVuZG9IaXN0b3J5Q2FjaGUgPyBjaGVja2JveEFjdGl2ZSA6IGNoZWNrYm94fSAvPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlY3Rpb24tY29udGFpbmVyIGhpZGRlblwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXRsZS10ZXh0XCI+5YW25LuWPC9wPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ0bi1jb250YWluZXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBleHBvcnQtYnRuXCIgb25DbGljaz17aGFuZGxlRXhwb3J0QnRuQ2xpY2t9PlxuICAgICAgICAgICAg5a+85Ye65pWw5o2uKEpTT04pXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgey8qIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGZvcm1hdC1idG5cIiBvbkNsaWNrPXtoYW5kbGVGb3JtYXRNZW1vc0J0bkNsaWNrfT5cbiAgICAgICAgICAgIOagvOW8j+WMluaVsOaNrlxuICAgICAgICAgIDwvYnV0dG9uPiAqL31cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByZWZlcmVuY2VzU2VjdGlvbjtcbiIsImltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZUVmZmVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xuaW1wb3J0IHtnbG9iYWxTdGF0ZVNlcnZpY2UsIG1lbW9TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgUHJlZmVyZW5jZXNTZWN0aW9uIGZyb20gJy4uL2NvbXBvbmVudHMvUHJlZmVyZW5jZXNTZWN0aW9uJztcbmltcG9ydCBPbmx5IGZyb20gJy4uL2NvbXBvbmVudHMvY29tbW9uL09ubHlXaGVuJztcbmltcG9ydCAnLi4vbGVzcy9zZXR0aW5nLmxlc3MnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtZW51U3ZnIGZyb20gJy4uL2ljb25zL21lbnUuc3ZnJztcblxuaW50ZXJmYWNlIFByb3BzIHt9XG5cbmNvbnN0IFNldHRpbmc6IFJlYWN0LkZDPFByb3BzPiA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIGdsb2JhbFN0YXRlOiB7aXNNb2JpbGVWaWV3fSxcbiAgfSA9IHVzZUNvbnRleHQoYXBwQ29udGV4dCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBtZW1vU2VydmljZS5mZXRjaEFsbE1lbW9zKCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVTaG93U2lkZWJhckJ0bkNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGdsb2JhbFN0YXRlU2VydmljZS5zZXRTaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcodHJ1ZSk7XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicHJlZmVyZW5jZS13cmFwcGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlY3Rpb24taGVhZGVyLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj5cbiAgICAgICAgICA8T25seSB3aGVuPXtpc01vYmlsZVZpZXd9PlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJhY3Rpb24tYnRuXCIgb25DbGljaz17aGFuZGxlU2hvd1NpZGViYXJCdG5DbGlja30+XG4gICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e21lbnVTdmd9IGFsdD1cIm1lbnVcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9Pbmx5PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm5vcm1hbC10ZXh0XCI+6LSm5Y+35LiO6K6+572uPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNlY3Rpb25zLXdyYXBwZXJcIj5cbiAgICAgICAgPFByZWZlcmVuY2VzU2VjdGlvbiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTZXR0aW5nO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBNZW1vcyBmcm9tICcuLi9wYWdlcy9NZW1vcyc7XG5pbXBvcnQgTWVtb1RyYXNoIGZyb20gJy4uL3BhZ2VzL01lbW9UcmFzaCc7XG5pbXBvcnQgU2V0dGluZyBmcm9tICcuLi9wYWdlcy9TZXR0aW5nJztcblxuY29uc3QgaG9tZVJvdXRlciA9IHtcbiAgJy9yZWN5Y2xlJzogPE1lbW9UcmFzaCAvPixcbiAgJy9zZXR0aW5nJzogPFNldHRpbmcgLz4sXG4gICcqJzogPE1lbW9zIC8+LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgaG9tZVJvdXRlcjtcbiIsIi8vIGltcG9ydCBhcHBSb3V0ZXIgZnJvbSBcIi4vYXBwUm91dGVyXCI7XG5pbXBvcnQgaG9tZVJvdXRlciBmcm9tICcuL2hvbWVSb3V0ZXInO1xuXG4vLyBqdXN0IGxpa2UgUmVhY3QtUm91dGVyXG5pbnRlcmZhY2UgUm91dGVyIHtcbiAgW2tleTogc3RyaW5nXTogSlNYLkVsZW1lbnQgfCBudWxsO1xuICAnKic6IEpTWC5FbGVtZW50IHwgbnVsbDtcbn1cblxuY29uc3Qgcm91dGVyU3dpdGNoID0gKHJvdXRlcjogUm91dGVyKSA9PiB7XG4gIHJldHVybiAocGF0aG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJvdXRlcikpIHtcbiAgICAgIGlmIChrZXkgPT09IHBhdGhuYW1lKSB7XG4gICAgICAgIHJldHVybiByb3V0ZXJba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvdXRlclsnKiddO1xuICB9O1xufTtcblxuLy8gZXhwb3J0IGNvbnN0IGFwcFJvdXRlclN3aXRjaCA9IHJvdXRlclN3aXRjaChhcHBSb3V0ZXIpO1xuZXhwb3J0IGNvbnN0IGhvbWVSb3V0ZXJTd2l0Y2ggPSByb3V0ZXJTd2l0Y2goaG9tZVJvdXRlcik7XG4iLCJpbXBvcnQge3Nob3dEaWFsb2d9IGZyb20gJy4vRGlhbG9nJztcbmltcG9ydCAnLi4vbGVzcy9hYm91dC1zaXRlLWRpYWxvZy5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xvc2UgZnJvbSAnLi4vaWNvbnMvY2xvc2Uuc3ZnJztcblxuaW50ZXJmYWNlIFByb3BzIGV4dGVuZHMgRGlhbG9nUHJvcHMge31cblxuY29uc3QgQWJvdXRTaXRlRGlhbG9nOiBSZWFjdC5GQzxQcm9wcz4gPSAoe2Rlc3Ryb3l9OiBQcm9wcykgPT4ge1xuICBjb25zdCBoYW5kbGVDbG9zZUJ0bkNsaWNrID0gKCkgPT4ge1xuICAgIGRlc3Ryb3koKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1oZWFkZXItY29udGFpbmVyXCI+XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uLXRleHRcIj7wn6SgPC9zcGFuPkFib3V0IDxiPk9ic2lkaWFuLU1lbW9zPC9iPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGNsb3NlLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZUNsb3NlQnRuQ2xpY2t9PlxuICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2Nsb3NlfSAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJkaWFsb2ctY29udGVudC1jb250YWluZXJcIj5cbiAgICAgICAgSGksIEkgYW0gUXVvcmFmaW5kKEJvbmluYWxsKSwgaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgcHJvamVjdCwgcGxlYXNlIHN1cHBvcnQgbXkgd29yayBhbmQgZW50aHVzaWFzbSBieVxuICAgICAgICBidXlpbmcgbWUgYSBjb2ZmZWUgb24gPGEgaHJlZj1cImh0dHBzOi8vd3d3LmJ1eW1lYWNvZmZlZS5jb20vYm9uaW5hbGxcIj5odHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tL2JvbmluYWxsPC9hPlxuICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly93d3cuYnV5bWVhY29mZmVlLmNvbS9ib25pbmFsbFwiPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIHNyYz17YGh0dHBzOi8vaW1nLmJ1eW1lYWNvZmZlZS5jb20vYnV0dG9uLWFwaS8/dGV4dD1CdXkgbWUgYSBjb2ZmZWUmZW1vamk9JnNsdWc9Ym9uaW5hbGwmYnV0dG9uX2NvbG91cj02NDk1RUQmZm9udF9jb2xvdXI9ZmZmZmZmJmZvbnRfZmFtaWx5PUxhdG8mb3V0bGluZV9jb2xvdXI9MDAwMDAwJmNvZmZlZV9jb2xvdXI9RkZERDAwYH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2E+XG4gICAgICAgIDxiciAvPlxuICAgICAgICA8cD5cbiAgICAgICAgICDln7rkuo4gPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9qdXN0bWVtb3MvbWVtb3NcIj5tZW1vczwvYT4g5byA5rqQ6aG555uu5omA5p6E5bu655qE6aG555uu44CCIE5PVEU6IEJhc2VkIG9ueycgJ31cbiAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL2p1c3RtZW1vcy9tZW1vc1wiPm1lbW9zPC9hPiBwcm9qZWN0IHRvIGJ1aWxkLlxuICAgICAgICA8L3A+XG4gICAgICAgIDxiciAvPlxuICAgICAgICA8cD5cbiAgICAgICAgICDwn4+XIFRoaXMgcHJvamVjdCBpcyB3b3JraW5nIGluIHByb2dyZXNzLCA8YnIgLz4gYW5kIHZlcnkgcGxlYXN1cmUgdG8gd2VsY29tZSB5b3VyeycgJ31cbiAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL1F1b3JhZmluZC9vYnNpZGlhbi1tZW1vcy9pc3N1ZXNcIj5pc3N1ZXM8L2E+IGFuZHsnICd9XG4gICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9RdW9yYWZpbmQvb2JzaWRpYW4tbWVtb3MvcHVsbHNcIj5QdWxsIFJlcXVlc3Q8L2E+LlxuICAgICAgICA8L3A+XG4gICAgICAgIDxociAvPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPlxuICAgICAgICAgIExhc3QgdXBkYXRlZCBvbiA8c3BhbiBjbGFzc05hbWU9XCJwcmUtdGV4dFwiPjIwMjIvMDEvMDQgMjI6NTU6MTU8L3NwYW4+IPCfjolcbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC8+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaG93QWJvdXRTaXRlRGlhbG9nKCk6IHZvaWQge1xuICBzaG93RGlhbG9nKFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZTogJ2Fib3V0LXNpdGUtZGlhbG9nJyxcbiAgICB9LFxuICAgIEFib3V0U2l0ZURpYWxvZyxcbiAgKTtcbn1cbiIsImltcG9ydCB7dXNlRWZmZWN0LCB1c2VSZWZ9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtsb2NhdGlvblNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHNob3dBYm91dFNpdGVEaWFsb2cgZnJvbSAnLi9BYm91dFNpdGVEaWFsb2cnO1xyXG5pbXBvcnQgJy4uL2xlc3MvbWVudS1idG5zLXBvcHVwLmxlc3MnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgZGFpbHlOb3Rlc1NlcnZpY2UgZnJvbSAnLi4vc2VydmljZXMvZGFpbHlOb3Rlc1NlcnZpY2UnO1xyXG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcblxyXG5pbnRlcmZhY2UgUHJvcHMge1xyXG4gIHNob3duU3RhdHVzOiBib29sZWFuO1xyXG4gIHNldFNob3duU3RhdHVzOiAoc3RhdHVzOiBib29sZWFuKSA9PiB2b2lkO1xyXG59XHJcblxyXG5jb25zdCBNZW51QnRuc1BvcHVwOiBSZWFjdC5GQzxQcm9wcz4gPSAocHJvcHM6IFByb3BzKSA9PiB7XHJcbiAgY29uc3Qge3Nob3duU3RhdHVzLCBzZXRTaG93blN0YXR1c30gPSBwcm9wcztcclxuICBjb25zdCB7YXBwfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XHJcblxyXG4gIGNvbnN0IHBvcHVwRWxSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKHNob3duU3RhdHVzKSB7XHJcbiAgICAgIGNvbnN0IGhhbmRsZUNsaWNrT3V0c2lkZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgIGlmICghcG9wdXBFbFJlZi5jdXJyZW50Py5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcclxuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRTaG93blN0YXR1cyhmYWxzZSk7XHJcbiAgICAgIH07XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNsaWNrT3V0c2lkZSwge1xyXG4gICAgICAgIGNhcHR1cmU6IHRydWUsXHJcbiAgICAgICAgb25jZTogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSwgW3Nob3duU3RhdHVzXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZU15QWNjb3VudEJ0bkNsaWNrID0gKCkgPT4ge1xyXG4gICAgLy9AdHMtZXhwZWN0LWVycm9yLCBwcml2YXRlIG1ldGhvZFxyXG4gICAgYXBwLnNldHRpbmcub3BlbigpO1xyXG4gICAgLy9AdHMtZXhwZWN0LWVycm9yLCBwcml2YXRlIG1ldGhvZFxyXG4gICAgYXBwLnNldHRpbmcub3BlblRhYkJ5SWQoJ29ic2lkaWFuLW1lbW9zJyk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlTWVtb3NUcmFzaEJ0bkNsaWNrID0gKCkgPT4ge1xyXG4gICAgbG9jYXRpb25TZXJ2aWNlLnB1c2hIaXN0b3J5KCcvcmVjeWNsZScpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUFib3V0QnRuQ2xpY2sgPSAoKSA9PiB7XHJcbiAgICBzaG93QWJvdXRTaXRlRGlhbG9nKCk7XHJcbiAgfTtcclxuXHJcbiAgLy8gY29uc3QgaGFuZGxlU2lnbk91dEJ0bkNsaWNrID0gYXN5bmMgKCkgPT4ge1xyXG4gIC8vICAgYXdhaXQgdXNlclNlcnZpY2UuZG9TaWduT3V0KCk7XHJcbiAgLy8gfTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPXtgbWVudS1idG5zLXBvcHVwICR7c2hvd25TdGF0dXMgPyAnJyA6ICdoaWRkZW4nfWB9IHJlZj17cG9wdXBFbFJlZn0+XHJcbiAgICAgIDxidXR0b24gY2xhc3NOYW1lPVwiYnRuIGFjdGlvbi1idG5cIiBvbkNsaWNrPXtoYW5kbGVNeUFjY291bnRCdG5DbGlja30+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaWNvblwiPvCfkaQ8L3NwYW4+IHt0KCdTZXR0aW5ncycpfVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gYWN0aW9uLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZU1lbW9zVHJhc2hCdG5DbGlja30+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaWNvblwiPvCfl5HvuI88L3NwYW4+IHt0KCdSZWN5Y2xlIGJpbicpfVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gYWN0aW9uLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZUFib3V0QnRuQ2xpY2t9PlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb25cIj7wn6SgPC9zcGFuPiB7dCgnQWJvdXQgTWUnKX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIHsvKiA8YnV0dG9uIGNsYXNzTmFtZT1cImJ0biBhY3Rpb24tYnRuXCIgb25DbGljaz17aGFuZGxlU2lnbk91dEJ0bkNsaWNrfT5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uXCI+8J+Rizwvc3Bhbj4g6YCA5Ye6XHJcbiAgICAgIDwvYnV0dG9uPiAqL31cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNZW51QnRuc1BvcHVwO1xyXG4iLCJpbXBvcnQge0lNQUdFX1VSTF9SRUcsIE1BUktET1dOX1VSTF9SRUcsIE1BUktET1dOX1dFQl9VUkxfUkVHLCBXSUtJX0lNQUdFX1VSTF9SRUd9IGZyb20gJy4uL2hlbHBlcnMvY29uc3RzJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcbmltcG9ydCB7Zm9ybWF0TWVtb0NvbnRlbnR9IGZyb20gJy4vTWVtbyc7XG5pbXBvcnQgT25seSBmcm9tICcuL2NvbW1vbi9Pbmx5V2hlbic7XG5pbXBvcnQgJy4uL2xlc3MvZGFpbHktbWVtby5sZXNzJztcbmltcG9ydCBSZWFjdCwge3VzZUNvbnRleHQsIHVzZUVmZmVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtURmlsZSwgVmF1bHQsIEFwcH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IGFwcFN0b3JlIGZyb20gJy4uL3N0b3Jlcy9hcHBTdG9yZSc7XG4vLyBpbXBvcnQgYXBwQ29udGV4dCBmcm9tIFwiLi4vc3RvcmVzL2FwcENvbnRleHRcIjtcbi8vIGltcG9ydCBhcHBTdG9yZSBmcm9tIFwiLi4vc3RvcmVzL2FwcFN0b3JlXCI7XG4vLyBpbXBvcnQgeyBkYWlseU5vdGVzU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlc1wiO1xuXG5pbnRlcmZhY2UgRGFpbHlNZW1vIGV4dGVuZHMgRm9ybWF0dGVkTWVtbyB7XG4gIHRpbWVTdHI6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgbWVtbzogTW9kZWwuTWVtbztcbn1cblxuaW50ZXJmYWNlIExpbmtNYXRjaCB7XG4gIGxpbmtUZXh0OiBzdHJpbmc7XG4gIGFsdFRleHQ6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBmaWxlUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGdldFBhdGhPZkltYWdlID0gKHZhdWx0OiBWYXVsdCwgaW1hZ2U6IFRGaWxlKSA9PiB7XG4gIHJldHVybiB2YXVsdC5nZXRSZXNvdXJjZVBhdGgoaW1hZ2UpO1xufTtcblxuY29uc3QgZGV0ZWN0V2lraUludGVybmFsTGluayA9IChsaW5lVGV4dDogc3RyaW5nLCBhcHA6IEFwcCk6IExpbmtNYXRjaCB8IG51bGwgPT4ge1xuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gV0lLSV9JTUFHRV9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bMV07XG4gIGNvbnN0IGludGVybmFsQWx0TmFtZSA9IFdJS0lfSU1BR0VfVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xuICBjb25zdCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoZGVjb2RlVVJJQ29tcG9uZW50KGludGVybmFsRmlsZU5hbWUpLCAnJyk7XG4gIGlmIChmaWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgYWx0VGV4dDogaW50ZXJuYWxBbHROYW1lLFxuICAgICAgcGF0aDogJycsXG4gICAgICBmaWxlUGF0aDogJycsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbWFnZVBhdGggPSBnZXRQYXRoT2ZJbWFnZShhcHAudmF1bHQsIGZpbGUpO1xuICAgIGlmIChpbnRlcm5hbEFsdE5hbWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXG4gICAgICAgIHBhdGg6IGltYWdlUGF0aCxcbiAgICAgICAgZmlsZVBhdGg6IGZpbGUucGF0aCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmtUZXh0OiBpbnRlcm5hbEZpbGVOYW1lLFxuICAgICAgICBhbHRUZXh0OiAnJyxcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxuICAgICAgICBmaWxlUGF0aDogZmlsZS5wYXRoLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IGRldGVjdE1ESW50ZXJuYWxMaW5rID0gKGxpbmVUZXh0OiBzdHJpbmcsIGFwcDogQXBwKTogTGlua01hdGNoIHwgbnVsbCA9PiB7XG4gIC8vIGNvbnN0IHsgbWV0YWRhdGFDYWNoZSx2YXVsdCB9ID0gYXBwU3RvcmUuZ2V0U3RhdGUoKS5kYWlseU5vdGVzU3RhdGUuYXBwO1xuICBjb25zdCBpbnRlcm5hbEZpbGVOYW1lID0gTUFSS0RPV05fVVJMX1JFRy5leGVjKGxpbmVUZXh0KT8uWzVdO1xuICBjb25zdCBpbnRlcm5hbEFsdE5hbWUgPSBNQVJLRE9XTl9VUkxfUkVHLmV4ZWMobGluZVRleHQpPy5bMl07XG4gIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChkZWNvZGVVUklDb21wb25lbnQoaW50ZXJuYWxGaWxlTmFtZSksICcnKTtcbiAgaWYgKGZpbGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICBhbHRUZXh0OiBpbnRlcm5hbEFsdE5hbWUsXG4gICAgICBwYXRoOiAnJyxcbiAgICAgIGZpbGVQYXRoOiAnJyxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGltYWdlUGF0aCA9IGdldFBhdGhPZkltYWdlKGFwcC52YXVsdCwgZmlsZSk7XG4gICAgaWYgKGludGVybmFsQWx0TmFtZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICAgIGFsdFRleHQ6IGludGVybmFsQWx0TmFtZSxcbiAgICAgICAgcGF0aDogaW1hZ2VQYXRoLFxuICAgICAgICBmaWxlUGF0aDogZmlsZS5wYXRoLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGlua1RleHQ6IGludGVybmFsRmlsZU5hbWUsXG4gICAgICAgIGFsdFRleHQ6ICcnLFxuICAgICAgICBwYXRoOiBpbWFnZVBhdGgsXG4gICAgICAgIGZpbGVQYXRoOiBmaWxlLnBhdGgsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgRGFpbHlNZW1vOiBSZWFjdC5GQzxQcm9wcz4gPSAocHJvcHM6IFByb3BzKSA9PiB7XG4gIC8vIGNvbnN0IHBsdWdpbiA9IE1lbW9zUGx1Z2luO1xuICBjb25zdCB7YXBwfSA9IGFwcFN0b3JlLmdldFN0YXRlKCkuZGFpbHlOb3Rlc1N0YXRlO1xuICBjb25zdCB7bWVtbzogcHJvcHNNZW1vfSA9IHByb3BzO1xuICBjb25zdCBtZW1vOiBEYWlseU1lbW8gPSB7XG4gICAgLi4ucHJvcHNNZW1vLFxuICAgIGNyZWF0ZWRBdFN0cjogdXRpbHMuZ2V0RGF0ZVRpbWVTdHJpbmcocHJvcHNNZW1vLmNyZWF0ZWRBdCksXG4gICAgdGltZVN0cjogdXRpbHMuZ2V0VGltZVN0cmluZyhwcm9wc01lbW8uY3JlYXRlZEF0KSxcbiAgfTtcbiAgbGV0IGV4dGVybmFsSW1hZ2VVcmxzID0gW10gYXMgc3RyaW5nW107XG4gIGxldCBpbnRlcm5hbEltYWdlVXJscyA9IFtdO1xuICBsZXQgYWxsTWFya2Rvd25MaW5rOiBzdHJpbmcgfCBhbnlbXSA9IFtdO1xuICBsZXQgYWxsSW50ZXJuYWxMaW5rID0gW10gYXMgYW55W107XG4gIGlmIChJTUFHRV9VUkxfUkVHLnRlc3QobWVtby5jb250ZW50KSkge1xuICAgIGxldCBhbGxFeHRlcm5hbEltYWdlVXJscyA9IFtdIGFzIHN0cmluZ1tdO1xuICAgIGxldCBhbm90aGVyRXh0ZXJuYWxJbWFnZVVybHMgPSBbXSBhcyBzdHJpbmdbXTtcbiAgICBpZiAoTUFSS0RPV05fVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcbiAgICAgIGFsbE1hcmtkb3duTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1VSTF9SRUcpKTtcbiAgICB9XG4gICAgaWYgKFdJS0lfSU1BR0VfVVJMX1JFRy50ZXN0KG1lbW8uY29udGVudCkpIHtcbiAgICAgIGFsbEludGVybmFsTGluayA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKFdJS0lfSU1BR0VfVVJMX1JFRykpO1xuICAgIH1cbiAgICAvLyBjb25zdCBhbGxJbnRlcm5hbExpbmsgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChXSUtJX0lNQUdFX1VSTF9SRUcpKTtcbiAgICBpZiAoTUFSS0RPV05fV0VCX1VSTF9SRUcudGVzdChtZW1vLmNvbnRlbnQpKSB7XG4gICAgICBhbGxFeHRlcm5hbEltYWdlVXJscyA9IEFycmF5LmZyb20obWVtby5jb250ZW50Lm1hdGNoKE1BUktET1dOX1dFQl9VUkxfUkVHKSk7XG4gICAgfVxuICAgIGlmIChhbGxJbnRlcm5hbExpbmsubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEludGVybmFsTGluay5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgb25lID0gYWxsSW50ZXJuYWxMaW5rW2ldO1xuICAgICAgICBpbnRlcm5hbEltYWdlVXJscy5wdXNoKGRldGVjdFdpa2lJbnRlcm5hbExpbmsob25lLCBhcHApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbE1hcmtkb3duTGluay5sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsTWFya2Rvd25MaW5rLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB0d28gPSBhbGxNYXJrZG93bkxpbmtbaV07XG4gICAgICAgIGlmICgvKC4qKWh0dHBbc10/KC4qKS8udGVzdCh0d28pKSB7XG4gICAgICAgICAgYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzLnB1c2goTUFSS0RPV05fVVJMX1JFRy5leGVjKHR3byk/Lls1XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW50ZXJuYWxJbWFnZVVybHMucHVzaChkZXRlY3RNREludGVybmFsTGluayh0d28sIGFwcCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGV4dGVybmFsSW1hZ2VVcmxzID0gYWxsRXh0ZXJuYWxJbWFnZVVybHMuY29uY2F0KGFub3RoZXJFeHRlcm5hbEltYWdlVXJscyk7XG4gICAgLy8gZXh0ZXJuYWxJbWFnZVVybHMgPSBBcnJheS5mcm9tKG1lbW8uY29udGVudC5tYXRjaChJTUFHRV9VUkxfUkVHKSA/PyBbXSk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZGFpbHktbWVtby13cmFwcGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpbWUtd3JhcHBlclwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPnttZW1vLnRpbWVTdHJ9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1lbW8tY29udGVudC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLWNvbnRlbnQtdGV4dFwiIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBmb3JtYXRNZW1vQ29udGVudChtZW1vLmNvbnRlbnQpfX0+PC9kaXY+XG4gICAgICAgIDxPbmx5IHdoZW49e2V4dGVybmFsSW1hZ2VVcmxzLmxlbmd0aCA+IDB9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2VzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAge2V4dGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgPGltZyBrZXk9e2lkeH0gc3JjPXtpbWdVcmx9IHJlZmVycmVyUG9saWN5PVwibm8tcmVmZXJyZXJcIiAvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvT25seT5cbiAgICAgICAgPE9ubHkgd2hlbj17aW50ZXJuYWxJbWFnZVVybHMubGVuZ3RoID4gMH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbWFnZXMtY29udGFpbmVyIGludGVybmFsLWVtYmVkIGltYWdlLWVtYmVkIGlzLWxvYWRlZFwiPlxuICAgICAgICAgICAge2ludGVybmFsSW1hZ2VVcmxzLm1hcCgoaW1nVXJsLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgPGltZyBrZXk9e2lkeH0gc3JjPXtpbWdVcmwucGF0aH0gYWx0PXtpbWdVcmwuYWx0VGV4dH0gcGF0aD17aW1nVXJsLmZpbGVQYXRofSAvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvT25seT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRGFpbHlNZW1vO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7dXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtEQUlMWV9USU1FU1RBTVB9IGZyb20gJy4uLy4uL2hlbHBlcnMvY29uc3RzJztcbmltcG9ydCAnLi4vLi4vbGVzcy9jb21tb24vZGF0ZS1waWNrZXIubGVzcyc7XG5pbXBvcnQgYXJyb3dMZWZ0IGZyb20gJy4uLy4uL2ljb25zL2Fycm93LWxlZnQuc3ZnJztcbmltcG9ydCBhcnJvd1JpZ2h0IGZyb20gJy4uLy4uL2ljb25zL2Fycm93LXJpZ2h0LnN2Zyc7XG5pbXBvcnQge3R9IGZyb20gJy4uLy4uL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xuXG5pbnRlcmZhY2UgRGF0ZVBpY2tlclByb3BzIHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBkYXRlc3RhbXA6IERhdGVTdGFtcDtcbiAgaGFuZGxlRGF0ZVN0YW1wQ2hhbmdlOiAoZGF0YXN0YW1wOiBEYXRlU3RhbXApID0+IHZvaWQ7XG59XG5cbmNvbnN0IERhdGVQaWNrZXI6IFJlYWN0LkZDPERhdGVQaWNrZXJQcm9wcz4gPSAocHJvcHM6IERhdGVQaWNrZXJQcm9wcykgPT4ge1xuICBjb25zdCB7Y2xhc3NOYW1lLCBkYXRlc3RhbXAsIGhhbmRsZURhdGVTdGFtcENoYW5nZX0gPSBwcm9wcztcbiAgY29uc3QgW2N1cnJlbnREYXRlU3RhbXAsIHNldEN1cnJlbnREYXRlU3RhbXBdID0gdXNlU3RhdGU8RGF0ZVN0YW1wPihnZXRNb250aEZpcnN0RGF5RGF0ZVN0YW1wKGRhdGVzdGFtcCkpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0Q3VycmVudERhdGVTdGFtcChnZXRNb250aEZpcnN0RGF5RGF0ZVN0YW1wKGRhdGVzdGFtcCkpO1xuICB9LCBbZGF0ZXN0YW1wXSk7XG5cbiAgY29uc3QgZmlyc3REYXRlID0gbmV3IERhdGUoY3VycmVudERhdGVTdGFtcCk7XG4gIGNvbnN0IGZpcnN0RGF0ZURheSA9IGZpcnN0RGF0ZS5nZXREYXkoKSA9PT0gMCA/IDcgOiBmaXJzdERhdGUuZ2V0RGF5KCk7XG4gIGNvbnN0IGRheUxpc3QgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXJzdERhdGVEYXk7IGkrKykge1xuICAgIGRheUxpc3QucHVzaCh7XG4gICAgICBkYXRlOiAwLFxuICAgICAgZGF0ZXN0YW1wOiBmaXJzdERhdGUuZ2V0VGltZSgpIC0gREFJTFlfVElNRVNUQU1QICogKDcgLSBpKSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBkYXlBbW91bnQgPSBnZXRNb250aERheUFtb3VudChjdXJyZW50RGF0ZVN0YW1wKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gZGF5QW1vdW50OyBpKyspIHtcbiAgICBkYXlMaXN0LnB1c2goe1xuICAgICAgZGF0ZTogaSxcbiAgICAgIGRhdGVzdGFtcDogZmlyc3REYXRlLmdldFRpbWUoKSArIERBSUxZX1RJTUVTVEFNUCAqIChpIC0gMSksXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBoYW5kbGVEYXRlSXRlbUNsaWNrID0gKGRhdGVzdGFtcDogRGF0ZVN0YW1wKSA9PiB7XG4gICAgaGFuZGxlRGF0ZVN0YW1wQ2hhbmdlKGRhdGVzdGFtcCk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlQ2hhbmdlTW9udGhCdG5DbGljayA9IChpOiAtMSB8IDEpID0+IHtcbiAgICBjb25zdCB5ZWFyID0gZmlyc3REYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSBmaXJzdERhdGUuZ2V0TW9udGgoKSArIDE7XG4gICAgbGV0IG5leHREYXRlU3RhbXAgPSAwO1xuICAgIGlmIChtb250aCA9PT0gMSAmJiBpID09PSAtMSkge1xuICAgICAgbmV4dERhdGVTdGFtcCA9IG5ldyBEYXRlKGAke3llYXIgLSAxfS8xMi8xYCkuZ2V0VGltZSgpO1xuICAgIH0gZWxzZSBpZiAobW9udGggPT09IDEyICYmIGkgPT09IDEpIHtcbiAgICAgIG5leHREYXRlU3RhbXAgPSBuZXcgRGF0ZShgJHt5ZWFyICsgMX0vMS8xYCkuZ2V0VGltZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0RGF0ZVN0YW1wID0gbmV3IERhdGUoYCR7eWVhcn0vJHttb250aCArIGl9LzFgKS5nZXRUaW1lKCk7XG4gICAgfVxuICAgIHNldEN1cnJlbnREYXRlU3RhbXAoZ2V0TW9udGhGaXJzdERheURhdGVTdGFtcChuZXh0RGF0ZVN0YW1wKSk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17YGRhdGUtcGlja2VyLXdyYXBwZXIgJHtjbGFzc05hbWV9YH0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRhdGUtcGlja2VyLWhlYWRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG4tdGV4dFwiIG9uQ2xpY2s9eygpID0+IGhhbmRsZUNoYW5nZU1vbnRoQnRuQ2xpY2soLTEpfT5cbiAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXthcnJvd0xlZnR9IC8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHRcIj5cbiAgICAgICAgICB7Zmlyc3REYXRlLmdldEZ1bGxZZWFyKCl9IHt0KCd5ZWFyJyl9IHt0KCdtb250aHNTaG9ydCcpW2ZpcnN0RGF0ZS5nZXRNb250aCgpXSA/PyBmaXJzdERhdGUuZ2V0TW9udGgoKSArIDF9IHt0KCdtb250aCcpID8/ICcnfVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0bi10ZXh0XCIgb25DbGljaz17KCkgPT4gaGFuZGxlQ2hhbmdlTW9udGhCdG5DbGljaygxKX0+XG4gICAgICAgICAgPGltZyBjbGFzc05hbWU9XCJpY29uLWltZ1wiIHNyYz17YXJyb3dSaWdodH0gLz5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRhdGUtcGlja2VyLWRheS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkYXRlLXBpY2tlci1kYXktaGVhZGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZGF5LWl0ZW1cIj57dCgnd2Vla0RheXNTaG9ydCcpWzBdfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJkYXktaXRlbVwiPnt0KCd3ZWVrRGF5c1Nob3J0JylbMV19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImRheS1pdGVtXCI+e3QoJ3dlZWtEYXlzU2hvcnQnKVsyXX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZGF5LWl0ZW1cIj57dCgnd2Vla0RheXNTaG9ydCcpWzNdfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJkYXktaXRlbVwiPnt0KCd3ZWVrRGF5c1Nob3J0JylbNF19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImRheS1pdGVtXCI+e3QoJ3dlZWtEYXlzU2hvcnQnKVs1XX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZGF5LWl0ZW1cIj57dCgnd2Vla0RheXNTaG9ydCcpWzZdfTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAge2RheUxpc3QubWFwKChkKSA9PiB7XG4gICAgICAgICAgaWYgKGQuZGF0ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPHNwYW4ga2V5PXtkLmRhdGVzdGFtcH0gY2xhc3NOYW1lPVwiZGF5LWl0ZW0gbnVsbFwiPlxuICAgICAgICAgICAgICAgIHsnJ31cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBrZXk9e2QuZGF0ZXN0YW1wfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGRheS1pdGVtICR7ZC5kYXRlc3RhbXAgPT09IGRhdGVzdGFtcCA/ICdjdXJyZW50JyA6ICcnfWB9XG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlRGF0ZUl0ZW1DbGljayhkLmRhdGVzdGFtcCl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7ZC5kYXRlfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmZ1bmN0aW9uIGdldE1vbnRoRGF5QW1vdW50KGRhdGVzdGFtcDogRGF0ZVN0YW1wKTogbnVtYmVyIHtcbiAgY29uc3QgZGF0ZVRlbXAgPSBuZXcgRGF0ZShkYXRlc3RhbXApO1xuICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKGAke2RhdGVUZW1wLmdldEZ1bGxZZWFyKCl9LyR7ZGF0ZVRlbXAuZ2V0TW9udGgoKSArIDF9LzFgKTtcbiAgY29uc3QgbmV4dE1vbnRoRGF0ZSA9XG4gICAgY3VycmVudERhdGUuZ2V0TW9udGgoKSA9PT0gMTFcbiAgICAgID8gbmV3IERhdGUoYCR7Y3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSArIDF9LzEvMWApXG4gICAgICA6IG5ldyBEYXRlKGAke2N1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCl9LyR7Y3VycmVudERhdGUuZ2V0TW9udGgoKSArIDJ9LzFgKTtcblxuICByZXR1cm4gKG5leHRNb250aERhdGUuZ2V0VGltZSgpIC0gY3VycmVudERhdGUuZ2V0VGltZSgpKSAvIERBSUxZX1RJTUVTVEFNUDtcbn1cblxuZnVuY3Rpb24gZ2V0TW9udGhGaXJzdERheURhdGVTdGFtcCh0aW1lc3RhbXA6IFRpbWVTdGFtcCk6IERhdGVTdGFtcCB7XG4gIGNvbnN0IGRhdGVUZW1wID0gbmV3IERhdGUodGltZXN0YW1wKTtcbiAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZShgJHtkYXRlVGVtcC5nZXRGdWxsWWVhcigpfS8ke2RhdGVUZW1wLmdldE1vbnRoKCkgKyAxfS8xYCk7XG4gIHJldHVybiBjdXJyZW50RGF0ZS5nZXRUaW1lKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IERhdGVQaWNrZXI7XG4iLCJpbXBvcnQge3VzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge21lbW9TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB0b0ltYWdlIGZyb20gJy4uL2xhYnMvaHRtbDJpbWFnZSc7XHJcbmltcG9ydCB1c2VUb2dnbGUgZnJvbSAnLi4vaG9va3MvdXNlVG9nZ2xlJztcclxuaW1wb3J0IHVzZUxvYWRpbmcgZnJvbSAnLi4vaG9va3MvdXNlTG9hZGluZyc7XHJcbmltcG9ydCB7REFJTFlfVElNRVNUQU1QfSBmcm9tICcuLi9oZWxwZXJzL2NvbnN0cyc7XHJcbmltcG9ydCB1dGlscyBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcclxuaW1wb3J0IHtzaG93RGlhbG9nfSBmcm9tICcuL0RpYWxvZyc7XHJcbmltcG9ydCBzaG93UHJldmlld0ltYWdlRGlhbG9nIGZyb20gJy4vUHJldmlld0ltYWdlRGlhbG9nJztcclxuaW1wb3J0IERhaWx5TWVtbyBmcm9tICcuL0RhaWx5TWVtbyc7XHJcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gJy4vY29tbW9uL0RhdGVQaWNrZXInO1xyXG5pbXBvcnQgJy4uL2xlc3MvZGFpbHktbWVtby1kaWFyeS1kaWFsb2cubGVzcyc7XHJcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBjbG9zZSBmcm9tICcuLi9pY29ucy9jbG9zZS5zdmcnO1xyXG5pbXBvcnQgYXJyb3dMZWZ0IGZyb20gJy4uL2ljb25zL2Fycm93LWxlZnQuc3ZnJztcclxuaW1wb3J0IGFycm93UmlnaHQgZnJvbSAnLi4vaWNvbnMvYXJyb3ctcmlnaHQuc3ZnJztcclxuaW1wb3J0IHNoYXJlIGZyb20gJy4uL2ljb25zL3NoYXJlLnN2Zyc7XHJcbmltcG9ydCB7QXV0b1NhdmVXaGVuT25Nb2JpbGV9IGZyb20gJy4uL21lbW9zJztcclxuaW1wb3J0IHtQbGF0Zm9ybSwgVEZpbGUsIG1vbWVudH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQge2dldEFsbERhaWx5Tm90ZXN9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XHJcbmltcG9ydCBhcHBTdG9yZSBmcm9tICcuLi9zdG9yZXMvYXBwU3RvcmUnO1xyXG5pbXBvcnQge3R9IGZyb20gJy4uL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xyXG5cclxuaW50ZXJmYWNlIFByb3BzIGV4dGVuZHMgRGlhbG9nUHJvcHMge1xyXG4gIGN1cnJlbnREYXRlU3RhbXA6IERhdGVTdGFtcDtcclxufVxyXG5cclxuY29uc3QgRGFpbHlNZW1vRGlhcnlEaWFsb2c6IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wczogUHJvcHMpID0+IHtcclxuICBjb25zdCBsb2FkaW5nU3RhdGUgPSB1c2VMb2FkaW5nKCk7XHJcbiAgY29uc3QgW21lbW9zLCBzZXRNZW1vc10gPSB1c2VTdGF0ZTxNb2RlbC5NZW1vW10+KFtdKTtcclxuICBjb25zdCBbY3VycmVudERhdGVTdGFtcCwgc2V0Q3VycmVudERhdGVTdGFtcF0gPSB1c2VTdGF0ZShcclxuICAgIHV0aWxzLmdldERhdGVTdGFtcEJ5RGF0ZSh1dGlscy5nZXREYXRlU3RyaW5nKHByb3BzLmN1cnJlbnREYXRlU3RhbXApKSxcclxuICApO1xyXG4gIGNvbnN0IFtzaG93RGF0ZVBpY2tlciwgdG9nZ2xlU2hvd0RhdGVQaWNrZXJdID0gdXNlVG9nZ2xlKGZhbHNlKTtcclxuICBjb25zdCBtZW1vc0VsUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcclxuICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKGN1cnJlbnREYXRlU3RhbXApO1xyXG4gIGNvbnN0IHt2YXVsdH0gPSBhcHBTdG9yZS5nZXRTdGF0ZSgpLmRhaWx5Tm90ZXNTdGF0ZS5hcHA7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjb25zdCBzZXREYWlseU1lbW9zID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBkYWlseU1lbW9zID0gbWVtb1NlcnZpY2VcclxuICAgICAgICAuZ2V0U3RhdGUoKVxyXG4gICAgICAgIC5tZW1vcy5maWx0ZXIoXHJcbiAgICAgICAgICAoYSkgPT5cclxuICAgICAgICAgICAgdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGEuY3JlYXRlZEF0KSA+PSBjdXJyZW50RGF0ZVN0YW1wICYmXHJcbiAgICAgICAgICAgIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShhLmNyZWF0ZWRBdCkgPCBjdXJyZW50RGF0ZVN0YW1wICsgREFJTFlfVElNRVNUQU1QLFxyXG4gICAgICAgIClcclxuICAgICAgICAuc29ydCgoYSwgYikgPT4gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGEuY3JlYXRlZEF0KSAtIHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShiLmNyZWF0ZWRBdCkpO1xyXG4gICAgICBzZXRNZW1vcyhkYWlseU1lbW9zKTtcclxuICAgICAgbG9hZGluZ1N0YXRlLnNldEZpbmlzaCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICBzZXREYWlseU1lbW9zKCk7XHJcbiAgfSwgW2N1cnJlbnREYXRlU3RhbXBdKTtcclxuXHJcbiAgY29uc3QgY29udmVydEJhc2U2NFRvQmxvYiA9IChiYXNlNjQ6IHN0cmluZywgdHlwZTogc3RyaW5nKSA9PiB7XHJcbiAgICB2YXIgYnl0ZXMgPSB3aW5kb3cuYXRvYihiYXNlNjQpO1xyXG4gICAgdmFyIGFiID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVzLmxlbmd0aCk7XHJcbiAgICB2YXIgaWEgPSBuZXcgVWludDhBcnJheShhYik7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlhW2ldID0gYnl0ZXMuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgQmxvYihbYWJdLCB7dHlwZTogdHlwZX0pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZVNoYXJlQnRuQ2xpY2sgPSBhc3luYyAoKSA9PiB7XHJcbiAgICB0b2dnbGVTaG93RGF0ZVBpY2tlcihmYWxzZSk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICghbWVtb3NFbFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0b0ltYWdlKG1lbW9zRWxSZWYuY3VycmVudCwge1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmZmZmZmYnLFxyXG4gICAgICAgIHBpeGVsUmF0aW86IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogMixcclxuICAgICAgfSlcclxuICAgICAgICAudGhlbigodXJsKSA9PiB7XHJcbiAgICAgICAgICBpZiAoQXV0b1NhdmVXaGVuT25Nb2JpbGUgJiYgUGxhdGZvcm0uaXNNb2JpbGUpIHtcclxuICAgICAgICAgICAgY29uc3QgbXlCYXNlNjQgPSB1cmwuc3BsaXQoJ2Jhc2U2NCwnKVsxXTtcclxuICAgICAgICAgICAgY29uc3QgYmxvYklucHV0ID0gY29udmVydEJhc2U2NFRvQmxvYihteUJhc2U2NCwgJ2ltYWdlL3BuZycpO1xyXG4gICAgICAgICAgICBibG9iSW5wdXQuYXJyYXlCdWZmZXIoKS50aGVuKGFzeW5jIChidWZmZXIpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgYUZpbGU7XHJcbiAgICAgICAgICAgICAgbGV0IG5ld0ZpbGU7XHJcbiAgICAgICAgICAgICAgY29uc3QgZXh0ID0gJ3BuZyc7XHJcbiAgICAgICAgICAgICAgY29uc3QgZGFpbHlOb3RlcyA9IGdldEFsbERhaWx5Tm90ZXMoKTtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0cmluZyBpbiBkYWlseU5vdGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGFpbHlOb3Rlc1tzdHJpbmddIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgYUZpbGUgPSBkYWlseU5vdGVzW3N0cmluZ107XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoYUZpbGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgbmV3RmlsZSA9IGF3YWl0IHZhdWx0LmNyZWF0ZUJpbmFyeShcclxuICAgICAgICAgICAgICAgICAgLy9AdHMtZXhwZWN0LWVycm9yLCBwcml2YXRlIG1ldGhvZFxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB2YXVsdC5nZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMoXHJcbiAgICAgICAgICAgICAgICAgICAgYFBhc3RlZCBJbWFnZSAke21vbWVudCgpLmZvcm1hdCgnWVlZWU1NRERISG1tc3MnKX1gLFxyXG4gICAgICAgICAgICAgICAgICAgIGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBhRmlsZSxcclxuICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgYnVmZmVyLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc2hvd1ByZXZpZXdJbWFnZURpYWxvZyh1cmwpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgIC8vIGRvIG50aFxyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgMCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlRGF0YVBpY2tlckNoYW5nZSA9IChkYXRlc3RhbXA6IERhdGVTdGFtcCk6IHZvaWQgPT4ge1xyXG4gICAgc2V0Q3VycmVudERhdGVTdGFtcChkYXRlc3RhbXApO1xyXG4gICAgdG9nZ2xlU2hvd0RhdGVQaWNrZXIoZmFsc2UpO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1oZWFkZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoZWFkZXItd3JhcHBlclwiPlxyXG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGl0bGUtdGV4dFwiPnt0KCdEYWlseSBNZW1vcycpfTwvcD5cclxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYnRucy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuLXRleHRcIiBvbkNsaWNrPXsoKSA9PiBzZXRDdXJyZW50RGF0ZVN0YW1wKGN1cnJlbnREYXRlU3RhbXAgLSBEQUlMWV9USU1FU1RBTVApfT5cclxuICAgICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXthcnJvd0xlZnR9IC8+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuLXRleHRcIiBvbkNsaWNrPXsoKSA9PiBzZXRDdXJyZW50RGF0ZVN0YW1wKGN1cnJlbnREYXRlU3RhbXAgKyBEQUlMWV9USU1FU1RBTVApfT5cclxuICAgICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXthcnJvd1JpZ2h0fSAvPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0bi10ZXh0IHNoYXJlLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZVNoYXJlQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e3NoYXJlfSAvPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJ0bi10ZXh0XCIgb25DbGljaz17KCkgPT4gcHJvcHMuZGVzdHJveSgpfT5cclxuICAgICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtjbG9zZX0gLz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRpYWxvZy1jb250ZW50LWNvbnRhaW5lclwiIHJlZj17bWVtb3NFbFJlZn0+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkYXRlLWNhcmQtY29udGFpbmVyXCIgb25DbGljaz17KCkgPT4gdG9nZ2xlU2hvd0RhdGVQaWNrZXIoKX0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInllYXItdGV4dFwiPntjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpfTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkYXRlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vbnRoLXRleHRcIj57dCgnbW9udGhzJylbY3VycmVudERhdGUuZ2V0TW9udGgoKV19PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGF0ZS10ZXh0XCI+e2N1cnJlbnREYXRlLmdldERhdGUoKX08L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkYXktdGV4dFwiPnt0KCd3ZWVrRGF5cycpW2N1cnJlbnREYXRlLmdldERheSgpXX08L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxEYXRlUGlja2VyXHJcbiAgICAgICAgICBjbGFzc05hbWU9e2BkYXRlLXBpY2tlciAke3Nob3dEYXRlUGlja2VyID8gJycgOiAnaGlkZGVuJ31gfVxyXG4gICAgICAgICAgZGF0ZXN0YW1wPXtjdXJyZW50RGF0ZVN0YW1wfVxyXG4gICAgICAgICAgaGFuZGxlRGF0ZVN0YW1wQ2hhbmdlPXtoYW5kbGVEYXRhUGlja2VyQ2hhbmdlfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICAge2xvYWRpbmdTdGF0ZS5pc0xvYWRpbmcgPyAoXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpcC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGlwLXRleHRcIj57dCgnTG9hZGluZy4uLicpfTwvcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICkgOiBtZW1vcy5sZW5ndGggPT09IDAgPyAoXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpcC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGlwLXRleHRcIj57dCgnTm9vb29wIScpfTwvcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICkgOiAoXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImRhaWx5bWVtb3Mtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICB7bWVtb3MubWFwKChtZW1vKSA9PiAoXHJcbiAgICAgICAgICAgICAgPERhaWx5TWVtbyBrZXk9e2Ake21lbW8uaWR9LSR7bWVtby51cGRhdGVkQXR9YH0gbWVtbz17bWVtb30gLz5cclxuICAgICAgICAgICAgKSl9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvPlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaG93RGFpbHlNZW1vRGlhcnlEaWFsb2coZGF0ZXN0YW1wOiBEYXRlU3RhbXAgPSBEYXRlLm5vdygpKTogdm9pZCB7XHJcbiAgc2hvd0RpYWxvZyhcclxuICAgIHtcclxuICAgICAgY2xhc3NOYW1lOiAnZGFpbHktbWVtby1kaWFyeS1kaWFsb2cnLFxyXG4gICAgfSxcclxuICAgIERhaWx5TWVtb0RpYXJ5RGlhbG9nLFxyXG4gICAge2N1cnJlbnREYXRlU3RhbXA6IGRhdGVzdGFtcH0sXHJcbiAgKTtcclxufVxyXG4iLCJpbXBvcnQge3VzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XHJcbmltcG9ydCB7bG9jYXRpb25TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB1dGlscyBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcclxuaW1wb3J0IE1lbnVCdG5zUG9wdXAgZnJvbSAnLi9NZW51QnRuc1BvcHVwJztcclxuaW1wb3J0IHNob3dEYWlseU1lbW9EaWFyeURpYWxvZyBmcm9tICcuL0RhaWx5TWVtb0RpYXJ5RGlhbG9nJztcclxuaW1wb3J0ICcuLi9sZXNzL3VzZXItYmFubmVyLmxlc3MnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge1VzZXJOYW1lfSBmcm9tICcuLi9tZW1vcyc7XHJcbmltcG9ydCBtb3JlIGZyb20gJy4uL2ljb25zL21vcmUuc3ZnJztcclxuaW1wb3J0IHt0fSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuXHJcbmludGVyZmFjZSBQcm9wcyB7fVxyXG5cclxuY29uc3QgVXNlckJhbm5lcjogUmVhY3QuRkM8UHJvcHM+ID0gKCkgPT4ge1xyXG4gIGNvbnN0IHtcclxuICAgIG1lbW9TdGF0ZToge21lbW9zLCB0YWdzfSxcclxuICAgIHVzZXJTdGF0ZToge3VzZXJ9LFxyXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xyXG4gIGNvbnN0IHVzZXJuYW1lID0gdXNlciA/IHVzZXIudXNlcm5hbWUgOiBVc2VyTmFtZTtcclxuICBsZXQgbWVtb3NMZW5ndGg7XHJcbiAgbGV0IGNyZWF0ZWREYXlzO1xyXG4gIGlmIChtZW1vcy5sZW5ndGgpIHtcclxuICAgIG1lbW9zTGVuZ3RoID0gbWVtb3MubGVuZ3RoIC0gMTtcclxuICAgIGNyZWF0ZWREYXlzID0gbWVtb3NcclxuICAgICAgPyBNYXRoLmNlaWwoKERhdGUubm93KCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUobWVtb3NbbWVtb3NMZW5ndGhdLmNyZWF0ZWRBdCkpIC8gMTAwMCAvIDM2MDAgLyAyNCkgKyAxXHJcbiAgICAgIDogMDtcclxuICB9XHJcbiAgLy8gY29uc3QgZmlyc3RNZW1vID0gbWVtb3NbXSBhcyBNb2RlbC5NZW1vO1xyXG5cclxuICBjb25zdCBbc2hvdWxkU2hvd1BvcHVwQnRucywgc2V0U2hvdWxkU2hvd1BvcHVwQnRuc10gPSB1c2VTdGF0ZShmYWxzZSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZVVzZXJuYW1lQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICBsb2NhdGlvblNlcnZpY2UucHVzaEhpc3RvcnkoJy8nKTtcclxuICAgIGxvY2F0aW9uU2VydmljZS5jbGVhclF1ZXJ5KCk7XHJcbiAgfSwgW10pO1xyXG5cclxuICBjb25zdCBoYW5kbGVQb3B1cEJ0bkNsaWNrID0gKCkgPT4ge1xyXG4gICAgY29uc3Qgc2lkZWJhckVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lbW9zLXNpZGViYXItd3JhcHBlcicpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29uc3QgcG9wdXBFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZW51LWJ0bnMtcG9wdXAnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIHBvcHVwRWwuc3R5bGUudG9wID0gNzAgLSBzaWRlYmFyRWwuc2Nyb2xsVG9wICsgJ3B4JztcclxuICAgIHNldFNob3VsZFNob3dQb3B1cEJ0bnModHJ1ZSk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlci1iYW5uZXItY29udGFpbmVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidXNlcmluZm8taGVhZGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInVzZXJuYW1lLXRleHRcIiBvbkNsaWNrPXtoYW5kbGVVc2VybmFtZUNsaWNrfT5cclxuICAgICAgICAgIHt1c2VybmFtZX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYWN0aW9uLWJ0biBtZW51LXBvcHVwLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZVBvcHVwQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgPGltZyBzcmM9e21vcmV9IGNsYXNzTmFtZT1cImljb24taW1nXCIgLz5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPE1lbnVCdG5zUG9wdXAgc2hvd25TdGF0dXM9e3Nob3VsZFNob3dQb3B1cEJ0bnN9IHNldFNob3duU3RhdHVzPXtzZXRTaG91bGRTaG93UG9wdXBCdG5zfSAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzdGF0dXMtdGV4dC1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInN0YXR1cy10ZXh0IG1lbW9zLXRleHRcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImFtb3VudC10ZXh0XCI+e21lbW9zLmxlbmd0aH08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0eXBlLXRleHRcIj5NRU1PPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3RhdHVzLXRleHQgdGFncy10ZXh0XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJhbW91bnQtdGV4dFwiPnt0YWdzLmxlbmd0aH08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0eXBlLXRleHRcIj57dCgnVEFHJyl9PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3RhdHVzLXRleHQgZHVyYXRpb24tdGV4dFwiIG9uQ2xpY2s9eygpID0+IHNob3dEYWlseU1lbW9EaWFyeURpYWxvZygpfT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImFtb3VudC10ZXh0XCI+e2NyZWF0ZWREYXlzID8/IDB9PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidHlwZS10ZXh0XCI+e3QoJ0RBWScpfTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgVXNlckJhbm5lcjtcclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHttZW1vLCB1c2VFZmZlY3QsIHVzZVJlZn0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgdXNlVG9nZ2xlIGZyb20gJy4uLy4uL2hvb2tzL3VzZVRvZ2dsZSc7XHJcbmltcG9ydCAnLi4vLi4vbGVzcy9jb21tb24vc2VsZWN0b3IubGVzcyc7XHJcbi8vIGltcG9ydCBhcnJvd0xlZnQgZnJvbSAnLi4vLi4vaWNvbnMvYXJyb3ctbGVmdC5zdmcnO1xyXG5pbXBvcnQgYXJyb3dSaWdodCBmcm9tICcuLi8uLi9pY29ucy9hcnJvdy1yaWdodC5zdmcnO1xyXG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcblxyXG5pbnRlcmZhY2UgVFZPYmplY3Qge1xyXG4gIHRleHQ6IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUHJvcHMge1xyXG4gIGNsYXNzTmFtZT86IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIGRhdGFTb3VyY2U6IFRWT2JqZWN0W107XHJcbiAgaGFuZGxlVmFsdWVDaGFuZ2VkPzogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmNvbnN0IG51bGxJdGVtID0ge1xyXG4gIHRleHQ6IHQoJ1NFTEVDVCcpLFxyXG4gIHZhbHVlOiAnJyxcclxufTtcclxuXHJcbmNvbnN0IFNlbGVjdG9yOiBSZWFjdC5GQzxQcm9wcz4gPSAocHJvcHM6IFByb3BzKSA9PiB7XHJcbiAgY29uc3Qge2NsYXNzTmFtZSwgZGF0YVNvdXJjZSwgaGFuZGxlVmFsdWVDaGFuZ2VkLCB2YWx1ZX0gPSBwcm9wcztcclxuICBjb25zdCBbc2hvd1NlbGVjdG9yLCB0b2dnbGVTZWxlY3RvclN0YXR1c10gPSB1c2VUb2dnbGUoZmFsc2UpO1xyXG5cclxuICBjb25zdCBzZWxldG9yRWxSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xyXG5cclxuICBsZXQgY3VycmVudEl0ZW0gPSBudWxsSXRlbTtcclxuICBmb3IgKGNvbnN0IGQgb2YgZGF0YVNvdXJjZSkge1xyXG4gICAgaWYgKGQudmFsdWUgPT09IHZhbHVlKSB7XHJcbiAgICAgIGN1cnJlbnRJdGVtID0gZDtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKHNob3dTZWxlY3Rvcikge1xyXG4gICAgICBjb25zdCBoYW5kbGVDbGlja091dHNpZGUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgICBpZiAoIXNlbGV0b3JFbFJlZi5jdXJyZW50Py5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcclxuICAgICAgICAgIHRvZ2dsZVNlbGVjdG9yU3RhdHVzKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNsaWNrT3V0c2lkZSwge1xyXG4gICAgICAgIGNhcHR1cmU6IHRydWUsXHJcbiAgICAgICAgb25jZTogdHJ1ZSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSwgW3Nob3dTZWxlY3Rvcl0pO1xyXG5cclxuICBjb25zdCBoYW5kbGVJdGVtQ2xpY2sgPSAoaXRlbTogVFZPYmplY3QpID0+IHtcclxuICAgIGlmIChoYW5kbGVWYWx1ZUNoYW5nZWQpIHtcclxuICAgICAgaGFuZGxlVmFsdWVDaGFuZ2VkKGl0ZW0udmFsdWUpO1xyXG4gICAgfVxyXG4gICAgdG9nZ2xlU2VsZWN0b3JTdGF0dXMoZmFsc2UpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUN1cnJlbnRWYWx1ZUNsaWNrID0gKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRvZ2dsZVNlbGVjdG9yU3RhdHVzKCk7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPXtgc2VsZWN0b3Itd3JhcHBlciAke2NsYXNzTmFtZSA/PyAnJ31gfSByZWY9e3NlbGV0b3JFbFJlZn0+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtgY3VycmVudC12YWx1ZS1jb250YWluZXIgJHtzaG93U2VsZWN0b3IgPyAnYWN0aXZlJyA6ICcnfWB9IG9uQ2xpY2s9e2hhbmRsZUN1cnJlbnRWYWx1ZUNsaWNrfT5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ2YWx1ZS10ZXh0XCI+e2N1cnJlbnRJdGVtLnRleHR9PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImFycm93LXRleHRcIj5cclxuICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2Fycm93UmlnaHR9IC8+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtgaXRlbXMtd3JhcHBlciAke3Nob3dTZWxlY3RvciA/ICcnIDogJ2hpZGRlbid9YH0+XHJcbiAgICAgICAge2RhdGFTb3VyY2UubWFwKChkKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgaXRlbS1jb250YWluZXIgJHtkLnZhbHVlID09PSB2YWx1ZSA/ICdzZWxlY3RlZCcgOiAnJ31gfVxyXG4gICAgICAgICAgICAgIGtleT17ZC52YWx1ZX1cclxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVJdGVtQ2xpY2soZCk7XHJcbiAgICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAge2QudGV4dH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBtZW1vKFNlbGVjdG9yKTtcclxuIiwiaW1wb3J0IHttZW1vLCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge21lbW9TZXJ2aWNlLCBxdWVyeVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHtjaGVja1Nob3VsZFNob3dNZW1vV2l0aEZpbHRlcnMsIGZpbHRlckNvbnN0cywgZ2V0RGVmYXVsdEZpbHRlciwgcmVsYXRpb25Db25zdHN9IGZyb20gJy4uL2hlbHBlcnMvZmlsdGVyJztcclxuaW1wb3J0IHVzZUxvYWRpbmcgZnJvbSAnLi4vaG9va3MvdXNlTG9hZGluZyc7XHJcbmltcG9ydCB7c2hvd0RpYWxvZ30gZnJvbSAnLi9EaWFsb2cnO1xyXG5pbXBvcnQgU2VsZWN0b3IgZnJvbSAnLi9jb21tb24vU2VsZWN0b3InO1xyXG5pbXBvcnQgJy4uL2xlc3MvY3JlYXRlLXF1ZXJ5LWRpYWxvZy5sZXNzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtOb3RpY2V9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IGNsb3NlIGZyb20gJy4uL2ljb25zL2Nsb3NlLnN2Zyc7XHJcbmltcG9ydCB7IHQgfSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuXHJcbmludGVyZmFjZSBQcm9wcyBleHRlbmRzIERpYWxvZ1Byb3BzIHtcclxuICBxdWVyeUlkPzogc3RyaW5nO1xyXG59XHJcblxyXG5jb25zdCBDcmVhdGVRdWVyeURpYWxvZzogUmVhY3QuRkM8UHJvcHM+ID0gKHByb3BzOiBQcm9wcykgPT4ge1xyXG4gIGNvbnN0IHtkZXN0cm95LCBxdWVyeUlkfSA9IHByb3BzO1xyXG5cclxuICBjb25zdCBbdGl0bGUsIHNldFRpdGxlXSA9IHVzZVN0YXRlPHN0cmluZz4oJycpO1xyXG4gIGNvbnN0IFtmaWx0ZXJzLCBzZXRGaWx0ZXJzXSA9IHVzZVN0YXRlPEZpbHRlcltdPihbXSk7XHJcbiAgY29uc3QgcmVxdWVzdFN0YXRlID0gdXNlTG9hZGluZyhmYWxzZSk7XHJcblxyXG4gIGNvbnN0IHNob3duTWVtb0xlbmd0aCA9IG1lbW9TZXJ2aWNlLmdldFN0YXRlKCkubWVtb3MuZmlsdGVyKChtZW1vKSA9PiB7XHJcbiAgICByZXR1cm4gY2hlY2tTaG91bGRTaG93TWVtb1dpdGhGaWx0ZXJzKG1lbW8sIGZpbHRlcnMpO1xyXG4gIH0pLmxlbmd0aDtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IHF1ZXJ5VGVtcCA9IHF1ZXJ5U2VydmljZS5nZXRRdWVyeUJ5SWQocXVlcnlJZCA/PyAnJyk7XHJcbiAgICBpZiAocXVlcnlUZW1wKSB7XHJcbiAgICAgIHNldFRpdGxlKHF1ZXJ5VGVtcC50aXRsZSk7XHJcbiAgICAgIGNvbnN0IHRlbXAgPSBKU09OLnBhcnNlKHF1ZXJ5VGVtcC5xdWVyeXN0cmluZyk7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRlbXApKSB7XHJcbiAgICAgICAgc2V0RmlsdGVycyh0ZW1wKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sIFtxdWVyeUlkXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZVRpdGxlSW5wdXRDaGFuZ2UgPSAoZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcclxuICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZSBhcyBzdHJpbmc7XHJcbiAgICBzZXRUaXRsZSh0ZXh0KTtcclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVTYXZlQnRuQ2xpY2sgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBpZiAoIXRpdGxlKSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoJ1RJVExFIENBTk5PVCBCRSBOVUxM77yBJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAoZmlsdGVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgbmV3IE5vdGljZSgnRklMVEVSIENBTk5PVCBCRSBOVUxM77yBJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAocXVlcnlJZCkge1xyXG4gICAgICAgIGNvbnN0IGVkaXRlZFF1ZXJ5ID0gYXdhaXQgcXVlcnlTZXJ2aWNlLnVwZGF0ZVF1ZXJ5KHF1ZXJ5SWQsIHRpdGxlLCBKU09OLnN0cmluZ2lmeShmaWx0ZXJzKSk7XHJcbiAgICAgICAgcXVlcnlTZXJ2aWNlLmVkaXRRdWVyeShlZGl0ZWRRdWVyeSk7XHJcbiAgICAgICAgcXVlcnlTZXJ2aWNlLmdldE15QWxsUXVlcmllcygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gYXdhaXQgcXVlcnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KHRpdGxlLCBKU09OLnN0cmluZ2lmeShmaWx0ZXJzKSk7XHJcbiAgICAgICAgcXVlcnlTZXJ2aWNlLnB1c2hRdWVyeShxdWVyeSk7XHJcbiAgICAgICAgcXVlcnlTZXJ2aWNlLmdldE15QWxsUXVlcmllcygpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgICBkZXN0cm95KCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlQWRkRmlsdGVyQmVuQ2xpY2sgPSAoKSA9PiB7XHJcbiAgICBpZiAoZmlsdGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGxhc3RGaWx0ZXIgPSBmaWx0ZXJzW2ZpbHRlcnMubGVuZ3RoIC0gMV07XHJcbiAgICAgIGlmIChsYXN0RmlsdGVyLnZhbHVlLnZhbHVlID09PSAnJykge1xyXG4gICAgICAgIG5ldyBOb3RpY2UoJ+WFiOWujOWWhOS4iuS4gOS4qui/h+a7pOWZqOWQpycpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldEZpbHRlcnMoWy4uLmZpbHRlcnMsIGdldERlZmF1bHRGaWx0ZXIoKV0pO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZUZpbHRlckNoYW5nZSA9IHVzZUNhbGxiYWNrKChpbmRleDogbnVtYmVyLCBmaWx0ZXI6IEZpbHRlcikgPT4ge1xyXG4gICAgc2V0RmlsdGVycygoZmlsdGVycykgPT4ge1xyXG4gICAgICBjb25zdCB0ZW1wID0gWy4uLmZpbHRlcnNdO1xyXG4gICAgICB0ZW1wW2luZGV4XSA9IGZpbHRlcjtcclxuICAgICAgcmV0dXJuIHRlbXA7XHJcbiAgICB9KTtcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZUZpbHRlclJlbW92ZSA9IHVzZUNhbGxiYWNrKChpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICBzZXRGaWx0ZXJzKChmaWx0ZXJzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRlbXAgPSBmaWx0ZXJzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xyXG4gICAgICByZXR1cm4gdGVtcDtcclxuICAgIH0pO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDw+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGlhbG9nLWhlYWRlci1jb250YWluZXJcIj5cclxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0aXRsZS10ZXh0XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uLXRleHRcIj7wn5SWPC9zcGFuPlxyXG4gICAgICAgICAge3F1ZXJ5SWQgPyB0KCdFRElUIFFVRVJZJykgOiB0KCdDUkVBVEUgUVVFUlknKX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJidG4gY2xvc2UtYnRuXCIgb25DbGljaz17ZGVzdHJveX0+XHJcbiAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtjbG9zZX0gLz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZGlhbG9nLWNvbnRlbnQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmb3JtLWl0ZW0tY29udGFpbmVyIGlucHV0LWZvcm0tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPnt0KCdUSVRMRScpfTwvc3Bhbj5cclxuICAgICAgICAgIDxpbnB1dCBjbGFzc05hbWU9XCJ0aXRsZS1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgdmFsdWU9e3RpdGxlfSBvbkNoYW5nZT17aGFuZGxlVGl0bGVJbnB1dENoYW5nZX0gLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0taXRlbS1jb250YWluZXIgZmlsdGVyLWZvcm0tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJub3JtYWwtdGV4dFwiPnt0KCdGSUxURVInKX08L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpbHRlcnMtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICB7ZmlsdGVycy5tYXAoKGYsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIDxNZW1vRmlsdGVySW5wdXRlclxyXG4gICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxyXG4gICAgICAgICAgICAgICAgICBpbmRleD17aW5kZXh9XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlcj17Zn1cclxuICAgICAgICAgICAgICAgICAgaGFuZGxlRmlsdGVyQ2hhbmdlPXtoYW5kbGVGaWx0ZXJDaGFuZ2V9XHJcbiAgICAgICAgICAgICAgICAgIGhhbmRsZUZpbHRlclJlbW92ZT17aGFuZGxlRmlsdGVyUmVtb3ZlfVxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjcmVhdGUtZmlsdGVyLWJ0blwiIG9uQ2xpY2s9e2hhbmRsZUFkZEZpbHRlckJlbkNsaWNrfT5cclxuICAgICAgICAgICAgICB7dCgnQUREIEZJTFRFUiBURVJNUycpfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJkaWFsb2ctZm9vdGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJidG5zLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtgdGlwLXRleHQgJHtmaWx0ZXJzLmxlbmd0aCA9PT0gMCAmJiAnaGlkZGVuJ31gfT5cclxuICAgICAgICAgICAge3QoJ01BVENIJyl9IE1lbW8gPHN0cm9uZz57c2hvd25NZW1vTGVuZ3RofTwvc3Ryb25nPiB7dCgnVElNRVMnKX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3NOYW1lPXtgYnRuIHNhdmUtYnRuICR7cmVxdWVzdFN0YXRlLmlzTG9hZGluZyA/ICdyZXF1ZXN0aW5nJyA6ICcnfWB9IG9uQ2xpY2s9e2hhbmRsZVNhdmVCdG5DbGlja30+XHJcbiAgICAgICAgICAgIFNBVkVcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvPlxyXG4gICk7XHJcbn07XHJcblxyXG5pbnRlcmZhY2UgTWVtb0ZpbHRlcklucHV0ZXJQcm9wcyB7XHJcbiAgaW5kZXg6IG51bWJlcjtcclxuICBmaWx0ZXI6IEZpbHRlcjtcclxuICBoYW5kbGVGaWx0ZXJDaGFuZ2U6IChpbmRleDogbnVtYmVyLCBmaWx0ZXI6IEZpbHRlcikgPT4gdm9pZDtcclxuICBoYW5kbGVGaWx0ZXJSZW1vdmU6IChpbmRleDogbnVtYmVyKSA9PiB2b2lkO1xyXG59XHJcblxyXG5jb25zdCBGaWx0ZXJJbnB1dGVyOiBSZWFjdC5GQzxNZW1vRmlsdGVySW5wdXRlclByb3BzPiA9IChwcm9wczogTWVtb0ZpbHRlcklucHV0ZXJQcm9wcykgPT4ge1xyXG4gIGNvbnN0IHtpbmRleCwgZmlsdGVyLCBoYW5kbGVGaWx0ZXJDaGFuZ2UsIGhhbmRsZUZpbHRlclJlbW92ZX0gPSBwcm9wcztcclxuICBjb25zdCB7dHlwZX0gPSBmaWx0ZXI7XHJcbiAgY29uc3QgW2lucHV0RWxlbWVudHMsIHNldElucHV0RWxlbWVudHNdID0gdXNlU3RhdGU8SlNYLkVsZW1lbnQ+KDw+PC8+KTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGxldCBvcGVyYXRvckVsZW1lbnQgPSA8PjwvPjtcclxuICAgIGlmIChPYmplY3Qua2V5cyhmaWx0ZXJDb25zdHMpLmluY2x1ZGVzKHR5cGUpKSB7XHJcbiAgICAgIG9wZXJhdG9yRWxlbWVudCA9IChcclxuICAgICAgICA8U2VsZWN0b3JcclxuICAgICAgICAgIGNsYXNzTmFtZT1cIm9wZXJhdG9yLXNlbGVjdG9yXCJcclxuICAgICAgICAgIGRhdGFTb3VyY2U9e09iamVjdC52YWx1ZXMoZmlsdGVyQ29uc3RzW3R5cGUgYXMgRmlsdGVyVHlwZV0ub3BlcmF0b3JzKX1cclxuICAgICAgICAgIHZhbHVlPXtmaWx0ZXIudmFsdWUub3BlcmF0b3J9XHJcbiAgICAgICAgICBoYW5kbGVWYWx1ZUNoYW5nZWQ9e2hhbmRsZU9wZXJhdG9yQ2hhbmdlfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHZhbHVlRWxlbWVudCA9IDw+PC8+O1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ1RZUEUnOiB7XHJcbiAgICAgICAgdmFsdWVFbGVtZW50ID0gKFxyXG4gICAgICAgICAgPFNlbGVjdG9yXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInZhbHVlLXNlbGVjdG9yXCJcclxuICAgICAgICAgICAgZGF0YVNvdXJjZT17ZmlsdGVyQ29uc3RzWydUWVBFJ10udmFsdWVzfVxyXG4gICAgICAgICAgICB2YWx1ZT17ZmlsdGVyLnZhbHVlLnZhbHVlfVxyXG4gICAgICAgICAgICBoYW5kbGVWYWx1ZUNoYW5nZWQ9e2hhbmRsZVZhbHVlQ2hhbmdlfVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ1RBRyc6IHtcclxuICAgICAgICB2YWx1ZUVsZW1lbnQgPSAoXHJcbiAgICAgICAgICA8U2VsZWN0b3JcclxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidmFsdWUtc2VsZWN0b3JcIlxyXG4gICAgICAgICAgICBkYXRhU291cmNlPXttZW1vU2VydmljZVxyXG4gICAgICAgICAgICAgIC5nZXRTdGF0ZSgpXHJcbiAgICAgICAgICAgICAgLnRhZ3Muc29ydCgpXHJcbiAgICAgICAgICAgICAgLm1hcCgodCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHt0ZXh0OiB0LCB2YWx1ZTogdH07XHJcbiAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgIHZhbHVlPXtmaWx0ZXIudmFsdWUudmFsdWV9XHJcbiAgICAgICAgICAgIGhhbmRsZVZhbHVlQ2hhbmdlZD17aGFuZGxlVmFsdWVDaGFuZ2V9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnVEVYVCc6IHtcclxuICAgICAgICB2YWx1ZUVsZW1lbnQgPSAoXHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ2YWx1ZS1pbnB1dGVyXCJcclxuICAgICAgICAgICAgdmFsdWU9e2ZpbHRlci52YWx1ZS52YWx1ZX1cclxuICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIGhhbmRsZVZhbHVlQ2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRJbnB1dEVsZW1lbnRzKFxyXG4gICAgICA8PlxyXG4gICAgICAgIHtvcGVyYXRvckVsZW1lbnR9XHJcbiAgICAgICAge3ZhbHVlRWxlbWVudH1cclxuICAgICAgPC8+LFxyXG4gICAgKTtcclxuICB9LCBbdHlwZSwgZmlsdGVyXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZVJlbGF0aW9uQ2hhbmdlID0gdXNlQ2FsbGJhY2soXHJcbiAgICAodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAoWydBTkQnLCAnT1InXS5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgICBoYW5kbGVGaWx0ZXJDaGFuZ2UoaW5kZXgsIHtcclxuICAgICAgICAgIC4uLmZpbHRlcixcclxuICAgICAgICAgIHJlbGF0aW9uOiB2YWx1ZSBhcyBNZW1vRmlsdGVyUmFsYXRpb24sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBbZmlsdGVyXSxcclxuICApO1xyXG5cclxuICBjb25zdCBoYW5kbGVUeXBlQ2hhbmdlID0gdXNlQ2FsbGJhY2soXHJcbiAgICAodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAoZmlsdGVyLnR5cGUgIT09IHZhbHVlKSB7XHJcbiAgICAgICAgY29uc3Qgb3BzID0gT2JqZWN0LnZhbHVlcyhmaWx0ZXJDb25zdHNbdmFsdWUgYXMgRmlsdGVyVHlwZV0ub3BlcmF0b3JzKTtcclxuICAgICAgICBoYW5kbGVGaWx0ZXJDaGFuZ2UoaW5kZXgsIHtcclxuICAgICAgICAgIC4uLmZpbHRlcixcclxuICAgICAgICAgIHR5cGU6IHZhbHVlIGFzIEZpbHRlclR5cGUsXHJcbiAgICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgICBvcGVyYXRvcjogb3BzWzBdLnZhbHVlLFxyXG4gICAgICAgICAgICB2YWx1ZTogJycsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgW2ZpbHRlcl0sXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlT3BlcmF0b3JDaGFuZ2UgPSB1c2VDYWxsYmFjayhcclxuICAgICh2YWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGhhbmRsZUZpbHRlckNoYW5nZShpbmRleCwge1xyXG4gICAgICAgIC4uLmZpbHRlcixcclxuICAgICAgICB2YWx1ZToge1xyXG4gICAgICAgICAgLi4uZmlsdGVyLnZhbHVlLFxyXG4gICAgICAgICAgb3BlcmF0b3I6IHZhbHVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIFtmaWx0ZXJdLFxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZVZhbHVlQ2hhbmdlID0gdXNlQ2FsbGJhY2soXHJcbiAgICAodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICBoYW5kbGVGaWx0ZXJDaGFuZ2UoaW5kZXgsIHtcclxuICAgICAgICAuLi5maWx0ZXIsXHJcbiAgICAgICAgdmFsdWU6IHtcclxuICAgICAgICAgIC4uLmZpbHRlci52YWx1ZSxcclxuICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIFtmaWx0ZXJdLFxyXG4gICk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZVJlbW92ZUJ0bkNsaWNrID0gKCkgPT4ge1xyXG4gICAgaGFuZGxlRmlsdGVyUmVtb3ZlKGluZGV4KTtcclxuICB9O1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtZW1vLWZpbHRlci1pbnB1dC13cmFwcGVyXCI+XHJcbiAgICAgIHtpbmRleCA+IDAgPyAoXHJcbiAgICAgICAgPFNlbGVjdG9yXHJcbiAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGlvbi1zZWxlY3RvclwiXHJcbiAgICAgICAgICBkYXRhU291cmNlPXtyZWxhdGlvbkNvbnN0c31cclxuICAgICAgICAgIHZhbHVlPXtmaWx0ZXIucmVsYXRpb259XHJcbiAgICAgICAgICBoYW5kbGVWYWx1ZUNoYW5nZWQ9e2hhbmRsZVJlbGF0aW9uQ2hhbmdlfVxyXG4gICAgICAgIC8+XHJcbiAgICAgICkgOiBudWxsfVxyXG4gICAgICA8U2VsZWN0b3JcclxuICAgICAgICBjbGFzc05hbWU9XCJ0eXBlLXNlbGVjdG9yXCJcclxuICAgICAgICBkYXRhU291cmNlPXtPYmplY3QudmFsdWVzKGZpbHRlckNvbnN0cyl9XHJcbiAgICAgICAgdmFsdWU9e2ZpbHRlci50eXBlfVxyXG4gICAgICAgIGhhbmRsZVZhbHVlQ2hhbmdlZD17aGFuZGxlVHlwZUNoYW5nZX1cclxuICAgICAgLz5cclxuXHJcbiAgICAgIHtpbnB1dEVsZW1lbnRzfVxyXG4gICAgICA8aW1nIGNsYXNzTmFtZT1cInJlbW92ZS1idG5cIiBzcmM9e2Nsb3NlfSBvbkNsaWNrPXtoYW5kbGVSZW1vdmVCdG5DbGlja30gLz5cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn07XHJcblxyXG5jb25zdCBNZW1vRmlsdGVySW5wdXRlcjogUmVhY3QuRkM8TWVtb0ZpbHRlcklucHV0ZXJQcm9wcz4gPSBtZW1vKEZpbHRlcklucHV0ZXIpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hvd0NyZWF0ZVF1ZXJ5RGlhbG9nKHF1ZXJ5SWQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuICBzaG93RGlhbG9nKFxyXG4gICAge1xyXG4gICAgICBjbGFzc05hbWU6ICdjcmVhdGUtcXVlcnktZGlhbG9nJyxcclxuICAgIH0sXHJcbiAgICBDcmVhdGVRdWVyeURpYWxvZyxcclxuICAgIHtxdWVyeUlkfSxcclxuICApO1xyXG59XHJcbiIsImltcG9ydCB7dXNlQ29udGV4dCwgdXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBhcHBDb250ZXh0IGZyb20gJy4uL3N0b3Jlcy9hcHBDb250ZXh0JztcclxuaW1wb3J0IHVzZVRvZ2dsZSBmcm9tICcuLi9ob29rcy91c2VUb2dnbGUnO1xyXG5pbXBvcnQgdXNlTG9hZGluZyBmcm9tICcuLi9ob29rcy91c2VMb2FkaW5nJztcclxuaW1wb3J0IE9ubHkgZnJvbSAnLi9jb21tb24vT25seVdoZW4nO1xyXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vaGVscGVycy91dGlscyc7XHJcbmltcG9ydCB7bG9jYXRpb25TZXJ2aWNlLCBxdWVyeVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHNob3dDcmVhdGVRdWVyeURpYWxvZyBmcm9tICcuL0NyZWF0ZVF1ZXJ5RGlhbG9nJztcclxuaW1wb3J0ICcuLi9sZXNzL3F1ZXJ5LWxpc3QubGVzcyc7XHJcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBtb3JlIGZyb20gJy4uL2ljb25zL21vcmUuc3ZnJztcclxuaW1wb3J0IG1vcmVXaGl0ZSBmcm9tICcuLi9pY29ucy9tb3JlLXdoaXRlLnN2Zyc7XHJcbmltcG9ydCB7Tm90aWNlfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7IHQgfSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuXHJcbmludGVyZmFjZSBQcm9wcyB7fVxyXG5cclxuY29uc3QgUXVlcnlMaXN0OiBSZWFjdC5GQzxQcm9wcz4gPSAoKSA9PiB7XHJcbiAgY29uc3Qge1xyXG4gICAgcXVlcnlTdGF0ZToge3F1ZXJpZXN9LFxyXG4gICAgbG9jYXRpb25TdGF0ZToge1xyXG4gICAgICBxdWVyeToge2ZpbHRlcn0sXHJcbiAgICB9LFxyXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xyXG4gIGNvbnN0IGxvYWRpbmdTdGF0ZSA9IHVzZUxvYWRpbmcoKTtcclxuICBjb25zdCBzb3J0ZWRRdWVyaWVzID0gcXVlcmllc1xyXG4gICAgLnNvcnQoKGEsIGIpID0+IHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShiLmNyZWF0ZWRBdCkgLSB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoYS5jcmVhdGVkQXQpKVxyXG4gICAgLnNvcnQoKGEsIGIpID0+IHV0aWxzLmdldFRpbWVTdGFtcEJ5RGF0ZShiLnBpbm5lZEF0ID8/IDApIC0gdXRpbHMuZ2V0VGltZVN0YW1wQnlEYXRlKGEucGlubmVkQXQgPz8gMCkpO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgcXVlcnlTZXJ2aWNlXHJcbiAgICAgIC5nZXRNeUFsbFF1ZXJpZXMoKVxyXG4gICAgICAuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgIC8vIGRvIG50aFxyXG4gICAgICB9KVxyXG4gICAgICAuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgbG9hZGluZ1N0YXRlLnNldEZpbmlzaCgpO1xyXG4gICAgICB9KTtcclxuICB9LCBbXSk7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInF1ZXJpZXMtd3JhcHBlclwiPlxyXG4gICAgICA8cCBjbGFzc05hbWU9XCJ0aXRsZS10ZXh0XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibm9ybWFsLXRleHRcIj57dCgnUVVFUlknKX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17KCkgPT4gc2hvd0NyZWF0ZVF1ZXJ5RGlhbG9nKCl9PlxyXG4gICAgICAgICAgK1xyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9wPlxyXG4gICAgICA8T25seSB3aGVuPXtsb2FkaW5nU3RhdGUuaXNTdWNjZWVkICYmIHNvcnRlZFF1ZXJpZXMubGVuZ3RoID09PSAwfT5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNyZWF0ZS1xdWVyeS1idG4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG5cIiBvbkNsaWNrPXsoKSA9PiBzaG93Q3JlYXRlUXVlcnlEaWFsb2coKX0+XHJcbiAgICAgICAgICAgIHt0KCdDUkVBVEUgRklMVEVSJyl9XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvT25seT5cclxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJxdWVyaWVzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIHtzb3J0ZWRRdWVyaWVzLm1hcCgocSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIDxRdWVyeUl0ZW1Db250YWluZXIga2V5PXtxLmlkfSBxdWVyeT17cX0gaXNBY3RpdmU9e3EuaWQgPT09IGZpbHRlcn0gLz47XHJcbiAgICAgICAgfSl9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufTtcclxuXHJcbmludGVyZmFjZSBRdWVyeUl0ZW1Db250YWluZXJQcm9wcyB7XHJcbiAgcXVlcnk6IE1vZGVsLlF1ZXJ5O1xyXG4gIGlzQWN0aXZlOiBib29sZWFuO1xyXG59XHJcblxyXG5jb25zdCBRdWVyeUl0ZW1Db250YWluZXI6IFJlYWN0LkZDPFF1ZXJ5SXRlbUNvbnRhaW5lclByb3BzPiA9IChwcm9wczogUXVlcnlJdGVtQ29udGFpbmVyUHJvcHMpID0+IHtcclxuICBjb25zdCB7cXVlcnksIGlzQWN0aXZlfSA9IHByb3BzO1xyXG4gIGNvbnN0IFtzaG93QWN0aW9uQnRucywgdG9nZ2xlU2hvd0FjdGlvbkJ0bnNdID0gdXNlVG9nZ2xlKGZhbHNlKTtcclxuICBjb25zdCBbc2hvd0NvbmZpcm1EZWxldGVCdG4sIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG5dID0gdXNlVG9nZ2xlKGZhbHNlKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlUXVlcnlDbGljayA9ICgpID0+IHtcclxuICAgIGlmIChpc0FjdGl2ZSkge1xyXG4gICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0TWVtb0ZpbHRlcignJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBpZiAoIVtcIi9cIiwgXCIvcmVjeWNsZVwiXS5pbmNsdWRlcyhsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5wYXRobmFtZSkpIHtcclxuICAgICAgLy8gICBsb2NhdGlvblNlcnZpY2Uuc2V0UGF0aG5hbWUoXCIvXCIpO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRNZW1vRmlsdGVyKHF1ZXJ5LmlkKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVTaG93QWN0aW9uQnRuQ2xpY2sgPSAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdG9nZ2xlU2hvd0FjdGlvbkJ0bnMoKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVBY3Rpb25CdG5Db250YWluZXJNb3VzZUxlYXZlID0gKCkgPT4ge1xyXG4gICAgdG9nZ2xlU2hvd0FjdGlvbkJ0bnMoZmFsc2UpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZURlbGV0ZU1lbW9DbGljayA9IGFzeW5jIChldmVudDogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgaWYgKHNob3dDb25maXJtRGVsZXRlQnRuKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgcXVlcnlTZXJ2aWNlLmRlbGV0ZVF1ZXJ5KHF1ZXJ5LmlkKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG4oKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCBoYW5kbGVFZGl0UXVlcnlCdG5DbGljayA9IChldmVudDogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBzaG93Q3JlYXRlUXVlcnlEaWFsb2cocXVlcnkuaWQpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhhbmRsZVBpblF1ZXJ5QnRuQ2xpY2sgPSBhc3luYyAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChxdWVyeS5waW5uZWRBdCkge1xyXG4gICAgICAgIGF3YWl0IHF1ZXJ5U2VydmljZS51bnBpblF1ZXJ5KHF1ZXJ5LmlkKTtcclxuICAgICAgICBxdWVyeVNlcnZpY2UuZWRpdFF1ZXJ5KHtcclxuICAgICAgICAgIC4uLnF1ZXJ5LFxyXG4gICAgICAgICAgcGlubmVkQXQ6ICcnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IHF1ZXJ5U2VydmljZS5waW5RdWVyeShxdWVyeS5pZCk7XHJcbiAgICAgICAgcXVlcnlTZXJ2aWNlLmVkaXRRdWVyeSh7XHJcbiAgICAgICAgICAuLi5xdWVyeSxcclxuICAgICAgICAgIHBpbm5lZEF0OiB1dGlscy5nZXREYXRlVGltZVN0cmluZyhEYXRlLm5vdygpKSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgLy8gZG8gbnRoXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlRGVsZXRlQnRuTW91c2VMZWF2ZSA9ICgpID0+IHtcclxuICAgIHRvZ2dsZUNvbmZpcm1EZWxldGVCdG4oZmFsc2UpO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17YHF1ZXJ5LWl0ZW0tY29udGFpbmVyICR7aXNBY3RpdmUgPyAnYWN0aXZlJyA6ICcnfWB9IG9uQ2xpY2s9e2hhbmRsZVF1ZXJ5Q2xpY2t9PlxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicXVlcnktdGV4dC1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb24tdGV4dFwiPiM8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJxdWVyeS10ZXh0XCI+e3F1ZXJ5LnRpdGxlfTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ0bnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJhY3Rpb24tYnRuIHRvZ2dsZS1idG5cIiBvbkNsaWNrPXtoYW5kbGVTaG93QWN0aW9uQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICA8aW1nIGNsYXNzTmFtZT1cImljb24taW1nXCIgc3JjPXtpc0FjdGl2ZSA/IG1vcmVXaGl0ZSA6IG1vcmV9IC8+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17YGFjdGlvbi1idG5zLXdyYXBwZXIgJHtzaG93QWN0aW9uQnRucyA/ICcnIDogJ2hpZGRlbid9YH1cclxuICAgICAgICAgICAgb25Nb3VzZUxlYXZlPXtoYW5kbGVBY3Rpb25CdG5Db250YWluZXJNb3VzZUxlYXZlfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhY3Rpb24tYnRucy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJidG5cIiBvbkNsaWNrPXtoYW5kbGVQaW5RdWVyeUJ0bkNsaWNrfT5cclxuICAgICAgICAgICAgICAgIHtxdWVyeS5waW5uZWRBdCA/IHQoJ1VOUElOJykgOiB0KCdQSU4nKX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnRuXCIgb25DbGljaz17aGFuZGxlRWRpdFF1ZXJ5QnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAge3QoJ0VESVQnKX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGJ0biBkZWxldGUtYnRuICR7c2hvd0NvbmZpcm1EZWxldGVCdG4gPyAnZmluYWwtY29uZmlybScgOiAnJ31gfVxyXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlRGVsZXRlTWVtb0NsaWNrfVxyXG4gICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlPXtoYW5kbGVEZWxldGVCdG5Nb3VzZUxlYXZlfT5cclxuICAgICAgICAgICAgICAgIHtzaG93Q29uZmlybURlbGV0ZUJ0biA/IHQoJ0NPTkZJUk3vvIEnKSA6IHQoJ0RFTEVURScpfVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8Lz5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgUXVlcnlMaXN0O1xyXG4iLCJpbXBvcnQge3VzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi4vc3RvcmVzL2FwcENvbnRleHQnO1xyXG5pbXBvcnQge2xvY2F0aW9uU2VydmljZSwgbWVtb1NlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHVzZVRvZ2dsZSBmcm9tICcuLi9ob29rcy91c2VUb2dnbGUnO1xyXG5pbXBvcnQgT25seSBmcm9tICcuL2NvbW1vbi9Pbmx5V2hlbic7XHJcbmltcG9ydCB1dGlscyBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcclxuaW1wb3J0ICcuLi9sZXNzL3RhZy1saXN0Lmxlc3MnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgYXJyb3dSaWdodCBmcm9tICcuLi9pY29ucy9hcnJvdy1yaWdodC5zdmcnO1xyXG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcblxyXG5pbnRlcmZhY2UgVGFnIHtcclxuICBrZXk6IHN0cmluZztcclxuICB0ZXh0OiBzdHJpbmc7XHJcbiAgc3ViVGFnczogVGFnW107XHJcbn1cclxuXHJcbmludGVyZmFjZSBQcm9wcyB7fVxyXG5cclxuY29uc3QgVGFnTGlzdDogUmVhY3QuRkM8UHJvcHM+ID0gKCkgPT4ge1xyXG4gIGNvbnN0IHtcclxuICAgIGxvY2F0aW9uU3RhdGU6IHtcclxuICAgICAgcXVlcnk6IHt0YWc6IHRhZ1F1ZXJ5fSxcclxuICAgIH0sXHJcbiAgICBtZW1vU3RhdGU6IHt0YWdzOiB0YWdzVGV4dCwgbWVtb3N9LFxyXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xyXG4gIGNvbnN0IFt0YWdzLCBzZXRUYWdzXSA9IHVzZVN0YXRlPFRhZ1tdPihbXSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBtZW1vU2VydmljZS51cGRhdGVUYWdzU3RhdGUoKTtcclxuICB9LCBbbWVtb3NdKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSBBcnJheS5mcm9tKHRhZ3NUZXh0KS5zb3J0KCk7XHJcbiAgICBjb25zdCByb290OiBLVk9iamVjdDxhbnk+ID0ge1xyXG4gICAgICBzdWJUYWdzOiBbXSxcclxuICAgIH07XHJcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBzb3J0ZWRUYWdzKSB7XHJcbiAgICAgIGNvbnN0IHN1YnRhZ3MgPSB0YWcuc3BsaXQoJy8nKTtcclxuICAgICAgbGV0IHRlbXBPYmogPSByb290O1xyXG4gICAgICBsZXQgdGFnVGV4dCA9ICcnO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YnRhZ3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBzdWJ0YWdzW2ldO1xyXG4gICAgICAgIGlmIChpID09PSAwKSB7XHJcbiAgICAgICAgICB0YWdUZXh0ICs9IGtleTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGFnVGV4dCArPSAnLycgKyBrZXk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgb2JqID0gbnVsbDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRlbXBPYmouc3ViVGFncykge1xyXG4gICAgICAgICAgaWYgKHQudGV4dCA9PT0gdGFnVGV4dCkge1xyXG4gICAgICAgICAgICBvYmogPSB0O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghb2JqKSB7XHJcbiAgICAgICAgICBvYmogPSB7XHJcbiAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgdGV4dDogdGFnVGV4dCxcclxuICAgICAgICAgICAgc3ViVGFnczogW10sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGVtcE9iai5zdWJUYWdzLnB1c2gob2JqKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRlbXBPYmogPSBvYmo7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHNldFRhZ3Mocm9vdC5zdWJUYWdzIGFzIFRhZ1tdKTtcclxuICB9LCBbdGFnc1RleHRdKTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwidGFncy13cmFwcGVyXCI+XHJcbiAgICAgIDxwIGNsYXNzTmFtZT1cInRpdGxlLXRleHRcIj57dCgnRnJlcXVlbnRseSBVc2VkIFRhZ3MnKX08L3A+XHJcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGFncy1jb250YWluZXJcIj5cclxuICAgICAgICB7dGFncy5tYXAoKHQsIGlkeCkgPT4gKFxyXG4gICAgICAgICAgPFRhZ0l0ZW1Db250YWluZXIga2V5PXt0LnRleHQgKyAnLScgKyBpZHh9IHRhZz17dH0gdGFnUXVlcnk9e3RhZ1F1ZXJ5fSAvPlxyXG4gICAgICAgICkpfVxyXG4gICAgICAgIDxPbmx5IHdoZW49e3RhZ3MubGVuZ3RoIDwgNSAmJiBtZW1vU2VydmljZS5pbml0aWFsaXplZH0+XHJcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0YWctdGlwLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICBJbnB1dDxzcGFuIGNsYXNzTmFtZT1cImNvZGUtdGV4dFwiPiNUYWcgPC9zcGFuPnRvIGNyZWF0ZSB0YWcuLi5cclxuICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L09ubHk+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgKTtcclxufTtcclxuXHJcbmludGVyZmFjZSBUYWdJdGVtQ29udGFpbmVyUHJvcHMge1xyXG4gIHRhZzogVGFnO1xyXG4gIHRhZ1F1ZXJ5OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IFRhZ0l0ZW1Db250YWluZXI6IFJlYWN0LkZDPFRhZ0l0ZW1Db250YWluZXJQcm9wcz4gPSAocHJvcHM6IFRhZ0l0ZW1Db250YWluZXJQcm9wcykgPT4ge1xyXG4gIGNvbnN0IHt0YWcsIHRhZ1F1ZXJ5fSA9IHByb3BzO1xyXG4gIGNvbnN0IGlzQWN0aXZlID0gdGFnUXVlcnkgPT09IHRhZy50ZXh0O1xyXG4gIGNvbnN0IGhhc1N1YlRhZ3MgPSB0YWcuc3ViVGFncy5sZW5ndGggPiAwO1xyXG4gIGNvbnN0IFtzaG93U3ViVGFncywgdG9nZ2xlU3ViVGFnc10gPSB1c2VUb2dnbGUoZmFsc2UpO1xyXG5cclxuICBjb25zdCBoYW5kbGVUYWdDbGljayA9ICgpID0+IHtcclxuICAgIGlmIChpc0FjdGl2ZSkge1xyXG4gICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0VGFnUXVlcnkoJycpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdXRpbHMuY29weVRleHRUb0NsaXBib2FyZChgIyR7dGFnLnRleHR9IGApO1xyXG4gICAgICBpZiAoIVsnLycsICcvcmVjeWNsZSddLmluY2x1ZGVzKGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnBhdGhuYW1lKSkge1xyXG4gICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRQYXRobmFtZSgnLycpO1xyXG4gICAgICB9XHJcbiAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRUYWdRdWVyeSh0YWcudGV4dCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgaGFuZGxlVG9nZ2xlQnRuQ2xpY2sgPSAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdG9nZ2xlU3ViVGFncygpO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17YHRhZy1pdGVtLWNvbnRhaW5lciAke2lzQWN0aXZlID8gJ2FjdGl2ZScgOiAnJ31gfSBvbkNsaWNrPXtoYW5kbGVUYWdDbGlja30+XHJcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0YWctdGV4dC1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImljb24tdGV4dFwiPiM8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0YWctdGV4dFwiPnt0YWcua2V5fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJ0bnMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICB7aGFzU3ViVGFncyA/IChcclxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtgYWN0aW9uLWJ0biB0b2dnbGUtYnRuICR7c2hvd1N1YlRhZ3MgPyAnc2hvd24nIDogJyd9YH0gb25DbGljaz17aGFuZGxlVG9nZ2xlQnRuQ2xpY2t9PlxyXG4gICAgICAgICAgICAgIDxpbWcgY2xhc3NOYW1lPVwiaWNvbi1pbWdcIiBzcmM9e2Fycm93UmlnaHR9IC8+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICkgOiBudWxsfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIHtoYXNTdWJUYWdzID8gKFxyXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgc3VidGFncy1jb250YWluZXIgJHtzaG93U3ViVGFncyA/ICcnIDogJ2hpZGRlbid9YH0+XHJcbiAgICAgICAgICB7dGFnLnN1YlRhZ3MubWFwKChzdCwgaWR4KSA9PiAoXHJcbiAgICAgICAgICAgIDxUYWdJdGVtQ29udGFpbmVyIGtleT17c3QudGV4dCArICctJyArIGlkeH0gdGFnPXtzdH0gdGFnUXVlcnk9e3RhZ1F1ZXJ5fSAvPlxyXG4gICAgICAgICAgKSl9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICkgOiBudWxsfVxyXG4gICAgPC8+XHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRhZ0xpc3Q7XHJcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIHJlYWN0XzEgPSByZXF1aXJlKFwicmVhY3RcIik7XG52YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIChzZXRTdGF0ZUFjdGlvbikge1xuICAgIHJldHVybiB0eXBlb2Ygc2V0U3RhdGVBY3Rpb24gPT09IFwiZnVuY3Rpb25cIjtcbn07XG52YXIgdXNlU3RhdGVSZWYgPSBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgdmFyIF9hID0gcmVhY3RfMS51c2VTdGF0ZShpbml0aWFsU3RhdGUpLCBzdGF0ZSA9IF9hWzBdLCBzZXRTdGF0ZSA9IF9hWzFdO1xuICAgIHZhciByZWYgPSByZWFjdF8xLnVzZVJlZihzdGF0ZSk7XG4gICAgdmFyIGRpc3BhdGNoID0gcmVhY3RfMS51c2VDYWxsYmFjayhmdW5jdGlvbiAoc2V0U3RhdGVBY3Rpb24pIHtcbiAgICAgICAgcmVmLmN1cnJlbnQgPSBpc0Z1bmN0aW9uKHNldFN0YXRlQWN0aW9uKSA/IHNldFN0YXRlQWN0aW9uKHJlZi5jdXJyZW50KSA6IHNldFN0YXRlQWN0aW9uO1xuICAgICAgICBzZXRTdGF0ZShyZWYuY3VycmVudCk7XG4gICAgfSwgW10pO1xuICAgIHJldHVybiBbc3RhdGUsIGRpc3BhdGNoLCByZWZdO1xufTtcbm1vZHVsZS5leHBvcnRzID0gdXNlU3RhdGVSZWY7XG4iLCJpbXBvcnQge3VzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VFZmZlY3QsIHVzZVJlZn0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgdXNlU3RhdGUgZnJvbSAncmVhY3QtdXNlc3RhdGVyZWYnO1xyXG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XHJcbmltcG9ydCB7ZGFpbHlOb3Rlc1NlcnZpY2UsIGdsb2JhbFN0YXRlU2VydmljZSwgbG9jYXRpb25TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7REFJTFlfVElNRVNUQU1QfSBmcm9tICcuLi9oZWxwZXJzL2NvbnN0cyc7XHJcbmltcG9ydCB1dGlscyBmcm9tICcuLi9oZWxwZXJzL3V0aWxzJztcclxuaW1wb3J0ICcuLi9sZXNzL3VzYWdlLWhlYXQtbWFwLmxlc3MnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge21vbWVudCwgUGxhdGZvcm19IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHt0fSBmcm9tICcuLi90cmFuc2xhdGlvbnMvaGVscGVyJztcclxuaW1wb3J0IHtnZXREYWlseU5vdGV9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XHJcblxyXG5jb25zdCB0YWJsZUNvbmZpZyA9IHtcclxuICB3aWR0aDogMTIsXHJcbiAgaGVpZ2h0OiA3LFxyXG59O1xyXG5cclxuY29uc3QgZ2V0SW5pdGlhbFVzYWdlU3RhdCA9ICh1c2VkRGF5c0Ftb3VudDogbnVtYmVyLCBiZWdpbkRheVRpbWVzdGFtcDogbnVtYmVyKTogRGFpbHlVc2FnZVN0YXRbXSA9PiB7XHJcbiAgY29uc3QgaW5pdGlhbFVzYWdlU3RhdDogRGFpbHlVc2FnZVN0YXRbXSA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IHVzZWREYXlzQW1vdW50OyBpKyspIHtcclxuICAgIGluaXRpYWxVc2FnZVN0YXQucHVzaCh7XHJcbiAgICAgIHRpbWVzdGFtcDogcGFyc2VJbnQobW9tZW50KGJlZ2luRGF5VGltZXN0YW1wKS5hZGQoaSwgJ2RheXMnKS5mb3JtYXQoJ3gnKSksXHJcbiAgICAgIGNvdW50OiAwLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJldHVybiBpbml0aWFsVXNhZ2VTdGF0O1xyXG59O1xyXG5cclxuaW50ZXJmYWNlIERhaWx5VXNhZ2VTdGF0IHtcclxuICB0aW1lc3RhbXA6IG51bWJlcjtcclxuICBjb3VudDogbnVtYmVyO1xyXG59XHJcblxyXG4vLyBpbnRlcmZhY2UgRnJvbVRvIHtcclxuLy8gICBiZWdpbjogc3RyaW5nO1xyXG4vLyB9XHJcblxyXG5pbnRlcmZhY2UgUHJvcHMge31cclxuXHJcbi8vIGxldCBGcm9tVG86IHN0cmluZyA9ICcnO1xyXG5cclxuY29uc3QgVXNhZ2VIZWF0TWFwOiBSZWFjdC5GQzxQcm9wcz4gPSAoKSA9PiB7XHJcbiAgLy8gY29uc3QgdG9kYXlUaW1lU3RhbXAgPSB1dGlscy5nZXREYXRlU3RhbXBCeURhdGUobW9tZW50KCkuc3RhcnRPZignZGF5JykuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJykpO1xyXG4gIGNvbnN0IHRvZGF5VGltZVN0YW1wID0gcGFyc2VJbnQobW9tZW50KCkuZW5kT2YoJ2RheScpLmZvcm1hdCgneCcpKTtcclxuICBjb25zdCB0b2RheURheSA9IG5ldyBEYXRlKHRvZGF5VGltZVN0YW1wKS5nZXREYXkoKSB8fCA3O1xyXG4gIGNvbnN0IG51bGxDZWxsID0gbmV3IEFycmF5KDcgLSB0b2RheURheSkuZmlsbCgwKTtcclxuICBjb25zdCB1c2VkRGF5c0Ftb3VudCA9ICh0YWJsZUNvbmZpZy53aWR0aCAtIDEpICogdGFibGVDb25maWcuaGVpZ2h0ICsgdG9kYXlEYXk7XHJcbiAgLy8gY29uc3QgYmVnaW5EYXlUaW1lc3RhbXAgPSB1dGlscy5nZXREYXRlU3RhbXBCeURhdGUodG9kYXlUaW1lU3RhbXAgLSB1c2VkRGF5c0Ftb3VudCAqIERBSUxZX1RJTUVTVEFNUCk7XHJcbiAgY29uc3QgYmVnaW5EYXlUaW1lc3RhbXAgPSBwYXJzZUludChtb21lbnQoKS5zdGFydE9mKCdkYXknKS5zdWJ0cmFjdCh1c2VkRGF5c0Ftb3VudCwgJ2RheXMnKS5mb3JtYXQoJ3gnKSk7XHJcbiAgY29uc3Qgc3RhcnREYXRlID0gbW9tZW50KCkuc3RhcnRPZignZGF5Jykuc3VidHJhY3QodXNlZERheXNBbW91bnQsICdkYXlzJyk7XHJcblxyXG4gIGNvbnN0IHtcclxuICAgIG1lbW9TdGF0ZToge21lbW9zfSxcclxuICB9ID0gdXNlQ29udGV4dChhcHBDb250ZXh0KTtcclxuICBjb25zdCBbYWxsU3RhdCwgc2V0QWxsU3RhdF0gPSB1c2VTdGF0ZTxEYWlseVVzYWdlU3RhdFtdPihnZXRJbml0aWFsVXNhZ2VTdGF0KHVzZWREYXlzQW1vdW50LCBiZWdpbkRheVRpbWVzdGFtcCkpO1xyXG4gIGNvbnN0IFtwb3B1cFN0YXQsIHNldFBvcHVwU3RhdF0gPSB1c2VTdGF0ZTxEYWlseVVzYWdlU3RhdCB8IG51bGw+KG51bGwpO1xyXG4gIGNvbnN0IFtjdXJyZW50U3RhdCwgc2V0Q3VycmVudFN0YXRdID0gdXNlU3RhdGU8RGFpbHlVc2FnZVN0YXQgfCBudWxsPihudWxsKTtcclxuICBjb25zdCBbZnJvbVRvLCBzZXRGcm9tVG8sIGZyb21Ub1JlZl0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgY29uc3QgY29udGFpbmVyRWxSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xyXG4gIGNvbnN0IHBvcHVwUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcclxuICAvLyBjb25zdCBuZXdGcm9tVG8gPSB7XHJcbiAgLy8gICBiZWdpbjogXCJmcm9tXCIsXHJcbiAgLy8gfSBhcyBGcm9tVG87XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBjb25zdCBuZXdTdGF0OiBEYWlseVVzYWdlU3RhdFtdID0gZ2V0SW5pdGlhbFVzYWdlU3RhdCh1c2VkRGF5c0Ftb3VudCwgYmVnaW5EYXlUaW1lc3RhbXApO1xyXG4gICAgZm9yIChjb25zdCBtIG9mIG1lbW9zKSB7XHJcbiAgICAgIGNvbnN0IGNyZWF0aW9uRGF0ZSA9IG1vbWVudChtLmNyZWF0ZWRBdC5yZXBsYWNlQWxsKCcvJywgJy0nKSkuc3RhcnRPZignZGF5Jyk7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gY3JlYXRpb25EYXRlLmRpZmYoc3RhcnREYXRlLCAnZGF5cycpO1xyXG4gICAgICAvLyBjb25zdCBpbmRleCA9ICh1dGlscy5nZXREYXRlU3RhbXBCeURhdGUobS5jcmVhdGVkQXQpIC0gYmVnaW5EYXlUaW1lc3RhbXApIC8gKDEwMDAgKiAzNjAwICogMjQpIC0gMTtcclxuICAgICAgLy8gaWYoaW5kZXggIT0gbmV3U3RhdC5sZW5ndGgpIHsgfVxyXG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IG5ld1N0YXQubGVuZ3RoKSB7XHJcbiAgICAgICAgbmV3U3RhdFtpbmRleF0uY291bnQgKz0gMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2V0QWxsU3RhdChbLi4ubmV3U3RhdF0pO1xyXG4gIH0sIFttZW1vc10pO1xyXG5cclxuICBjb25zdCBoYW5kbGVVc2FnZVN0YXRJdGVtTW91c2VFbnRlciA9IHVzZUNhbGxiYWNrKChldmVudDogUmVhY3QuTW91c2VFdmVudCwgaXRlbTogRGFpbHlVc2FnZVN0YXQpID0+IHtcclxuICAgIHNldFBvcHVwU3RhdChpdGVtKTtcclxuICAgIGlmICghcG9wdXBSZWYuY3VycmVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qge2lzTW9iaWxlVmlld30gPSBnbG9iYWxTdGF0ZVNlcnZpY2UuZ2V0U3RhdGUoKTtcclxuICAgIGNvbnN0IHRhcmdldEVsID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29uc3Qgc2lkZWJhckVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lbW9zLXNpZGViYXItd3JhcHBlcicpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgcG9wdXBSZWYuY3VycmVudC5zdHlsZS5sZWZ0ID0gdGFyZ2V0RWwub2Zmc2V0TGVmdCAtIChjb250YWluZXJFbFJlZi5jdXJyZW50Py5vZmZzZXRMZWZ0ID8/IDApICsgJ3B4JztcclxuICAgIGxldCB0b3BWYWx1ZSA9IHRhcmdldEVsLm9mZnNldFRvcDtcclxuICAgIGlmICghaXNNb2JpbGVWaWV3KSB7XHJcbiAgICAgIHRvcFZhbHVlIC09IHNpZGViYXJFbC5zY3JvbGxUb3A7XHJcbiAgICB9XHJcbiAgICBwb3B1cFJlZi5jdXJyZW50LnN0eWxlLnRvcCA9IHRvcFZhbHVlICsgJ3B4JztcclxuICB9LCBbXSk7XHJcblxyXG4gIGNvbnN0IGhhbmRsZVVzYWdlU3RhdEl0ZW1Nb3VzZUxlYXZlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgc2V0UG9wdXBTdGF0KG51bGwpO1xyXG4gIH0sIFtdKTtcclxuXHJcbiAgY29uc3QgaGFuZGxlVXNhZ2VTdGF0SXRlbUNsaWNrID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50LCBpdGVtOiBEYWlseVVzYWdlU3RhdCkgPT4ge1xyXG4gICAgaWYgKFxyXG4gICAgICBsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5xdWVyeS5kdXJhdGlvbj8uZnJvbSA9PT0gaXRlbS50aW1lc3RhbXAgJiZcclxuICAgICAgbW9tZW50KGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5LmR1cmF0aW9uPy5mcm9tKS5kaWZmKFxyXG4gICAgICAgIGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5LmR1cmF0aW9uPy50byxcclxuICAgICAgICAnZGF5JyxcclxuICAgICAgKSA9PSAwXHJcbiAgICApIHtcclxuICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldEZyb21BbmRUb1F1ZXJ5KDAsIDApO1xyXG4gICAgICBzZXRDdXJyZW50U3RhdChudWxsKTtcclxuICAgICAgc2V0RnJvbVRvKG51bGwpO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgbG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LmZyb20gIT09IGl0ZW0udGltZXN0YW1wICYmXHJcbiAgICAgIGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5LmR1cmF0aW9uPy5mcm9tID4gMCAmJlxyXG4gICAgICBldmVudC5zaGlmdEtleVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHRpbWVTdGFtcERheXMgPSBtb21lbnQoaXRlbS50aW1lc3RhbXApXHJcbiAgICAgICAgLmVuZE9mKCdkYXknKVxyXG4gICAgICAgIC5kaWZmKGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5LmR1cmF0aW9uPy50bywgJ2RheScpO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGltZVN0YW1wRGF5cyA+IDAgJiZcclxuICAgICAgICBtb21lbnQobG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LmZyb20pLmRpZmYoXHJcbiAgICAgICAgICBsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5xdWVyeS5kdXJhdGlvbj8udG8sXHJcbiAgICAgICAgICAnZGF5JyxcclxuICAgICAgICApID09IDBcclxuICAgICAgKSB7XHJcbiAgICAgICAgc2V0RnJvbVRvKCdmcm9tJyk7XHJcbiAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgdGltZVN0YW1wRGF5cyA8IDAgJiZcclxuICAgICAgICBtb21lbnQobG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LmZyb20pLmRpZmYoXHJcbiAgICAgICAgICBsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5xdWVyeS5kdXJhdGlvbj8udG8sXHJcbiAgICAgICAgICAnZGF5JyxcclxuICAgICAgICApID09IDBcclxuICAgICAgKSB7XHJcbiAgICAgICAgc2V0RnJvbVRvKCd0bycpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtb21lbnQobG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LmZyb20pLmlzQmVmb3JlKGl0ZW0udGltZXN0YW1wKSkge1xyXG4gICAgICAgIGlmIChmcm9tVG9SZWYuY3VycmVudCA9PT0gJ3RvJykge1xyXG4gICAgICAgICAgaWYgKHRpbWVTdGFtcERheXMgPCAwKSB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRGcm9tQW5kVG9RdWVyeShpdGVtLnRpbWVzdGFtcCwgbG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LnRvKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRGcm9tQW5kVG9RdWVyeShcclxuICAgICAgICAgICAgICBwYXJzZUludChtb21lbnQobG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LnRvKS5zdGFydE9mKCdkYXknKS5mb3JtYXQoJ3gnKSksXHJcbiAgICAgICAgICAgICAgcGFyc2VJbnQobW9tZW50KGl0ZW0udGltZXN0YW1wKS5lbmRPZignZGF5JykuZm9ybWF0KCd4JykpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBzZXRGcm9tVG8oJ2Zyb20nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGZyb21Ub1JlZi5jdXJyZW50ID09PSAnZnJvbScpIHtcclxuICAgICAgICAgIGlmICh0aW1lU3RhbXBEYXlzIDwgMCkge1xyXG4gICAgICAgICAgICBsb2NhdGlvblNlcnZpY2Uuc2V0RnJvbUFuZFRvUXVlcnkoXHJcbiAgICAgICAgICAgICAgbG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LmZyb20sXHJcbiAgICAgICAgICAgICAgcGFyc2VJbnQobW9tZW50KGl0ZW0udGltZXN0YW1wKS5lbmRPZignZGF5JykuZm9ybWF0KCd4JykpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbG9jYXRpb25TZXJ2aWNlLnNldEZyb21BbmRUb1F1ZXJ5KFxyXG4gICAgICAgICAgICAgIGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5LmR1cmF0aW9uPy5mcm9tLFxyXG4gICAgICAgICAgICAgIHBhcnNlSW50KG1vbWVudChpdGVtLnRpbWVzdGFtcCkuZW5kT2YoJ2RheScpLmZvcm1hdCgneCcpKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gY29uc3QgZGF5cyA9IG1vbWVudChsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5xdWVyeS5kdXJhdGlvbj8uZnJvbSkuZGlmZihsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5xdWVyeS5kdXJhdGlvbj8udG8sICdkYXknKTtcclxuICAgICAgICBpZiAoZnJvbVRvUmVmLmN1cnJlbnQgPT09ICd0bycpIHtcclxuICAgICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRGcm9tQW5kVG9RdWVyeShpdGVtLnRpbWVzdGFtcCwgbG9jYXRpb25TZXJ2aWNlLmdldFN0YXRlKCkucXVlcnkuZHVyYXRpb24/LnRvKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGZyb21Ub1JlZi5jdXJyZW50ID09PSAnZnJvbScpIHtcclxuICAgICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRGcm9tQW5kVG9RdWVyeShcclxuICAgICAgICAgICAgaXRlbS50aW1lc3RhbXAsXHJcbiAgICAgICAgICAgIHBhcnNlSW50KG1vbWVudChsb2NhdGlvblNlcnZpY2UuZ2V0U3RhdGUoKS5xdWVyeS5kdXJhdGlvbj8uZnJvbSkuZW5kT2YoJ2RheScpLmZvcm1hdCgneCcpKSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBzZXRGcm9tVG8oJ3RvJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnF1ZXJ5LmR1cmF0aW9uPy5mcm9tID09PSAwICYmIGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRGcm9tQW5kVG9RdWVyeShpdGVtLnRpbWVzdGFtcCwgcGFyc2VJbnQobW9tZW50KCkuZW5kT2YoJ2RheScpLmZvcm1hdCgneCcpKSk7XHJcbiAgICB9IGVsc2UgaWYgKGl0ZW0uY291bnQgPiAwICYmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpKSB7XHJcbiAgICAgIGNvbnN0IHthcHAsIGRhaWx5Tm90ZXN9ID0gZGFpbHlOb3Rlc1NlcnZpY2UuZ2V0U3RhdGUoKTtcclxuXHJcbiAgICAgIGNvbnN0IGZpbGUgPSBnZXREYWlseU5vdGUobW9tZW50KGl0ZW0udGltZXN0YW1wKSwgZGFpbHlOb3Rlcyk7XHJcbiAgICAgIGlmICghUGxhdGZvcm0uaXNNb2JpbGUpIHtcclxuICAgICAgICBjb25zdCBsZWFmID0gYXBwLndvcmtzcGFjZS5zcGxpdEFjdGl2ZUxlYWYoKTtcclxuICAgICAgICBsZWFmLm9wZW5GaWxlKGZpbGUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBsZWFmID0gYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xyXG4gICAgICAgIGlmIChsZWFmID09PSBudWxsKSB7XHJcbiAgICAgICAgICBsZWFmID0gYXBwLndvcmtzcGFjZS5nZXRMZWFmKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZWFmLm9wZW5GaWxlKGZpbGUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGl0ZW0uY291bnQgPiAwICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQubWV0YUtleSkge1xyXG4gICAgICBpZiAoIVsnLycsICcvcmVjeWNsZSddLmluY2x1ZGVzKGxvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnBhdGhuYW1lKSkge1xyXG4gICAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRQYXRobmFtZSgnLycpO1xyXG4gICAgICB9XHJcbiAgICAgIGxvY2F0aW9uU2VydmljZS5zZXRGcm9tQW5kVG9RdWVyeShcclxuICAgICAgICBpdGVtLnRpbWVzdGFtcCxcclxuICAgICAgICB1dGlscy5nZXRUaW1lU3RhbXBCeURhdGUoXHJcbiAgICAgICAgICBtb21lbnQoaXRlbS50aW1lc3RhbXAgKyBEQUlMWV9USU1FU1RBTVApXHJcbiAgICAgICAgICAgIC5zdWJ0cmFjdCgxLCAnZGF5cycpXHJcbiAgICAgICAgICAgIC5lbmRPZignZGF5JylcclxuICAgICAgICAgICAgLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpLFxyXG4gICAgICAgICksXHJcbiAgICAgICk7XHJcbiAgICAgIHNldEN1cnJlbnRTdGF0KGl0ZW0pO1xyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxkaXYgY2xhc3NOYW1lPVwidXNhZ2UtaGVhdC1tYXAtd3JhcHBlclwiIHJlZj17Y29udGFpbmVyRWxSZWZ9PlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRheS10aXAtdGV4dC1jb250YWluZXJcIj5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPnt0KCd3ZWVrRGF5c1Nob3J0JylbMF19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRpcC10ZXh0XCI+PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRpcC10ZXh0XCI+e3QoJ3dlZWtEYXlzU2hvcnQnKVsyXX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGlwLXRleHRcIj48L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGlwLXRleHRcIj57dCgnd2Vla0RheXNTaG9ydCcpWzRdfTwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPjwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0aXAtdGV4dFwiPnt0KCd3ZWVrRGF5c1Nob3J0JylbNl19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIHsvKiBwb3B1cCAqL31cclxuICAgICAgPGRpdiByZWY9e3BvcHVwUmVmfSBjbGFzc05hbWU9eyd1c2FnZS1kZXRhaWwtY29udGFpbmVyIHBvcC11cCAnICsgKHBvcHVwU3RhdCA/ICcnIDogJ2hpZGRlbicpfT5cclxuICAgICAgICB7cG9wdXBTdGF0Py5jb3VudH0gbWVtb3Mgb257JyAnfVxyXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImRhdGUtdGV4dFwiPntuZXcgRGF0ZShwb3B1cFN0YXQ/LnRpbWVzdGFtcCBhcyBudW1iZXIpLnRvRGF0ZVN0cmluZygpfTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInVzYWdlLWhlYXQtbWFwXCI+XHJcbiAgICAgICAge2FsbFN0YXQubWFwKCh2LCBpKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjb3VudCA9IHYuY291bnQ7XHJcbiAgICAgICAgICBjb25zdCBjb2xvckxldmVsID1cclxuICAgICAgICAgICAgY291bnQgPD0gMFxyXG4gICAgICAgICAgICAgID8gJydcclxuICAgICAgICAgICAgICA6IGNvdW50IDw9IDFcclxuICAgICAgICAgICAgICA/ICdzdGF0LWRheS1MMS1iZydcclxuICAgICAgICAgICAgICA6IGNvdW50IDw9IDJcclxuICAgICAgICAgICAgICA/ICdzdGF0LWRheS1MMi1iZydcclxuICAgICAgICAgICAgICA6IGNvdW50IDw9IDRcclxuICAgICAgICAgICAgICA/ICdzdGF0LWRheS1MMy1iZydcclxuICAgICAgICAgICAgICA6ICdzdGF0LWRheS1MNC1iZyc7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2BzdGF0LWNvbnRhaW5lciAke2NvbG9yTGV2ZWx9ICR7Y3VycmVudFN0YXQgPT09IHYgPyAnY3VycmVudCcgOiAnJ30gJHtcclxuICAgICAgICAgICAgICAgIHRvZGF5VGltZVN0YW1wID09PSB2LnRpbWVzdGFtcCA/ICd0b2RheScgOiAnJ1xyXG4gICAgICAgICAgICAgIH1gfVxyXG4gICAgICAgICAgICAgIGtleT17aX1cclxuICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI9eyhlKSA9PiBoYW5kbGVVc2FnZVN0YXRJdGVtTW91c2VFbnRlcihlLCB2KX1cclxuICAgICAgICAgICAgICBvbk1vdXNlTGVhdmU9e2hhbmRsZVVzYWdlU3RhdEl0ZW1Nb3VzZUxlYXZlfVxyXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBoYW5kbGVVc2FnZVN0YXRJdGVtQ2xpY2soZSwgdil9XHJcbiAgICAgICAgICAgID48L3NwYW4+XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pfVxyXG4gICAgICAgIHtudWxsQ2VsbC5tYXAoKHYsIGkpID0+IChcclxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInN0YXQtY29udGFpbmVyIG51bGxcIiBrZXk9e2l9Pjwvc3Bhbj5cclxuICAgICAgICApKX1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgVXNhZ2VIZWF0TWFwO1xyXG4iLCJpbXBvcnQge3VzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XG5pbXBvcnQge1NIT1dfU0lERVJCQVJfTU9CSUxFX0NMQVNTTkFNRX0gZnJvbSAnLi4vaGVscGVycy9jb25zdHMnO1xuaW1wb3J0IHtnbG9iYWxTdGF0ZVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCBVc2VyQmFubmVyIGZyb20gJy4vVXNlckJhbm5lcic7XG5pbXBvcnQgUXVlcnlMaXN0IGZyb20gJy4vUXVlcnlMaXN0JztcbmltcG9ydCBUYWdMaXN0IGZyb20gJy4vVGFnTGlzdCc7XG5pbXBvcnQgVXNhZ2VIZWF0TWFwIGZyb20gJy4vVXNhZ2VIZWF0TWFwJztcbmltcG9ydCAnLi4vbGVzcy9zaWRlcmJhci5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmludGVyZmFjZSBQcm9wcyB7fVxuXG5jb25zdCBTaWRlYmFyOiBSZWFjdC5GQzxQcm9wcz4gPSAoKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBsb2NhdGlvblN0YXRlLFxuICAgIGdsb2JhbFN0YXRlOiB7aXNNb2JpbGVWaWV3LCBzaG93U2lkZXJiYXJJbk1vYmlsZVZpZXd9LFxuICB9ID0gdXNlQ29udGV4dChhcHBDb250ZXh0KTtcbiAgY29uc3Qgd3JhcHBlckVsUmVmID0gdXNlUmVmPEhUTUxFbGVtZW50PihudWxsKTtcblxuICBjb25zdCBoYW5kbGVDbGlja091dHNpZGVPZldyYXBwZXIgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBzaWRlcmJhclNob3duID0gZ2xvYmFsU3RhdGVTZXJ2aWNlLmdldFN0YXRlKCkuc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3O1xuXG4gICAgICBpZiAoIXNpZGVyYmFyU2hvd24pIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlQ2xpY2tPdXRzaWRlT2ZXcmFwcGVyLCB7XG4gICAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF3cmFwcGVyRWxSZWYuY3VycmVudD8uY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgIGlmICh3cmFwcGVyRWxSZWYuY3VycmVudD8ucGFyZW50Tm9kZT8uY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgICAgaWYgKHNpZGVyYmFyU2hvd24pIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBnbG9iYWxTdGF0ZVNlcnZpY2Uuc2V0U2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3KGZhbHNlKTtcbiAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVDbGlja091dHNpZGVPZldyYXBwZXIsIHtcbiAgICAgICAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBnbG9iYWxTdGF0ZVNlcnZpY2Uuc2V0U2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3KGZhbHNlKTtcbiAgfSwgW2xvY2F0aW9uU3RhdGVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzaG93U2lkZXJiYXJJbk1vYmlsZVZpZXcpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChTSE9XX1NJREVSQkFSX01PQklMRV9DTEFTU05BTUUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoU0hPV19TSURFUkJBUl9NT0JJTEVfQ0xBU1NOQU1FKTtcbiAgICB9XG4gIH0sIFtzaG93U2lkZXJiYXJJbk1vYmlsZVZpZXddKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc01vYmlsZVZpZXcgJiYgc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3KSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVDbGlja091dHNpZGVPZldyYXBwZXIsIHtcbiAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW2lzTW9iaWxlVmlldywgc2hvd1NpZGVyYmFySW5Nb2JpbGVWaWV3XSk7XG5cbiAgcmV0dXJuIChcbiAgICA8YXNpZGUgY2xhc3NOYW1lPVwibWVtb3Mtc2lkZWJhci13cmFwcGVyXCIgcmVmPXt3cmFwcGVyRWxSZWZ9PlxuICAgICAgPFVzZXJCYW5uZXIgLz5cbiAgICAgIDxVc2FnZUhlYXRNYXAgLz5cbiAgICAgIDxRdWVyeUxpc3QgLz5cbiAgICAgIDxUYWdMaXN0IC8+XG4gICAgPC9hc2lkZT5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGViYXI7XG4iLCJpbXBvcnQge3VzZUNhbGxiYWNrLCB1c2VDb250ZXh0LCB1c2VFZmZlY3R9IGZyb20gJ3JlYWN0Jztcbi8vIGltcG9ydCB7IGxvY2F0aW9uU2VydmljZSwgdXNlclNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXNcIjtcbmltcG9ydCB7aG9tZVJvdXRlclN3aXRjaH0gZnJvbSAnLi4vcm91dGVycyc7XG5pbXBvcnQgYXBwQ29udGV4dCBmcm9tICcuLi9zdG9yZXMvYXBwQ29udGV4dCc7XG5pbXBvcnQgU2lkZWJhciBmcm9tICcuLi9jb21wb25lbnRzL1NpZGViYXInO1xuaW1wb3J0IHVzZUxvYWRpbmcgZnJvbSAnLi4vaG9va3MvdXNlTG9hZGluZyc7XG5pbXBvcnQgJy4uL2xlc3MvaG9tZS5sZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmZ1bmN0aW9uIEhvbWUoKSB7XG4gIGNvbnN0IHtcbiAgICBsb2NhdGlvblN0YXRlOiB7cGF0aG5hbWV9LFxuICB9ID0gdXNlQ29udGV4dChhcHBDb250ZXh0KTtcbiAgLy8gY29uc3QgeyBhcHAgfSA9IGRhaWx5Tm90ZXNTZXJ2aWNlLmdldFN0YXRlKCk7XG4gIGNvbnN0IGxvYWRpbmdTdGF0ZSA9IHVzZUxvYWRpbmcoKTtcbiAgLy8gY29uc3QgcmVmcmVzaCA9IHVzZVJlZnJlc2goKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIGNvbnN0IHsgdXNlciB9ID0gdXNlclNlcnZpY2UuZ2V0U3RhdGUoKTtcbiAgICAvLyBpZiAoIXVzZXIpIHtcbiAgICAvLyAgIHVzZXJTZXJ2aWNlXG4gICAgLy8gICAgIC5kb1NpZ25JbigpXG4gICAgLy8gICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgLy8gICAgICAgLy8gZG8gbnRoXG4gICAgLy8gICAgIH0pXG4gICAgLy8gICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAvLyAgICAgICAvLyBpZiAodXNlclNlcnZpY2UuZ2V0U3RhdGUoKS51c2VyKSB7XG4gICAgLy8gICAgICAgICBsb2FkaW5nU3RhdGUuc2V0RmluaXNoKCk7XG4gICAgLy8gICAgICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgICAgICAvLyAgIGxvY2F0aW9uU2VydmljZS5yZXBsYWNlSGlzdG9yeShcIi9zaWduaW5cIik7XG4gICAgLy8gICAgICAgLy8gfVxuICAgIC8vICAgICB9KTtcbiAgICAvLyB9IGVsc2Uge1xuICAgIGxvYWRpbmdTdGF0ZS5zZXRGaW5pc2goKTtcblxuICAgIC8vIH1cbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHsvKiB7bG9hZGluZ1N0YXRlLmlzTG9hZGluZyA/IG51bGwgOiAoICovfVxuICAgICAgPHNlY3Rpb24gaWQ9XCJwYWdlLXdyYXBwZXJcIj5cbiAgICAgICAgPFNpZGViYXIgLz5cbiAgICAgICAgPG1haW4gY2xhc3NOYW1lPVwiY29udGVudC13cmFwcGVyXCI+e2hvbWVSb3V0ZXJTd2l0Y2gocGF0aG5hbWUpfTwvbWFpbj5cbiAgICAgIDwvc2VjdGlvbj5cbiAgICAgIHsvKiApfSAqL31cbiAgICA8Lz5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgSG9tZTtcbiIsIigoKSA9PiB7XG4gIGlmICghU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsKSB7XG4gICAgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsID0gZnVuY3Rpb24gKHN0cjogYW55LCBuZXdTdHI6IGFueSkge1xuICAgICAgLy8gSWYgYSByZWdleCBwYXR0ZXJuXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN0cikudG9Mb3dlckNhc2UoKSA9PT0gJ1tvYmplY3QgcmVnZXhwXScpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShzdHIsIG5ld1N0cik7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGEgc3RyaW5nXG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlKG5ldyBSZWdFeHAoc3RyLCAnZycpLCBuZXdTdHIpO1xuICAgIH07XG4gIH1cbn0pKCk7XG5cbmV4cG9ydCBkZWZhdWx0IG51bGw7XG4iLCJpbXBvcnQge3VzZUNvbnRleHQsIHVzZUVmZmVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEhvbWUgZnJvbSAnLi9wYWdlcy9Ib21lJztcbmltcG9ydCB7Z2xvYmFsU3RhdGVTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzJztcbmltcG9ydCAnLi9sZXNzL2FwcC5sZXNzJztcbmltcG9ydCBQcm92aWRlciBmcm9tICcuL2xhYnMvUHJvdmlkZXInO1xuaW1wb3J0IGFwcENvbnRleHQgZnJvbSAnLi9zdG9yZXMvYXBwQ29udGV4dCc7XG5pbXBvcnQgYXBwU3RvcmUgZnJvbSAnLi9zdG9yZXMvYXBwU3RvcmUnO1xuaW1wb3J0ICcuL2hlbHBlcnMvcG9seWZpbGwnO1xuaW1wb3J0ICcuL2xlc3MvZ2xvYmFsLmxlc3MnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuZnVuY3Rpb24gU3RyaWN0QXBwKCkge1xuICByZXR1cm4gKFxuICAgIDxQcm92aWRlciBzdG9yZT17YXBwU3RvcmV9IGNvbnRleHQ9e2FwcENvbnRleHR9PlxuICAgICAgPEFwcCAvPlxuICAgIDwvUHJvdmlkZXI+XG4gICk7XG59XG5cbmZ1bmN0aW9uIEFwcCgpIHtcbiAgY29uc3Qge1xuICAgIGxvY2F0aW9uU3RhdGU6IHtwYXRobmFtZX0sXG4gIH0gPSB1c2VDb250ZXh0KGFwcENvbnRleHQpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlV2luZG93UmVzaXplID0gKCkgPT4ge1xuICAgICAgZ2xvYmFsU3RhdGVTZXJ2aWNlLnNldElzTW9iaWxlVmlldyhkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDw9IDg3NSk7XG4gICAgfTtcblxuICAgIGhhbmRsZVdpbmRvd1Jlc2l6ZSgpO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZVdpbmRvd1Jlc2l6ZSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZVdpbmRvd1Jlc2l6ZSk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxIb21lIC8+XG4gICAgPC8+XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN0cmljdEFwcDtcbiIsImltcG9ydCB7V29ya3NwYWNlTGVhZiwgSXRlbVZpZXcsIEhvdmVyUG9wb3ZlciwgVEZpbGV9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHtNRU1PU19WSUVXX1RZUEV9IGZyb20gJy4vY29uc3RhbnRzJztcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XHJcblxyXG5pbXBvcnQgQXBwIGZyb20gJy4vQXBwJztcclxuaW1wb3J0IHR5cGUgTWVtb3NQbHVnaW4gZnJvbSAnLi9pbmRleCc7XHJcbmltcG9ydCB7ZGFpbHlOb3Rlc1NlcnZpY2UsIG1lbW9TZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzJztcclxuaW1wb3J0IHtnZXREYXRlRnJvbUZpbGV9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgTWVtb3MgZXh0ZW5kcyBJdGVtVmlldyB7XHJcbiAgcGx1Z2luOiBNZW1vc1BsdWdpbjtcclxuICBob3ZlclBvcG92ZXI6IEhvdmVyUG9wb3ZlciB8IG51bGw7XHJcbiAgcHJpdmF0ZSBtZW1vc0NvbXBvbmVudDogUmVhY3QuUmVhY3RFbGVtZW50O1xyXG5cclxuICBjb25zdHJ1Y3RvcihsZWFmOiBXb3Jrc3BhY2VMZWFmLCBwbHVnaW46IE1lbW9zUGx1Z2luKSB7XHJcbiAgICBzdXBlcihsZWFmKTtcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cclxuICAgIC8vIHRoaXMucGx1Z2luLnNldHRpbmdzID0gbnVsbDtcclxuICAgIC8vIFx0cGx1Z2luLnNldHRpbmdzLnN1YnNjcmliZSgodmFsOmFueSkgPT4ge1xyXG4gICAgLy8gXHR0aGlzLnBsdWdpbi5zZXR0aW5ncyA9IHZhbDtcclxuXHJcbiAgICAvLyBcdC8vIFJlZnJlc2ggdGhlIGNhbGVuZGFyIGlmIHNldHRpbmdzIGNoYW5nZVxyXG4gICAgLy8gXHRpZiAodGhpcy5tZW1vc0NvbXBvbmVudCkge1xyXG4gICAgLy8gXHRcdHVzZVJlZnJlc2goKTtcclxuICAgIC8vIFx0fVxyXG4gICAgLy8gXHR9KTtcclxuICB9XHJcblxyXG4gIGdldERpc3BsYXlUZXh0KCk6IHN0cmluZyB7XHJcbiAgICAvLyBUT0RPOiBNYWtlIHRoaXMgaW50ZXJhY3RpdmU6IEVpdGhlciB0aGUgYWN0aXZlIHdvcmtzcGFjZSBvciB0aGUgbG9jYWwgZ3JhcGhcclxuICAgIHJldHVybiAnTWVtb3MnO1xyXG4gIH1cclxuXHJcbiAgZ2V0SWNvbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICdNZW1vcyc7XHJcbiAgfVxyXG5cclxuICBnZXRWaWV3VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE1FTU9TX1ZJRVdfVFlQRTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25NZW1vc1NldHRpbmdzVXBkYXRlKCk6IHZvaWQge1xyXG4gICAgbWVtb1NlcnZpY2UuY2xlYXJNZW1vcygpO1xyXG4gICAgbWVtb1NlcnZpY2UuZmV0Y2hBbGxNZW1vcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBvbkZpbGVEZWxldGVkKGZpbGU6IFRGaWxlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoZ2V0RGF0ZUZyb21GaWxlKGZpbGUsICdkYXknKSkge1xyXG4gICAgICBhd2FpdCBkYWlseU5vdGVzU2VydmljZS5nZXRNeUFsbERhaWx5Tm90ZXMoKTtcclxuICAgICAgbWVtb1NlcnZpY2UuY2xlYXJNZW1vcygpO1xyXG4gICAgICBtZW1vU2VydmljZS5mZXRjaEFsbE1lbW9zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uRmlsZU1vZGlmaWVkKGZpbGU6IFRGaWxlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBkYXRlID0gZ2V0RGF0ZUZyb21GaWxlKGZpbGUsICdkYXknKTtcclxuXHJcbiAgICBpZiAoZGF0ZSAmJiB0aGlzLm1lbW9zQ29tcG9uZW50KSB7XHJcbiAgICAgIC8vIG1lbW9TZXJ2aWNlLmNsZWFyTWVtb3MoKTtcclxuICAgICAgbWVtb1NlcnZpY2UuZmV0Y2hBbGxNZW1vcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkZpbGVDcmVhdGVkKGZpbGU6IFRGaWxlKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hcHAud29ya3NwYWNlLmxheW91dFJlYWR5ICYmIHRoaXMubWVtb3NDb21wb25lbnQpIHtcclxuICAgICAgaWYgKGdldERhdGVGcm9tRmlsZShmaWxlLCAnZGF5JykpIHtcclxuICAgICAgICBkYWlseU5vdGVzU2VydmljZS5nZXRNeUFsbERhaWx5Tm90ZXMoKTtcclxuICAgICAgICAvLyBtZW1vU2VydmljZS5jbGVhck1lbW9zKCk7XHJcbiAgICAgICAgbWVtb1NlcnZpY2UuZmV0Y2hBbGxNZW1vcygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLm9uTWVtb3NTZXR0aW5nc1VwZGF0ZSA9IHRoaXMub25NZW1vc1NldHRpbmdzVXBkYXRlLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLm9uRmlsZUNyZWF0ZWQgPSB0aGlzLm9uRmlsZUNyZWF0ZWQuYmluZCh0aGlzKTtcclxuICAgIHRoaXMub25GaWxlRGVsZXRlZCA9IHRoaXMub25GaWxlRGVsZXRlZC5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5vbkZpbGVNb2RpZmllZCA9IHRoaXMub25GaWxlTW9kaWZpZWQuYmluZCh0aGlzKTtcclxuXHJcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQoXHJcbiAgICAgIHRoaXMucGx1Z2luLmFwcC53b3Jrc3BhY2Uub24oJ2xheW91dC1jaGFuZ2UnLCAoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1lbW9zQ29tcG9uZW50KSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbGVhdmVzID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShNRU1PU19WSUVXX1RZUEUpO1xyXG4gICAgICAgIGlmICghKGxlYXZlcy5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBsZWFmID0gbGVhdmVzWzBdO1xyXG4gICAgICAgIC8vQHRzLWV4cGVjdC1lcnJvciwgcHJpdmF0ZSBtZXRob2RcclxuICAgICAgICBjb25zdCBzaWRlID0gbGVhZi5nZXRSb290KCkuc2lkZTtcclxuICAgICAgICBsZXQgc2lkZWJhcjogSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IHBhZ2U6IEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmIChsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLm1lbW9zLXNpZGViYXItd3JhcHBlcicpKSB7XHJcbiAgICAgICAgICBzaWRlYmFyID0gbGVhZi52aWV3LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5tZW1vcy1zaWRlYmFyLXdyYXBwZXInKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2lkZWJhciA9IGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcubWVtb3Mtc2lkZWJhci13cmFwcGVyLWRpc3BsYXknKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuY29udGVudC13cmFwcGVyJykpIHtcclxuICAgICAgICAgIHBhZ2UgPSBsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLmNvbnRlbnQtd3JhcHBlcicpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBwYWdlID0gbGVhZi52aWV3LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50LXdyYXBwZXItcGFkZGluZy1maXgnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29uc3QgcGFnZSA9IGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcuY29udGVudC13cmFwcGVyJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKHNpZGUgIT09IHVuZGVmaW5lZCAmJiAoc2lkZSA9PT0gJ2xlZnQnIHx8IHNpZGUgPT09ICdyaWdodCcpKSB7XHJcbiAgICAgICAgICBpZiAoIXNpZGViYXI/LmNsYXNzTmFtZS5jb250YWlucygnbWVtb3Mtc2lkZWJhci13cmFwcGVyLWRpc3BsYXknKSAmJiBwYWdlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgc2lkZWJhci5jbGFzc05hbWUgPSAnbWVtb3Mtc2lkZWJhci13cmFwcGVyLWRpc3BsYXknO1xyXG4gICAgICAgICAgICBwYWdlLmNsYXNzTmFtZSA9ICdjb250ZW50LXdyYXBwZXItcGFkZGluZy1maXgnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoc2lkZWJhcj8uY2xhc3NMaXN0LmNvbnRhaW5zKCdtZW1vcy1zaWRlYmFyLXdyYXBwZXItZGlzcGxheScpICYmIHBhZ2UgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzaWRlYmFyLmNsYXNzTmFtZSA9ICdtZW1vcy1zaWRlYmFyLXdyYXBwZXInO1xyXG4gICAgICAgICAgICBwYWdlLmNsYXNzTmFtZSA9ICdjb250ZW50LXdyYXBwZXInO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMucmVnaXN0ZXJFdmVudChcclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgKDxhbnk+dGhpcy5hcHAud29ya3NwYWNlKS5vbignb2JzaWRpYW4tbWVtb3M6c2V0dGluZ3MtdXBkYXRlZCcsIHRoaXMub25NZW1vc1NldHRpbmdzVXBkYXRlKSxcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdjcmVhdGUnLCB0aGlzLm9uRmlsZUNyZWF0ZWQpKTtcclxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgdGhpcy5vbkZpbGVEZWxldGVkKSk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ21vZGlmeScsIHRoaXMub25GaWxlTW9kaWZpZWQpKTtcclxuXHJcbiAgICBkYWlseU5vdGVzU2VydmljZS5nZXRBcHAodGhpcy5hcHApO1xyXG4gICAgSW5zZXJ0QWZ0ZXIgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbnNlcnRBZnRlcjtcclxuICAgIFVzZXJOYW1lID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuVXNlck5hbWU7XHJcbiAgICBQcm9jZXNzRW50cmllc0JlbG93ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuUHJvY2Vzc0VudHJpZXNCZWxvdztcclxuICAgIFNhdmVNZW1vQnV0dG9uTGFiZWwgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5TYXZlTWVtb0J1dHRvbkxhYmVsO1xyXG4gICAgRGVmYXVsdFByZWZpeCA9IHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRQcmVmaXg7XHJcbiAgICBJbnNlcnREYXRlRm9ybWF0ID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuSW5zZXJ0RGF0ZUZvcm1hdDtcclxuICAgIERlZmF1bHRFZGl0b3JMb2NhdGlvbiA9IHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRFZGl0b3JMb2NhdGlvbjtcclxuICAgIFVzZUJ1dHRvblRvU2hvd0VkaXRvciA9IHRoaXMucGx1Z2luLnNldHRpbmdzLlVzZUJ1dHRvblRvU2hvd0VkaXRvcjtcclxuICAgIEZvY3VzT25FZGl0b3IgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5Gb2N1c09uRWRpdG9yO1xyXG4gICAgT3BlbkRhaWx5TWVtb3NXaXRoTWVtb3MgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5PcGVuRGFpbHlNZW1vc1dpdGhNZW1vcztcclxuICAgIEhpZGVEb25lVGFza3MgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5IaWRlRG9uZVRhc2tzO1xyXG4gICAgU2hhcmVGb290ZXJTdGFydCA9IHRoaXMucGx1Z2luLnNldHRpbmdzLlNoYXJlRm9vdGVyU3RhcnQ7XHJcbiAgICBTaGFyZUZvb3RlckVuZCA9IHRoaXMucGx1Z2luLnNldHRpbmdzLlNoYXJlRm9vdGVyRW5kO1xyXG4gICAgT3Blbk1lbW9zQXV0b21hdGljYWxseSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLk9wZW5NZW1vc0F1dG9tYXRpY2FsbHk7XHJcbiAgICAvLyBFZGl0b3JNYXhIZWlnaHQgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5FZGl0b3JNYXhIZWlnaHQ7XHJcbiAgICBTaG93VGltZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLlNob3dUaW1lO1xyXG4gICAgU2hvd0RhdGUgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5TaG93RGF0ZTtcclxuICAgIEFkZEJsYW5rTGluZVdoZW5EYXRlID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuQWRkQmxhbmtMaW5lV2hlbkRhdGU7XHJcbiAgICBBdXRvU2F2ZVdoZW5Pbk1vYmlsZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLkF1dG9TYXZlV2hlbk9uTW9iaWxlO1xyXG4gICAgUXVlcnlGaWxlTmFtZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLlF1ZXJ5RmlsZU5hbWU7XHJcbiAgICBEZWxldGVGaWxlTmFtZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLkRlbGV0ZUZpbGVOYW1lO1xyXG4gICAgVXNlVmF1bHRUYWdzID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MuVXNlVmF1bHRUYWdzO1xyXG4gICAgRGVmYXVsdERhcmtCYWNrZ3JvdW5kSW1hZ2UgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5EZWZhdWx0RGFya0JhY2tncm91bmRJbWFnZTtcclxuICAgIERlZmF1bHRMaWdodEJhY2tncm91bmRJbWFnZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRMaWdodEJhY2tncm91bmRJbWFnZTtcclxuICAgIERlZmF1bHRNZW1vQ29tcG9zaXRpb24gPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5EZWZhdWx0TWVtb0NvbXBvc2l0aW9uO1xyXG4gICAgU2hvd1Rhc2tMYWJlbCA9IHRoaXMucGx1Z2luLnNldHRpbmdzLlNob3dUYXNrTGFiZWw7XHJcblxyXG4gICAgdGhpcy5tZW1vc0NvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQXBwKTtcclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgUmVhY3RET00ucmVuZGVyKHRoaXMubWVtb3NDb21wb25lbnQsICh0aGlzIGFzIGFueSkuY29udGVudEVsKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ2xvc2UoKSB7XHJcbiAgICAvLyBOb3RoaW5nIHRvIGNsZWFuIHVwLlxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGxldCBJbnNlcnRBZnRlcjogc3RyaW5nO1xyXG5leHBvcnQgbGV0IFVzZXJOYW1lOiBzdHJpbmc7XHJcbmV4cG9ydCBsZXQgUHJvY2Vzc0VudHJpZXNCZWxvdzogc3RyaW5nO1xyXG5leHBvcnQgbGV0IFNhdmVNZW1vQnV0dG9uTGFiZWw6IHN0cmluZztcclxuZXhwb3J0IGxldCBEZWZhdWx0UHJlZml4OiBzdHJpbmc7XHJcbmV4cG9ydCBsZXQgSW5zZXJ0RGF0ZUZvcm1hdDogc3RyaW5nO1xyXG5leHBvcnQgbGV0IERlZmF1bHRFZGl0b3JMb2NhdGlvbjogc3RyaW5nO1xyXG5leHBvcnQgbGV0IFVzZUJ1dHRvblRvU2hvd0VkaXRvcjogYm9vbGVhbjtcclxuZXhwb3J0IGxldCBGb2N1c09uRWRpdG9yOiBib29sZWFuO1xyXG5leHBvcnQgbGV0IE9wZW5EYWlseU1lbW9zV2l0aE1lbW9zOiBib29sZWFuO1xyXG5leHBvcnQgbGV0IEhpZGVEb25lVGFza3M6IGJvb2xlYW47XHJcbmV4cG9ydCBsZXQgU2hhcmVGb290ZXJTdGFydDogc3RyaW5nO1xyXG5leHBvcnQgbGV0IFNoYXJlRm9vdGVyRW5kOiBzdHJpbmc7XHJcbmV4cG9ydCBsZXQgT3Blbk1lbW9zQXV0b21hdGljYWxseTogYm9vbGVhbjtcclxuLy8gZXhwb3J0IGxldCBFZGl0b3JNYXhIZWlnaHQ6IHN0cmluZztcclxuZXhwb3J0IGxldCBTaG93VGltZTogYm9vbGVhbjtcclxuZXhwb3J0IGxldCBTaG93RGF0ZTogYm9vbGVhbjtcclxuZXhwb3J0IGxldCBBZGRCbGFua0xpbmVXaGVuRGF0ZTogYm9vbGVhbjtcclxuZXhwb3J0IGxldCBBdXRvU2F2ZVdoZW5Pbk1vYmlsZTogYm9vbGVhbjtcclxuZXhwb3J0IGxldCBRdWVyeUZpbGVOYW1lOiBzdHJpbmc7XHJcbmV4cG9ydCBsZXQgRGVsZXRlRmlsZU5hbWU6IHN0cmluZztcclxuZXhwb3J0IGxldCBVc2VWYXVsdFRhZ3M6IGJvb2xlYW47XHJcbmV4cG9ydCBsZXQgRGVmYXVsdERhcmtCYWNrZ3JvdW5kSW1hZ2U6IHN0cmluZztcclxuZXhwb3J0IGxldCBEZWZhdWx0TGlnaHRCYWNrZ3JvdW5kSW1hZ2U6IHN0cmluZztcclxuZXhwb3J0IGxldCBEZWZhdWx0TWVtb0NvbXBvc2l0aW9uOiBzdHJpbmc7XHJcbmV4cG9ydCBsZXQgU2hvd1Rhc2tMYWJlbDogc3RyaW5nO1xyXG4iLCJpbXBvcnQge2FkZEljb259IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbmNvbnN0IGljb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gIE1lbW9zOiBgPHN2ZyB0PVwiMTY0MTM0ODUwNzMzOVwiIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwLWlkPVwiMjEyMFwiIHdpZHRoPVwiMTAwXCIgaGVpZ2h0PVwiMTAwXCI+PHBhdGggZD1cIk0xMjYuNjkyNjUzIDQ3OC4wOTk2MzlsLTkwLjc1NzI4MSAwYy0xOS4wMTk0MDggMC0zNC40MzczMzYgMTUuNDIzOTIzLTM0LjQzNzMzNiAzNC40MTczNTYgMCAxOC45OTI0MzQgMTUuNDE2OTI5IDM0LjQ3NzI5NyAzNC40MzczMzYgMzQuNDc3Mjk3bDkwLjc1NzI4MSAwYzE5LjAxMzQxNCAwIDM0LjQyMzM1LTE1LjQ4NDg2MyAzNC40MjMzNS0zNC40NzcyOTdDMTYxLjExNjAwMyA0OTMuNTIzNTYxIDE0NS43MDYwNjcgNDc4LjA5OTYzOSAxMjYuNjkyNjUzIDQ3OC4wOTk2Mzl6TTI0NC42NjIzMzMgMjQzLjUyNjk0M2MxMy43NDI1NjYtMTMuMTEwMTg0IDE0LjMxMDAxMS0zNC45NDg4MzYgMS4xODU4NDEtNDguNzA2Mzg4bC02Mi42NDQ3NjItNjUuNjY4ODA2Yy0xMy4xMjgxNjctMTMuNzYyNTQ3LTM0Ljk3NDgxMS0xNC4yMjkwOTEtNDguNzE3Mzc3LTEuMTE4OTA2cy0xNC4yNjEwNTkgMzQuOTExODcyLTEuMTMyODkzIDQ4LjY3NDQxOWw2Mi42NDQ3NjIgNjUuNjY4ODA2QzIwOS4xMjMwNzQgMjU2LjEzMjYyIDIzMC45MTk3NjcgMjU2LjYzNzEyNyAyNDQuNjYyMzMzIDI0My41MjY5NDN6TTU0My4wNjY2MzEgOTU3LjQyMjA4M2wtNjAuNjAzNzU3IDBjLTE4LjY1NDc2NCAwLTMzLjc5NDk2NCAxNS4xNDcxOTMtMzMuNzk0OTY0IDMzLjg2Mjg5OCAwIDE4LjY2MTc1NyAxNS4xNDAyIDMyLjcxNTAyIDMzLjc5NDk2NCAzMi43MTUwMmw2MC42MDM3NTcgMGMxOC42NTQ3NjQgMCAzMy43OTQ5NjQtMTQuMDUzMjYyIDMzLjc5NDk2NC0zMi43MTUwMkM1NzYuODYxNTk1IDk3Mi41NjgyNzcgNTYxLjcyMTM5NSA5NTcuNDIyMDgzIDU0My4wNjY2MzEgOTU3LjQyMjA4M3pNOTg4LjA3NjYxNyA0NzkuMDUwNzA5bC05MC43NTcyODEgMGMtMTkuMDE5NDA4IDAtMzQuNDM3MzM2IDE1LjQyMzkyMy0zNC40MzczMzYgMzQuNDE3MzU2czE1LjQxNjkyOSAzNC40NzcyOTcgMzQuNDM3MzM2IDM0LjQ3NzI5N2w5MC43NTcyODEgMGMxOS4wMTM0MTQgMCAzNC40MjMzNS0xNS40ODQ4NjMgMzQuNDIzMzUtMzQuNDc3Mjk3UzEwMDcuMDkwMDMgNDc5LjA1MDcwOSA5ODguMDc2NjE3IDQ3OS4wNTA3MDl6TTUxMi4yNjg3MzcgMTkyLjc2NTU2NGMtMTcyLjczNzE0MyAwLTMxMi43NTUyNyAxNTAuMDc5MjkyLTMxMi43NTUyNyAzMjIuNzQ2NTAzIDAgMTI1LjYzMDE5MiA3NC4wODA1ODMgMjMzLjk1NzI5OCAxODAuOTM2MTI4IDI4My43MDM2NjlsMCA4NC41MTgzOGMwIDE2Ljc2MjYxNCAxNS40MTA5MzUgMzEuMzU0MzUgMzQuNDIzMzUgMzEuMzU0MzUgMC41OTg0MTUgMCAxLjE5MzgzMy0wLjAxNDk4NSAxLjc4NTI1NS0wLjA0Mjk1OCAwLjYxODM5NSAwLjAyNjk3NCAxLjIzOTc4OCAwLjA0Mjk1OCAxLjg2NzE3NSAwLjA0Mjk1OGwxODcuNDc5NzMxIDBjNS45MDUyMjcgMCAxMS40NTU4MDItMS4yMjA4MDcgMTYuMjg4MDc4LTMuNDc3NjAxIDEyLjIzMTA0NC00LjY1NzQ0NyAyMC43OTU2NzEtMTUuMzgzOTYyIDIwLjc5NTY3MS0yNy44NzU3NWwwLTg0LjA1MjgzNWMxMDcuMzkxMDIxLTQ5LjUzNDU3OCAxODEuOTM1MTUxLTE1OC4xNDc0MDUgMTgxLjkzNTE1MS0yODQuMTY4MjE0QzgyNS4wMjQwMDcgMzQyLjg0Mzg1NyA2ODQuOTk3ODg4IDE5Mi43NjU1NjQgNTEyLjI2ODczNyAxOTIuNzY1NTY0ek01NzQuODYzNTQ4IDc0Mi43MTM5NjhsMCA4MC4xNzA2M2MwIDMuMTU5OTExLTAuMjIxNzgzIDUuOTc2MTU4LTAuNjQyMzcyIDguNDk2Njk0bDAgMTkuMDkyMzM2LTEyNC45MTA4OTUgMCAwLTE3LjcxNzY4Yy0wLjQyMzU4Ni0yLjg1NjIwOC0wLjY0MjM3Mi02LjEyMzAxNS0wLjY0MjM3Mi05Ljg3MDM1MWwwLTgwLjQ0MzM2M2MtOTkuMjA0MDI0LTI3Ljc1Mzg3LTE3MS45NzA4OTItMTE4LjgyMTg0Ny0xNzEuOTcwODkyLTIyNi45MzAxNjcgMC0xMzAuMDk0ODI3IDEwNS40Njg5LTI0NS41MDcwMDcgMjM1LjU3MTcxOS0yNDUuNTA3MDA3czIzNS41NjM3MjcgMTE1LjQxMjE4IDIzNS41NjM3MjcgMjQ1LjUwNzAwN0M3NDcuODMyNDY1IDYyMy45ODQwMzEgNjc0LjU3ODA3NCA3MTUuMjkzNzcyIDU3NC44NjM1NDggNzQyLjcxMzk2OHpNODk1LjQwNzIwNCAxMjkuMzI4NTc2Yy0xMy40Mjk4NzItMTMuNDI5ODcyLTM1LjIzMzU1OC0xMy40Mzk4NjItNDguNjc3NDE2IDAuMDA0OTk1bC02NC4xNzQyNjcgNjQuMTc1MjY2Yy0xMy40NDg4NTMgMTMuNDQ4ODUzLTEzLjQ0Mzg1OCAzNS4yNTc1MzQtMC4wMTM5ODYgNDguNjg3NDA2IDEzLjQyOTg3MiAxMy40Mjk4NzIgMzUuMjgxNTExIDEzLjQ3NzgyNSA0OC43MzAzNjQgMC4wMjg5NzJsNjQuMTc1MjY2LTY0LjE3NTI2NkM5MDguODg5MDI1IDE2NC42MDUwOTIgOTA4LjgzNzA3NiAxNDIuNzU4NDQ4IDg5NS40MDcyMDQgMTI5LjMyODU3NnpNNTExLjc5NjE5OSAxNTkuNjE3OTY3YzE4Ljk5MjQzNCAwIDM0LjQxNzM1Ni0xNS40MTA5MzUgMzQuNDE3MzU2LTM0LjQyMzM1bDAtOTAuNzU3MjgxYzAtMTkuMDE5NDA4LTE1LjQyMzkyMy0zNC40MzczMzYtMzQuNDE3MzU2LTM0LjQzNzMzNi0xOC45OTI0MzQgMC0zNC40NzcyOTcgMTUuNDE2OTI5LTM0LjQ3NzI5NyAzNC40MzczMzZsMCA5MC43NTcyODFDNDc3LjMxNzkwMyAxNDQuMjA4MDMxIDQ5Mi44MDI3NjYgMTU5LjYxNzk2NyA1MTEuNzk2MTk5IDE1OS42MTc5Njd6XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHAtaWQ9XCIyMTIxXCI+PC9wYXRoPjwvc3ZnPmAsXHJcbn07XHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZEljb25zKCkge1xyXG4gIE9iamVjdC5rZXlzKGljb25zKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgIGFkZEljb24oa2V5LCBpY29uc1trZXldKTtcclxuICB9KTtcclxufVxyXG4iLCJpbXBvcnQge0FwcCwgRHJvcGRvd25Db21wb25lbnQsIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmd9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHR5cGUgTWVtb3NQbHVnaW4gZnJvbSAnLi9pbmRleCc7XHJcbmltcG9ydCB7Z2V0RGFpbHlOb3RlUGF0aH0gZnJvbSAnLi9vYkNvbXBvbmVudHMvb2JVcGRhdGVNZW1vJztcclxuaW1wb3J0IG1lbW9TZXJ2aWNlIGZyb20gJy4vc2VydmljZXMvbWVtb1NlcnZpY2UnO1xyXG5pbXBvcnQge3R9IGZyb20gJy4vdHJhbnNsYXRpb25zL2hlbHBlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9zU2V0dGluZ3Mge1xyXG4gIFN0YXJ0RGF0ZTogc3RyaW5nO1xyXG4gIEluc2VydEFmdGVyOiBzdHJpbmc7XHJcbiAgVXNlck5hbWU6IHN0cmluZztcclxuICBQcm9jZXNzRW50cmllc0JlbG93OiBzdHJpbmc7XHJcbiAgTGFuZ3VhZ2U6IHN0cmluZztcclxuICBTYXZlTWVtb0J1dHRvbkxhYmVsOiBzdHJpbmc7XHJcbiAgU2hhcmVGb290ZXJTdGFydDogc3RyaW5nO1xyXG4gIFNoYXJlRm9vdGVyRW5kOiBzdHJpbmc7XHJcbiAgRGVmYXVsdFByZWZpeDogc3RyaW5nO1xyXG4gIEluc2VydERhdGVGb3JtYXQ6IHN0cmluZztcclxuICBEZWZhdWx0RWRpdG9yTG9jYXRpb246IHN0cmluZztcclxuICBVc2VCdXR0b25Ub1Nob3dFZGl0b3I6IGJvb2xlYW47XHJcbiAgRm9jdXNPbkVkaXRvcjogYm9vbGVhbjtcclxuICBPcGVuRGFpbHlNZW1vc1dpdGhNZW1vczogYm9vbGVhbjtcclxuICBIaWRlRG9uZVRhc2tzOiBib29sZWFuO1xyXG4gIE9wZW5NZW1vc0F1dG9tYXRpY2FsbHk6IGJvb2xlYW47XHJcbiAgLy8gRWRpdG9yTWF4SGVpZ2h0OiBzdHJpbmc7XHJcbiAgU2hvd1RpbWU6IGJvb2xlYW47XHJcbiAgU2hvd0RhdGU6IGJvb2xlYW47XHJcbiAgQWRkQmxhbmtMaW5lV2hlbkRhdGU6IGJvb2xlYW47XHJcbiAgQXV0b1NhdmVXaGVuT25Nb2JpbGU6IGJvb2xlYW47XHJcbiAgRGVsZXRlRmlsZU5hbWU6IHN0cmluZztcclxuICBRdWVyeUZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgVXNlVmF1bHRUYWdzOiBib29sZWFuO1xyXG4gIERlZmF1bHRMaWdodEJhY2tncm91bmRJbWFnZTogc3RyaW5nO1xyXG4gIERlZmF1bHREYXJrQmFja2dyb3VuZEltYWdlOiBzdHJpbmc7XHJcbiAgRGVmYXVsdE1lbW9Db21wb3NpdGlvbjogc3RyaW5nO1xyXG4gIFNob3dUYXNrTGFiZWw6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBNZW1vc1NldHRpbmdzID0ge1xyXG4gIFN0YXJ0RGF0ZTogJ1N1bmRheScsXHJcbiAgSW5zZXJ0QWZ0ZXI6ICcjIEpvdXJuYWwnLFxyXG4gIFVzZXJOYW1lOiAnTUVNTyDwn5iJJyxcclxuICBQcm9jZXNzRW50cmllc0JlbG93OiAnJyxcclxuICBMYW5ndWFnZTogJ2VuJyxcclxuICBTYXZlTWVtb0J1dHRvbkxhYmVsOiAnTk9URUlUJyxcclxuICBTaGFyZUZvb3RlclN0YXJ0OiAne01lbW9zTnVtfSBNZW1vcyB7VXNlZERheX0gRGF5JyxcclxuICBTaGFyZUZvb3RlckVuZDogJ+Kcje+4jyBieSB7VXNlck5hbWV9JyxcclxuICBEZWZhdWx0UHJlZml4OiAnTGlzdCcsXHJcbiAgSW5zZXJ0RGF0ZUZvcm1hdDogJ1Rhc2tzJyxcclxuICBEZWZhdWx0RWRpdG9yTG9jYXRpb246ICdUb3AnLFxyXG4gIFVzZUJ1dHRvblRvU2hvd0VkaXRvcjogZmFsc2UsXHJcbiAgRm9jdXNPbkVkaXRvcjogdHJ1ZSxcclxuICBPcGVuRGFpbHlNZW1vc1dpdGhNZW1vczogdHJ1ZSxcclxuICBIaWRlRG9uZVRhc2tzOiBmYWxzZSxcclxuICBTaG93VGFza0xhYmVsOiBmYWxzZSxcclxuICBPcGVuTWVtb3NBdXRvbWF0aWNhbGx5OiBmYWxzZSxcclxuICAvLyBFZGl0b3JNYXhIZWlnaHQ6ICcyNTAnLFxyXG4gIFNob3dUaW1lOiB0cnVlLFxyXG4gIFNob3dEYXRlOiB0cnVlLFxyXG4gIEFkZEJsYW5rTGluZVdoZW5EYXRlOiBmYWxzZSxcclxuICBBdXRvU2F2ZVdoZW5Pbk1vYmlsZTogZmFsc2UsXHJcbiAgRGVsZXRlRmlsZU5hbWU6ICdkZWxldGUnLFxyXG4gIFF1ZXJ5RmlsZU5hbWU6ICdxdWVyeScsXHJcbiAgVXNlVmF1bHRUYWdzOiBmYWxzZSxcclxuICBEZWZhdWx0TGlnaHRCYWNrZ3JvdW5kSW1hZ2U6ICcnLFxyXG4gIERlZmF1bHREYXJrQmFja2dyb3VuZEltYWdlOiAnJyxcclxuICBEZWZhdWx0TWVtb0NvbXBvc2l0aW9uOiAne1RJTUV9IHtDT05URU5UfScsXHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgTWVtb3NTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcbiAgcGx1Z2luOiBNZW1vc1BsdWdpbjtcclxuICAvL2VzbGludC1kaXNhYmxlLW5leHQtbGluZVxyXG4gIHByaXZhdGUgYXBwbHlEZWJvdW5jZVRpbWVyOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBNZW1vc1BsdWdpbikge1xyXG4gICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xyXG4gICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcbiAgfVxyXG5cclxuICBhcHBseVNldHRpbmdzVXBkYXRlKCkge1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuYXBwbHlEZWJvdW5jZVRpbWVyKTtcclxuICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMucGx1Z2luO1xyXG4gICAgdGhpcy5hcHBseURlYm91bmNlVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgICBtZW1vU2VydmljZS51cGRhdGVUYWdzU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNoYW5nZUZpbGVOYW1lKG9yaWdpbmFsRmlsZU5hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZmlsZVBhdGggPSBnZXREYWlseU5vdGVQYXRoKCk7XHJcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCArICcvJyArIG9yaWdpbmFsRmlsZU5hbWUgKyAnLm1kJztcclxuICAgIGNvbnN0IG5ld0ZpbGVQYXRoID0gZmlsZVBhdGggKyAnLycgKyBmaWxlTmFtZSArICcubWQnO1xyXG4gICAgY29uc3QgZ2V0RmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChhYnNvbHV0ZVBhdGgpO1xyXG4gICAgLy8gY29uc3QgZGVsZXRlRmlsZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoJycsIGFic29sdXRlUGF0aCk7XHJcbiAgICBhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKGdldEZpbGUsIG5ld0ZpbGVQYXRoKTtcclxuICB9XHJcblxyXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXHJcbiAgYXN5bmMgaGlkZSgpIHt9XHJcblxyXG4gIGFzeW5jIGRpc3BsYXkoKSB7XHJcbiAgICBhd2FpdCB0aGlzLnBsdWdpbi5sb2FkU2V0dGluZ3MoKTtcclxuXHJcbiAgICBjb25zdCB7Y29udGFpbmVyRWx9ID0gdGhpcztcclxuICAgIHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMScsIHt0ZXh0OiB0KCdCYXNpYyBPcHRpb25zJyl9KTtcclxuICAgIC8vIGNvbnRhaW5lckVsLmNyZWF0ZURpdihcIlwiLCAoZWwpID0+IHtcclxuICAgIC8vICAgZWwuaW5uZXJIVE1MID0gXCJCYXNpYyBPcHRpb25zXCI7XHJcbiAgICAvLyB9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnVXNlciBuYW1lIGluIE1lbW9zJykpXHJcbiAgICAgIC5zZXREZXNjKHQoXCJTZXQgeW91ciB1c2VyIG5hbWUgaGVyZS4gJ01lbW9zIPCfmI8nIEJ5IGRlZmF1bHRcIikpXHJcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICAgIHRleHRcclxuICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihERUZBVUxUX1NFVFRJTkdTLlVzZXJOYW1lKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlVzZXJOYW1lKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5Vc2VyTmFtZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdJbnNlcnQgYWZ0ZXIgaGVhZGluZycpKVxyXG4gICAgICAuc2V0RGVzYyhcclxuICAgICAgICB0KCdZb3Ugc2hvdWxkIHNldCB0aGUgc2FtZSBoZWFkaW5nIGJlbG93IGlmIHlvdSB3YW50IHRvIGluc2VydCBhbmQgcHJvY2VzcyBtZW1vcyBiZWxvdyB0aGUgc2FtZSBoZWFkaW5nLicpLFxyXG4gICAgICApXHJcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICAgIHRleHRcclxuICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihERUZBVUxUX1NFVFRJTkdTLkluc2VydEFmdGVyKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkluc2VydEFmdGVyKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbnNlcnRBZnRlciA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdQcm9jZXNzIE1lbW9zIGJlbG93JykpXHJcbiAgICAgIC5zZXREZXNjKFxyXG4gICAgICAgIHQoXHJcbiAgICAgICAgICAnT25seSBlbnRyaWVzIGJlbG93IHRoaXMgc3RyaW5nL3NlY3Rpb24gaW4geW91ciBub3RlcyB3aWxsIGJlIHByb2Nlc3NlZC4gSWYgaXQgZG9lcyBub3QgZXhpc3Qgbm8gbm90ZXMgd2lsbCBiZSBwcm9jZXNzZWQgZm9yIHRoYXQgZmlsZS4nLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgdGV4dFxyXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuUHJvY2Vzc0VudHJpZXNCZWxvdylcclxuICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5Qcm9jZXNzRW50cmllc0JlbG93KVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5Qcm9jZXNzRW50cmllc0JlbG93ID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKHQoJ1NhdmUgTWVtbyBidXR0b24gbGFiZWwnKSlcclxuICAgICAgLnNldERlc2ModChcIlRoZSB0ZXh0IHNob3duIG9uIHRoZSBzYXZlIE1lbW8gYnV0dG9uIGluIHRoZSBVSS4gJ05PVEVJVCcgYnkgZGVmYXVsdC5cIikpXHJcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICAgIHRleHRcclxuICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihERUZBVUxUX1NFVFRJTkdTLlNhdmVNZW1vQnV0dG9uTGFiZWwpXHJcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuU2F2ZU1lbW9CdXR0b25MYWJlbClcclxuICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuU2F2ZU1lbW9CdXR0b25MYWJlbCA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdGb2N1cyBvbiBlZGl0b3Igd2hlbiBvcGVuIG1lbW9zJykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ0ZvY3VzIG9uIGVkaXRvciB3aGVuIG9wZW4gbWVtb3MuIEZvY3VzIGJ5IGRlZmF1bHQuJykpXHJcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgICB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRm9jdXNPbkVkaXRvcikub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5Gb2N1c09uRWRpdG9yID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MnKSlcclxuICAgICAgLnNldERlc2ModCgnT3BlbiBkYWlseSBtZW1vcyB3aXRoIG9wZW4gbWVtb3MuIE9wZW4gYnkgZGVmYXVsdC4nKSlcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5PcGVuRGFpbHlNZW1vc1dpdGhNZW1vcykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5PcGVuRGFpbHlNZW1vc1dpdGhNZW1vcyA9IHZhbHVlO1xyXG4gICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKHQoJ09wZW4gTWVtb3Mgd2hlbiBvYnNpZGlhbiBvcGVucycpKVxyXG4gICAgICAuc2V0RGVzYyh0KCdXaGVuIGVuYWJsZSB0aGlzLCBNZW1vcyB3aWxsIG9wZW4gd2hlbiBPYnNpZGlhbiBvcGVucy4gRmFsc2UgYnkgZGVmYXVsdC4nKSlcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5PcGVuTWVtb3NBdXRvbWF0aWNhbGx5KS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLk9wZW5NZW1vc0F1dG9tYXRpY2FsbHkgPSB2YWx1ZTtcclxuICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdIaWRlIGRvbmUgdGFza3MgaW4gTWVtbyBsaXN0JykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ0hpZGUgYWxsIGRvbmUgdGFza3MgaW4gTWVtbyBsaXN0LiBTaG93IGRvbmUgdGFza3MgYnkgZGVmYXVsdC4nKSlcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5IaWRlRG9uZVRhc2tzKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkhpZGVEb25lVGFza3MgPSB2YWx1ZTtcclxuICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdTaG93IFRhc2tzIExhYmVsJykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ1Nob3cgdGFza3MgbGFiZWwgbmVhciB0aGUgdGltZSB0ZXh0LiBGYWxzZSBieSBkZWZhdWx0JykpXHJcbiAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuICAgICAgICB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuU2hvd1Rhc2tMYWJlbCkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5TaG93VGFza0xhYmVsID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnVXNlIFRhZ3MgSW4gVmF1bHQnKSlcclxuICAgICAgLnNldERlc2ModCgnVXNlIHRhZ3MgaW4gdmF1bHQgcmF0aGVyIHRoYW4gb25seSBpbiBNZW1vcy4gRmFsc2UgYnkgZGVmYXVsdC4nKSlcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5Vc2VWYXVsdFRhZ3MpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuVXNlVmF1bHRUYWdzID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMScsIHt0ZXh0OiB0KCdBZHZhbmNlZCBPcHRpb25zJyl9KTtcclxuXHJcbiAgICAvLyBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgIC8vICAgLnNldE5hbWUoJ1NldCBUaGUgTWF4LUhlaWdodCBmb3IgRWRpdG9yJylcclxuICAgIC8vICAgLnNldERlc2MoXCJTZXQgdGhlIG1heCBoZWlnaHQgZm9yIGVkaXRvciBpbiBNZW1vcy4gJzI1MCcgQnkgZGVmYXVsdFwiKVxyXG4gICAgLy8gICAuYWRkVGV4dCgodGV4dCkgPT5cclxuICAgIC8vICAgICB0ZXh0XHJcbiAgICAvLyAgICAgICAuc2V0UGxhY2Vob2xkZXIoREVGQVVMVF9TRVRUSU5HUy5FZGl0b3JNYXhIZWlnaHQpXHJcbiAgICAvLyAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRWRpdG9yTWF4SGVpZ2h0KVxyXG4gICAgLy8gICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgLy8gICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5FZGl0b3JNYXhIZWlnaHQgPSB2YWx1ZTtcclxuICAgIC8vICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XHJcbiAgICAvLyAgICAgICB9KSxcclxuICAgIC8vICAgKTtcclxuXHJcbiAgICBsZXQgZHJvcGRvd246IERyb3Bkb3duQ29tcG9uZW50O1xyXG5cclxuICAgIC8vIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgLy8gICAuc2V0TmFtZSh0KCdVSSBsYW5ndWFnZSBmb3IgZGF0ZScpKVxyXG4gICAgLy8gICAuc2V0RGVzYyh0KFwiVHJhbnNsYXRlcyB0aGUgZGF0ZSBVSSBsYW5ndWFnZS4gT25seSAnZW4nIGFuZCAnemgnIGFyZSBhdmFpbGFibGUuXCIpKVxyXG4gICAgLy8gICAuYWRkRHJvcGRvd24oYXN5bmMgKGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAvLyAgICAgZHJvcGRvd24gPSBkO1xyXG4gICAgLy8gICAgIGRyb3Bkb3duLmFkZE9wdGlvbignemgnLCAn5Lit5paHJyk7XHJcbiAgICAvLyAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdlbicsICdFbmdsaXNoJyk7XHJcbiAgICAvLyAgICAgZHJvcGRvd24uc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuTGFuZ3VhZ2UpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgLy8gICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuTGFuZ3VhZ2UgPSB2YWx1ZTtcclxuICAgIC8vICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gICB9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnRGVmYXVsdCBwcmVmaXgnKSlcclxuICAgICAgLnNldERlc2ModChcIlNldCB0aGUgZGVmYXVsdCBwcmVmaXggd2hlbiBjcmVhdGUgbWVtbywgJ0xpc3QnIGJ5IGRlZmF1bHQuXCIpKVxyXG4gICAgICAuYWRkRHJvcGRvd24oYXN5bmMgKGQ6IERyb3Bkb3duQ29tcG9uZW50KSA9PiB7XHJcbiAgICAgICAgZHJvcGRvd24gPSBkO1xyXG4gICAgICAgIGRyb3Bkb3duLmFkZE9wdGlvbignTGlzdCcsIHQoJ0xpc3QnKSk7XHJcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdUYXNrJywgdCgnVGFzaycpKTtcclxuICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5EZWZhdWx0UHJlZml4KS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRQcmVmaXggPSB2YWx1ZTtcclxuICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnRGVmYXVsdCBpbnNlcnQgZGF0ZSBmb3JtYXQnKSlcclxuICAgICAgLnNldERlc2ModChcIlNldCB0aGUgZGVmYXVsdCBkYXRlIGZvcm1hdCB3aGVuIGluc2VydCBkYXRlIGJ5IEAsICdUYXNrcycgYnkgZGVmYXVsdC5cIikpXHJcbiAgICAgIC5hZGREcm9wZG93bihhc3luYyAoZDogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgICBkcm9wZG93biA9IGQ7XHJcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdUYXNrcycsICdUYXNrcycpO1xyXG4gICAgICAgIGRyb3Bkb3duLmFkZE9wdGlvbignRGF0YXZpZXcnLCAnRGF0YXZpZXcnKTtcclxuICAgICAgICBkcm9wZG93bi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbnNlcnREYXRlRm9ybWF0KS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkluc2VydERhdGVGb3JtYXQgPSB2YWx1ZTtcclxuICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnU2hvdyBUaW1lIFdoZW4gQ29weSBSZXN1bHRzJykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ1Nob3cgdGltZSB3aGVuIHlvdSBjb3B5IHJlc3VsdHMsIGxpa2UgMTI6MDAuIENvcHkgdGltZSBieSBkZWZhdWx0LicpKVxyXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlNob3dUaW1lKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLlNob3dUaW1lID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnU2hvdyBEYXRlIFdoZW4gQ29weSBSZXN1bHRzJykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ1Nob3cgZGF0ZSB3aGVuIHlvdSBjb3B5IHJlc3VsdHMsIGxpa2UgW1syMDIyLTAxLTAxXV0uIENvcHkgZGF0ZSBieSBkZWZhdWx0LicpKVxyXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlNob3dEYXRlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLlNob3dEYXRlID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnQWRkIEJsYW5rIExpbmUgQmV0d2VlbiBEaWZmZXJlbnQgRGF0ZScpKVxyXG4gICAgICAuc2V0RGVzYyh0KCdBZGQgYmxhbmsgbGluZSB3aGVuIGNvcHkgcmVzdWx0IHdpdGggZGF0ZS4gTm8gYmxhbmsgbGluZSBieSBkZWZhdWx0LicpKVxyXG4gICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcbiAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkFkZEJsYW5rTGluZVdoZW5EYXRlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkFkZEJsYW5rTGluZVdoZW5EYXRlID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnRmlsZSBOYW1lIG9mIFJlY3ljbGUgQmluJykpXHJcbiAgICAgIC5zZXREZXNjKHQoXCJTZXQgdGhlIGZpbGVuYW1lIGZvciByZWN5Y2xlIGJpbi4gJ2RlbGV0ZScgQnkgZGVmYXVsdFwiKSlcclxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgdGV4dFxyXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuRGVsZXRlRmlsZU5hbWUpXHJcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRGVsZXRlRmlsZU5hbWUpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hhbmdlRmlsZU5hbWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRGVsZXRlRmlsZU5hbWUsIHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuRGVsZXRlRmlsZU5hbWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnRmlsZSBOYW1lIG9mIFF1ZXJ5IEZpbGUnKSlcclxuICAgICAgLnNldERlc2ModChcIlNldCB0aGUgZmlsZW5hbWUgZm9yIHF1ZXJ5IGZpbGUuICdxdWVyeScgQnkgZGVmYXVsdFwiKSlcclxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgdGV4dFxyXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuUXVlcnlGaWxlTmFtZSlcclxuICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5RdWVyeUZpbGVOYW1lKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoYW5nZUZpbGVOYW1lKHRoaXMucGx1Z2luLnNldHRpbmdzLlF1ZXJ5RmlsZU5hbWUsIHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuUXVlcnlGaWxlTmFtZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gxJywge3RleHQ6IHQoJ01vYmlsZSBPcHRpb25zJyl9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnRGVmYXVsdCBlZGl0b3IgcG9zaXRpb24gb24gbW9iaWxlJykpXHJcbiAgICAgIC5zZXREZXNjKHQoXCJTZXQgdGhlIGRlZmF1bHQgZWRpdG9yIHBvc2l0aW9uIG9uIE1vYmlsZSwgJ1RvcCcgYnkgZGVmYXVsdC5cIikpXHJcbiAgICAgIC5hZGREcm9wZG93bihhc3luYyAoZDogRHJvcGRvd25Db21wb25lbnQpID0+IHtcclxuICAgICAgICBkcm9wZG93biA9IGQ7XHJcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdUb3AnLCB0KCdUb3AnKSk7XHJcbiAgICAgICAgZHJvcGRvd24uYWRkT3B0aW9uKCdCb3R0b20nLCB0KCdCb3R0b20nKSk7XHJcbiAgICAgICAgZHJvcGRvd24uc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRGVmYXVsdEVkaXRvckxvY2F0aW9uKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRFZGl0b3JMb2NhdGlvbiA9IHZhbHVlO1xyXG4gICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdVc2UgYnV0dG9uIHRvIHNob3cgZWRpdG9yIG9uIG1vYmlsZScpKVxyXG4gICAgICAuc2V0RGVzYyh0KCdTZXQgYSBmbG9hdCBidXR0b24gdG8gY2FsbCBlZGl0b3Igb24gbW9iaWxlLiBPbmx5IHdoZW4gZWRpdG9yIGxvY2F0ZWQgYXQgdGhlIGJvdHRvbSB3b3Jrcy4nKSlcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5Vc2VCdXR0b25Ub1Nob3dFZGl0b3IpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuVXNlQnV0dG9uVG9TaG93RWRpdG9yID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMScsIHt0ZXh0OiB0KCdTaGFyZSBPcHRpb25zJyl9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnU2hhcmUgTWVtb3MgSW1hZ2UgRm9vdGVyIFN0YXJ0JykpXHJcbiAgICAgIC5zZXREZXNjKFxyXG4gICAgICAgIHQoXHJcbiAgICAgICAgICBcIlNldCBhbnl0aGluZyB5b3Ugd2FudCBoZXJlLCB1c2Uge01lbW9zTnVtfSB0byBkaXNwbGF5IE51bWJlciBvZiBtZW1vcywge1VzZWREYXl9IGZvciBkYXlzLiAne01lbW9zTnVtfSBNZW1vcyB7VXNlZERheX0gRGF5cycgQnkgZGVmYXVsdFwiLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgdGV4dFxyXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuU2hhcmVGb290ZXJTdGFydClcclxuICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5TaGFyZUZvb3RlclN0YXJ0KVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5TaGFyZUZvb3RlclN0YXJ0ID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKHQoJ1NoYXJlIE1lbW9zIEltYWdlIEZvb3RlciBFbmQnKSlcclxuICAgICAgLnNldERlc2ModChcIlNldCBhbnl0aGluZyB5b3Ugd2FudCBoZXJlLCB1c2Uge1VzZXJOYW1lfSBhcyB5b3VyIHVzZXJuYW1lLiAn4pyN77iPIEJ5IHtVc2VyTmFtZX0nIEJ5IGRlZmF1bHRcIikpXHJcbiAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG4gICAgICAgIHRleHRcclxuICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcihERUZBVUxUX1NFVFRJTkdTLlNoYXJlRm9vdGVyRW5kKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlNoYXJlRm9vdGVyRW5kKVxyXG4gICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5TaGFyZUZvb3RlckVuZCA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGx5U2V0dGluZ3NVcGRhdGUoKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICApO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdCYWNrZ3JvdW5kIEltYWdlIGluIExpZ2h0IFRoZW1lJykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ1NldCBiYWNrZ3JvdW5kIGltYWdlIGluIGxpZ2h0IHRoZW1lLiBTZXQgc29tZXRoaW5nIGxpa2UgXCJEYWlseS9vbmUucG5nXCInKSlcclxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgdGV4dFxyXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuRGVmYXVsdExpZ2h0QmFja2dyb3VuZEltYWdlKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRMaWdodEJhY2tncm91bmRJbWFnZSlcclxuICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuRGVmYXVsdExpZ2h0QmFja2dyb3VuZEltYWdlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKHQoJ0JhY2tncm91bmQgSW1hZ2UgaW4gRGFyayBUaGVtZScpKVxyXG4gICAgICAuc2V0RGVzYyh0KCdTZXQgYmFja2dyb3VuZCBpbWFnZSBpbiBkYXJrIHRoZW1lLiBTZXQgc29tZXRoaW5nIGxpa2UgXCJEYWlseS9vbmUucG5nXCInKSlcclxuICAgICAgLmFkZFRleHQoKHRleHQpID0+XHJcbiAgICAgICAgdGV4dFxyXG4gICAgICAgICAgLnNldFBsYWNlaG9sZGVyKERFRkFVTFRfU0VUVElOR1MuRGVmYXVsdERhcmtCYWNrZ3JvdW5kSW1hZ2UpXHJcbiAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRGVmYXVsdERhcmtCYWNrZ3JvdW5kSW1hZ2UpXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHREYXJrQmFja2dyb3VuZEltYWdlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTZXR0aW5nc1VwZGF0ZSgpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKHQoJ1NhdmUgU2hhcmVkIEltYWdlIFRvIEZvbGRlciBGb3IgTW9iaWxlJykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ1NhdmUgaW1hZ2UgdG8gZm9sZGVyIGZvciBtb2JpbGUuIEZhbHNlIGJ5IERlZmF1bHQnKSlcclxuICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG4gICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5BdXRvU2F2ZVdoZW5Pbk1vYmlsZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5BdXRvU2F2ZVdoZW5Pbk1vYmlsZSA9IHZhbHVlO1xyXG4gICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcblxyXG4gICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbCgnaDEnLCB7dGV4dDogdCgnRXhwZXJpbWVudGFsIE9wdGlvbnMnKX0pO1xyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSh0KCdEZWZhdWx0IE1lbW8gQ29tcG9zaXRpb24nKSlcclxuICAgICAgLnNldERlc2MoXHJcbiAgICAgICAgdChcclxuICAgICAgICAgICdTZXQgZGVmYXVsdCBtZW1vIGNvbXBvc2l0aW9uLCB5b3Ugc2hvdWxkIHVzZSB7VElNRX0gYXMgXCJISDptbVwiIGFuZCB7Q09OVEVOVH0gYXMgY29udGVudC4gXCJ7VElNRX0ge0NPTlRFTlR9XCIgYnkgZGVmYXVsdCcsXHJcbiAgICAgICAgKSxcclxuICAgICAgKVxyXG4gICAgICAuYWRkVGV4dCgodGV4dCkgPT5cclxuICAgICAgICB0ZXh0XHJcbiAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoREVGQVVMVF9TRVRUSU5HUy5EZWZhdWx0TWVtb0NvbXBvc2l0aW9uKVxyXG4gICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRNZW1vQ29tcG9zaXRpb24pXHJcbiAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLkRlZmF1bHRNZW1vQ29tcG9zaXRpb24gPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5hcHBseVNldHRpbmdzVXBkYXRlKCk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgKTtcclxuXHJcbiAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMScsIHt0ZXh0OiB0KCdTYXkgVGhhbmsgWW91Jyl9KTtcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUodCgnRG9uYXRlJykpXHJcbiAgICAgIC5zZXREZXNjKHQoJ0lmIHlvdSBsaWtlIHRoaXMgcGx1Z2luLCBjb25zaWRlciBkb25hdGluZyB0byBzdXBwb3J0IGNvbnRpbnVlZCBkZXZlbG9wbWVudDonKSlcclxuICAgICAgLy8gLnNldENsYXNzKFwiQVQtZXh0cmFcIilcclxuICAgICAgLmFkZEJ1dHRvbigoYnQpID0+IHtcclxuICAgICAgICBidC5idXR0b25FbC5vdXRlckhUTUwgPSBgPGEgaHJlZj1cImh0dHBzOi8vd3d3LmJ1eW1lYWNvZmZlZS5jb20vYm9uaW5hbGxcIj48aW1nIHNyYz1cImh0dHBzOi8vaW1nLmJ1eW1lYWNvZmZlZS5jb20vYnV0dG9uLWFwaS8/dGV4dD1CdXkgbWUgYSBjb2ZmZWUmZW1vamk9JnNsdWc9Ym9uaW5hbGwmYnV0dG9uX2NvbG91cj02NDk1RUQmZm9udF9jb2xvdXI9ZmZmZmZmJmZvbnRfZmFtaWx5PUludGVyJm91dGxpbmVfY29sb3VyPTAwMDAwMCZjb2ZmZWVfY29sb3VyPUZGREQwMFwiPjwvYT5gO1xyXG4gICAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHtQbHVnaW4sIE5vdGljZSwgRmlsZVZpZXcsIFBsYXRmb3JtfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7TWVtb3MsIEZvY3VzT25FZGl0b3IsIE9wZW5EYWlseU1lbW9zV2l0aE1lbW9zfSBmcm9tICcuL21lbW9zJztcclxuaW1wb3J0IHtNRU1PU19WSUVXX1RZUEV9IGZyb20gJy4vY29uc3RhbnRzJztcclxuaW1wb3J0IGFkZEljb25zIGZyb20gJy4vb2JDb21wb25lbnRzL2N1c3RvbUljb25zJztcclxuaW1wb3J0ICcuL2hlbHBlcnMvcG9seWZpbGwnO1xyXG5pbXBvcnQgJy4vbGVzcy9nbG9iYWwubGVzcyc7XHJcbmltcG9ydCB7TWVtb3NTZXR0aW5nVGFiLCBERUZBVUxUX1NFVFRJTkdTLCBNZW1vc1NldHRpbmdzfSBmcm9tICcuL3NldHRpbmcnO1xyXG5pbXBvcnQge2FwcEhhc0RhaWx5Tm90ZXNQbHVnaW5Mb2FkZWR9IGZyb20gJ29ic2lkaWFuLWRhaWx5LW5vdGVzLWludGVyZmFjZSc7XHJcbi8vIGltcG9ydCB7IGVkaXRvcklucHV0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9FZGl0b3IvRWRpdG9yXCI7XHJcbmltcG9ydCBzaG93RGFpbHlNZW1vRGlhcnlEaWFsb2cgZnJvbSAnLi9jb21wb25lbnRzL0RhaWx5TWVtb0RpYXJ5RGlhbG9nJztcclxuaW1wb3J0IHt0fSBmcm9tICcuL3RyYW5zbGF0aW9ucy9oZWxwZXInO1xyXG4vLyBpbXBvcnQgeyBnbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlc1wiO1xyXG5cclxuLy8gZGVjbGFyZSBtb2R1bGUgXCJvYnNpZGlhblwiIHtcclxuLy8gICBpbnRlcmZhY2UgQXBwIHtcclxuLy8gICAgICAgaXNNb2JpbGU6IGJvb2xlYW47XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG4vLyBjb25zdCBtb25rZXlQYXRjaENvbnNvbGUgPSAocGx1Z2luOiBQbHVnaW4pID0+IHtcclxuXHJcbi8vICAgaWYgKCFQbGF0Zm9ybS5pc01vYmlsZSkge1xyXG4vLyAgICAgICByZXR1cm47XHJcbi8vICAgfVxyXG5cclxuLy8gICBjb25zdCBsb2dGaWxlID0gYCR7cGx1Z2luLm1hbmlmZXN0LmRpcn0vbG9ncy50eHRgO1xyXG4vLyAgIGNvbnN0IGxvZ3M6IHN0cmluZ1tdID0gW107XHJcbi8vICAgY29uc3QgbG9nTWVzc2FnZXMgPSAocHJlZml4OiBzdHJpbmcpID0+ICguLi5tZXNzYWdlczogdW5rbm93bltdKSA9PiB7XHJcbi8vICAgICAgIGxvZ3MucHVzaChgXFxuWyR7cHJlZml4fV1gKTtcclxuLy8gICAgICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSB7XHJcbi8vICAgICAgICAgICBsb2dzLnB1c2goU3RyaW5nKG1lc3NhZ2UpKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgICBwbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXIud3JpdGUobG9nRmlsZSwgbG9ncy5qb2luKFwiIFwiKSk7XHJcbi8vICAgfTtcclxuXHJcbi8vICAgY29uc29sZS5kZWJ1ZyA9IGxvZ01lc3NhZ2VzKFwiZGVidWdcIik7XHJcbi8vICAgY29uc29sZS5lcnJvciA9IGxvZ01lc3NhZ2VzKFwiZXJyb3JcIik7XHJcbi8vICAgY29uc29sZS5pbmZvID0gbG9nTWVzc2FnZXMoXCJpbmZvXCIpO1xyXG4vLyAgIGNvbnNvbGUubG9nID0gbG9nTWVzc2FnZXMoXCJsb2dcIik7XHJcbi8vICAgY29uc29sZS53YXJuID0gbG9nTWVzc2FnZXMoXCJ3YXJuXCIpO1xyXG4vLyB9O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVtb3NQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG4gIHB1YmxpYyBzZXR0aW5nczogTWVtb3NTZXR0aW5ncztcclxuICBhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zb2xlLmxvZygnb2JzaWRpYW4tbWVtb3MgbG9hZGluZy4uLicpO1xyXG4gICAgLy8gdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XHJcbiAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgLy8gYXdhaXQgdGhpcy5pbml0TG9jYWxpemF0aW9uKCk7XHJcblxyXG4gICAgLy8gbW9ua2V5UGF0Y2hDb25zb2xlKHRoaXMpO1xyXG5cclxuICAgIHRoaXMucmVnaXN0ZXJWaWV3KE1FTU9TX1ZJRVdfVFlQRSwgKGxlYWYpID0+IG5ldyBNZW1vcyhsZWFmLCB0aGlzKSk7XHJcblxyXG4gICAgLy8gdGhpcy5yZWdpc3RlclZpZXcoXHJcbiAgICAvLyAgIE1FTU9TX1ZJRVdfVFlQRSxcclxuICAgIC8vICAgKGxlYWY6IFdvcmtzcGFjZUxlYWYpID0+ICh0aGlzLnZpZXcgPSBuZXcgTWVtb3MobGVhZiwgdGhpcy5hcHAucGx1Z2luKSlcclxuICAgIC8vICk7XHJcblxyXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBNZW1vc1NldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuXHJcbiAgICBhZGRJY29ucygpO1xyXG4gICAgdGhpcy5hZGRSaWJib25JY29uKCdNZW1vcycsIHQoJ3JpYmJvbkljb25UaXRsZScpLCAoKSA9PiB7XHJcbiAgICAgIG5ldyBOb3RpY2UoJ09wZW4gTWVtb3MgU3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgICAgIHRoaXMub3Blbk1lbW9zKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoYXBwSGFzRGFpbHlOb3Rlc1BsdWdpbkxvYWRlZCgpKSB7XHJcbiAgICAgIG5ldyBOb3RpY2UoJ0NoZWNrIGlmIHlvdSBvcGVuZWQgRGFpbHkgTm90ZXMgUGx1Z2luJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6ICdvcGVuLW1lbW9zJyxcclxuICAgICAgbmFtZTogJ09wZW4gTWVtb3MnLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5vcGVuTWVtb3MoKSxcclxuICAgICAgaG90a2V5czogW10sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogJ2ZvY3VzLW9uLW1lbW9zLWVkaXRvcicsXHJcbiAgICAgIG5hbWU6ICdGb2N1cyBPbiBNZW1vcyBFZGl0b3InLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5mb2N1c09uRWRpdG9yKCksXHJcbiAgICAgIGhvdGtleXM6IFtdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6ICdzaG93LWRhaWx5LW1lbW8nLFxyXG4gICAgICBuYW1lOiAnU2hvdyBEYWlseSBNZW1vJyxcclxuICAgICAgY2FsbGJhY2s6ICgpID0+IHRoaXMub3BlbkRhaWx5TWVtbygpLFxyXG4gICAgICBob3RrZXlzOiBbXSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkQ29tbWFuZCh7XHJcbiAgICAgIGlkOiAnbm90ZS1pdCcsXHJcbiAgICAgIG5hbWU6ICdOb3RlIEl0JyxcclxuICAgICAgY2FsbGJhY2s6ICgpID0+IHRoaXMubm90ZUl0KCksXHJcbiAgICAgIGhvdGtleXM6IFtdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6ICdmb2N1cy1vbi1zZWFyY2gtYmFyJyxcclxuICAgICAgbmFtZTogJ1NlYXJjaCBJdCcsXHJcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLnNlYXJjaEl0KCksXHJcbiAgICAgIGhvdGtleXM6IFtdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6ICdjaGFuZ2Utc3RhdHVzJyxcclxuICAgICAgbmFtZTogJ0NoYW5nZSBTdGF0dXMgQmV0d2VlbiBUYXNrIE9yIExpc3QnLFxyXG4gICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5jaGFuZ2VTdGF0dXMoKSxcclxuICAgICAgaG90a2V5czogW10sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSh0aGlzLm9uTGF5b3V0UmVhZHkuYmluZCh0aGlzKSk7XHJcbiAgICBjb25zb2xlLmxvZyh0KCd3ZWxjb21lJykpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcclxuICAgIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG4gICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuICB9XHJcblxyXG4gIG9udW5sb2FkKCkge1xyXG4gICAgdGhpcy5hcHAud29ya3NwYWNlLmRldGFjaExlYXZlc09mVHlwZShNRU1PU19WSUVXX1RZUEUpO1xyXG4gICAgbmV3IE5vdGljZSgnQ2xvc2UgTWVtb3MgU3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkxheW91dFJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbGVhdmVzID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShNRU1PU19WSUVXX1RZUEUpO1xyXG4gICAgaWYgKGxlYXZlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLkZvY3VzT25FZGl0b3IpIHtcclxuICAgICAgICBjb25zdCBsZWFmID0gbGVhdmVzWzBdO1xyXG4gICAgICAgIGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpLmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLk9wZW5NZW1vc0F1dG9tYXRpY2FsbHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vcGVuTWVtb3MoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9wZW5EYWlseU1lbW8oKSB7XHJcbiAgICBjb25zdCB3b3Jrc3BhY2VMZWF2ZXMgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKE1FTU9TX1ZJRVdfVFlQRSk7XHJcbiAgICBpZiAoT3BlbkRhaWx5TWVtb3NXaXRoTWVtb3MgPT09IHRydWUpIHtcclxuICAgICAgaWYgKHdvcmtzcGFjZUxlYXZlcyAhPT0gdW5kZWZpbmVkICYmIHdvcmtzcGFjZUxlYXZlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0aGlzLm9wZW5NZW1vcygpO1xyXG4gICAgICAgIHNob3dEYWlseU1lbW9EaWFyeURpYWxvZygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNob3dEYWlseU1lbW9EaWFyeURpYWxvZygpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzaG93RGFpbHlNZW1vRGlhcnlEaWFsb2coKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9wZW5NZW1vcygpIHtcclxuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMuYXBwLndvcmtzcGFjZTtcclxuICAgIHdvcmtzcGFjZS5kZXRhY2hMZWF2ZXNPZlR5cGUoTUVNT1NfVklFV19UWVBFKTtcclxuICAgIGNvbnN0IGxlYWYgPSB3b3Jrc3BhY2UuZ2V0TGVhZihcclxuICAgICAgIVBsYXRmb3JtLmlzTW9iaWxlICYmIHdvcmtzcGFjZS5hY3RpdmVMZWFmICYmIHdvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXcgaW5zdGFuY2VvZiBGaWxlVmlldyxcclxuICAgICk7XHJcbiAgICBhd2FpdCBsZWFmLnNldFZpZXdTdGF0ZSh7dHlwZTogTUVNT1NfVklFV19UWVBFfSk7XHJcbiAgICB3b3Jrc3BhY2UucmV2ZWFsTGVhZihsZWFmKTtcclxuICAgIGlmIChGb2N1c09uRWRpdG9yKSB7XHJcbiAgICAgIGlmIChsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgbGVhZi52aWV3LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJykuZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VhcmNoSXQoKSB7XHJcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSB0aGlzLmFwcC53b3Jrc3BhY2U7XHJcbiAgICBjb25zdCBsZWF2ZXMgPSB3b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKE1FTU9TX1ZJRVdfVFlQRSk7XHJcbiAgICBpZiAobGVhdmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgbGVhZiA9IGxlYXZlc1swXTtcclxuICAgICAgd29ya3NwYWNlLnNldEFjdGl2ZUxlYWYobGVhZik7XHJcbiAgICAgIChsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLnNlYXJjaC1iYXItaW5wdXRlciAudGV4dC1pbnB1dCcpIGFzIEhUTUxFbGVtZW50KS5mb2N1cygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcGVuTWVtb3MoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZvY3VzT25FZGl0b3IoKSB7XHJcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSB0aGlzLmFwcC53b3Jrc3BhY2U7XHJcbiAgICBjb25zdCBsZWF2ZXMgPSB3b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKE1FTU9TX1ZJRVdfVFlQRSk7XHJcbiAgICBpZiAobGVhdmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgbGVhZiA9IGxlYXZlc1swXTtcclxuICAgICAgd29ya3NwYWNlLnNldEFjdGl2ZUxlYWYobGVhZik7XHJcbiAgICAgIGxlYWYudmlldy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpLmZvY3VzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW5NZW1vcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbm90ZUl0KCkge1xyXG4gICAgY29uc3Qgd29ya3NwYWNlID0gdGhpcy5hcHAud29ya3NwYWNlO1xyXG4gICAgY29uc3QgbGVhdmVzID0gd29ya3NwYWNlLmdldExlYXZlc09mVHlwZShNRU1PU19WSUVXX1RZUEUpO1xyXG4gICAgaWYgKGxlYXZlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGxlYWYgPSBsZWF2ZXNbMF07XHJcbiAgICAgIHdvcmtzcGFjZS5zZXRBY3RpdmVMZWFmKGxlYWYpO1xyXG4gICAgICBsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLm1lbW8tZWRpdG9yIC5jb25maXJtLWJ0bicpLmNsaWNrKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW5NZW1vcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlU3RhdHVzKCkge1xyXG4gICAgY29uc3Qgd29ya3NwYWNlID0gdGhpcy5hcHAud29ya3NwYWNlO1xyXG4gICAgY29uc3QgbGVhdmVzID0gd29ya3NwYWNlLmdldExlYXZlc09mVHlwZShNRU1PU19WSUVXX1RZUEUpO1xyXG4gICAgaWYgKGxlYXZlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGxlYWYgPSBsZWF2ZXNbMF07XHJcbiAgICAgIHdvcmtzcGFjZS5zZXRBY3RpdmVMZWFmKGxlYWYpO1xyXG4gICAgICBsZWFmLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLmxpc3Qtb3ItdGFzaycpLmNsaWNrKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW5NZW1vcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gYXN5bmMgaW5pdExvY2FsaXphdGlvbigpIHtcclxuICAvLyAgIGkxOG5leHQuaW5pdCh7XHJcbiAgLy8gICAgIHJlc291cmNlczoge1xyXG4gIC8vICAgICAgIGVuOiB7XHJcbiAgLy8gICAgICAgICB0cmFuc2xhdGlvbjogVFJBTlNMQVRJT05TX0VOLFxyXG4gIC8vICAgICAgIH0sXHJcbiAgLy8gICAgICAgemg6IHtcclxuICAvLyAgICAgICAgIHRyYW5zbGF0aW9uOiBUUkFOU0xBVElPTlNfWkgsXHJcbiAgLy8gICAgICAgfSxcclxuICAvLyAgICAgfSxcclxuICAvLyAgIH0pO1xyXG5cclxuICAvLyAgIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2UodGhpcy5zZXR0aW5ncy5MYW5ndWFnZSk7XHJcbiAgLy8gfVxyXG59XHJcbiJdLCJuYW1lcyI6WyJyZXF1aXJlJCQwIiwibiIsInAiLCJxIiwiciIsInQiLCJCIiwiRCIsIkYiLCJFIiwiRyIsIkgiLCJJIiwiTSIsIk4iLCJPIiwieSIsIlIiLCJUIiwiUCIsIlMiLCJfcmVhY3RfMTdfMF8yX3JlYWN0TW9kdWxlIiwiX3NjaGVkdWxlcl8wXzIwXzJfc2NoZWR1bGVyTW9kdWxlIiwibSIsInJlcXVpcmUkJDEiLCJyZXF1aXJlJCQyIiwiamEiLCJkYSIsImRlIiwiaWQiLCJoaSIsIl9yZWFjdERvbV8xN18wXzJfcmVhY3REb21Nb2R1bGUiLCJkZWZhdWx0U3RhdGUiLCJtb21lbnQiLCJ1dGlscyIsIm1haW4iLCJEYWlseU5vdGVzRm9sZGVyTWlzc2luZ0Vycm9yIiwiZ2V0QWxsRGFpbHlOb3RlcyIsImdsb2JhbFN0b3JlLmRlZmF1bHRTdGF0ZSIsImxvY2F0aW9uU3RvcmUuZGVmYXVsdFN0YXRlIiwibWVtb1N0b3JlLmRlZmF1bHRTdGF0ZSIsInVzZXJTdG9yZS5kZWZhdWx0U3RhdGUiLCJxdWVyeVN0b3JlLmRlZmF1bHRTdGF0ZSIsImRhaWx5Tm90ZXNTdG9yZS5kZWZhdWx0U3RhdGUiLCJnbG9iYWxTdG9yZS5yZWR1Y2VyIiwibG9jYXRpb25TdG9yZS5yZWR1Y2VyIiwibWVtb1N0b3JlLnJlZHVjZXIiLCJ1c2VyU3RvcmUucmVkdWNlciIsInF1ZXJ5U3RvcmUucmVkdWNlciIsImRhaWx5Tm90ZXNTdG9yZS5yZWR1Y2VyIiwiY3JlYXRlQ29udGV4dCIsImdldERhaWx5Tm90ZSIsImdldEFsbExpbmVzRnJvbUZpbGUiLCJnZXREYWlseU5vdGVTZXR0aW5ncyIsIlRGaWxlIiwiZ2V0SURGcm9tTGluZSIsImdldFBpbm5lZERhdGVGcm9tTGluZSIsIm5vcm1hbGl6ZVBhdGgiLCJOb3RpY2UiLCJnZXREYXRlRnJvbUZpbGUiLCJjcmVhdGVEYWlseU5vdGUiLCJleHRyYWN0Q29udGVudGZyb21UZXh0IiwiYXBpIiwidXNlU3RhdGUiLCJ1c2VDYWxsYmFjayIsImpzeFJ1bnRpbWVNb2R1bGUiLCJqc3hSdW50aW1lLmpzeCIsImpzeFJ1bnRpbWUuanN4cyIsImpzeFJ1bnRpbWUuRnJhZ21lbnQiLCJPbmx5V2hlbiIsInByb3BzIiwiY2hpbGRyZW4iLCJ3aGVuIiwiT25seSIsImdsb2JhbCIsIl9kZWZpbmVQcm9wZXJ0eSIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiX3R5cGVvZiIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJfZ2V0UHJvdG90eXBlT2YiLCJfc2V0UHJvdG90eXBlT2YiLCJfY2xhc3NDYWxsQ2hlY2siLCJfaW5oZXJpdHMiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsIl9jcmVhdGVDbGFzcyIsIlJlYWN0IiwiUmVhY3RET00iLCJDdXN0b21FdmVudCIsImxvY2FsZSIsIlRJdGVtIiwiZW50aXR5IiwibmFtZSIsImNoYXIiLCJmaWxlIiwiTG9hZGluZyIsImRhdGEiLCJhY3R1YWxUb2tlbiIsIkVkaXRvciIsImZvcndhcmRSZWYiLCJyZWYiLCJnbG9iYWxTdGF0ZSIsInVzZVRpbnlVbmRvSGlzdG9yeUNhY2hlIiwidXNlQ29udGV4dCIsImFwcENvbnRleHQiLCJjbGFzc05hbWUiLCJpbml0aWFsQ29udGVudCIsInBsYWNlaG9sZGVyIiwic2hvd0NvbmZpcm1CdG4iLCJzaG93Q2FuY2VsQnRuIiwib25Db25maXJtQnRuQ2xpY2siLCJoYW5kbGVDb25maXJtQnRuQ2xpY2tDYWxsYmFjayIsIm9uQ2FuY2VsQnRuQ2xpY2siLCJoYW5kbGVDYW5jZWxCdG5DbGlja0NhbGxiYWNrIiwib25Db250ZW50Q2hhbmdlIiwiaGFuZGxlQ29udGVudENoYW5nZUNhbGxiYWNrIiwiZWRpdG9yUmVmIiwidXNlUmVmIiwidGlueVVuZG9SZWYiLCJyZWZyZXNoIiwidXNlUmVmcmVzaCIsImN1cnJlbnQiLCJ2YWx1ZSIsInRpbnlVbmRvQWN0aW9uc0NhY2hlIiwidGlueVVuZG9JbmRleENhY2hlIiwic3RvcmFnZSIsImdldCIsIlRpbnlVbmRvIiwiaW50ZXJ2YWwiLCJpbml0aWFsQWN0aW9ucyIsImluaXRpYWxJbmRleCIsInN1YnNjcmliZSIsImFjdGlvbnMiLCJpbmRleCIsInNldCIsImRlc3Ryb3kiLCJyZW1vdmUiLCJzdHlsZSIsImhlaWdodCIsInNjcm9sbEhlaWdodCIsImVsZW1lbnQiLCJmb2N1cyIsIkZvY3VzT25FZGl0b3IiLCJpbnNlcnRUZXh0IiwicmF3VGV4dCIsInByZXZWYWx1ZSIsInNsaWNlIiwic2VsZWN0aW9uU3RhcnQiLCJzZXRDb250ZW50IiwidGV4dCIsImdldENvbnRlbnQiLCJoYW5kbGVJbnNlcnRUcmlnZ2VyIiwiZXZlbnQiLCJmaWxlTWFuYWdlciIsImFwcFN0b3JlIiwiZ2V0U3RhdGUiLCJkYWlseU5vdGVzU3RhdGUiLCJhcHAiLCJjdXJyZW50VHJpZ2dlciIsInJlbW92ZUNoYXJOdW0iLCJ1bmRlZmluZWQiLCJsZW5ndGgiLCJiZWhpbmRDaGFyTnVtIiwiaSIsInRlc3QiLCJpdGVtIiwiZmlsZVBhdGgiLCJnZW5lcmF0ZU1hcmtkb3duTGluayIsInBhdGgiLCJjb250YWlucyIsImV4dGVuc2lvbiIsImhhbmRsZUVkaXRvcklucHV0IiwiaGFuZGxlRWRpdG9yS2V5RG93biIsInN0b3BQcm9wYWdhdGlvbiIsImNvZGUiLCJtZXRhS2V5IiwiY3RybEtleSIsImhhbmRsZUNvbW1vbkNvbmZpcm1CdG5DbGljayIsImdldEVkaXRvckNvbnRlbnRDYWNoZSIsInJlc2V0U3RhdGUiLCJoYW5kbGVDb21tb25DYW5jZWxCdG5DbGljayIsImVkaXRvckNvbnRlbnRDYWNoZSIsImdldEVkaXRvckNvbnRlbnQiLCJydGEiLCJ0ZXh0YXJlYSIsIm1pbkhlaWdodCIsIm1pbldpZHRoIiwibWF4SGVpZ2h0Iiwib3ZlcmZsb3dZIiwiZGF0YVByb3ZpZGVyIiwidG9rZW4iLCJ1c2VkVGFncyIsIm1hcCIsImNvbXBvbmVudCIsImFmdGVyV2hpdGVzcGFjZSIsIm91dHB1dCIsImdldFN1Z2dlc3Rpb25zIiwidG9vbHMiLCJTYXZlTWVtb0J1dHRvbkxhYmVsIiwidXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZUVmZmVjdCIsImZpbmRJbmRleCIsIk1JTExJU0VDT05EU19JTl9EQVkiLCJNSUxMSVNFQ09ORFNfSU5fV0VFSyIsImZvcm1hdERpc3RhbmNlIiwiZm9ybWF0TG9uZyIsImZvcm1hdFJlbGF0aXZlIiwibG9jYWxpemUiLCJtYXRjaCIsImZvcm1hdHRlcnMiLCJsaWdodEZvcm1hdHRlcnMiLCJkZWZhdWx0TG9jYWxlIiwibG9uZ0Zvcm1hdHRlcnMiLCJzZXREYXRlTW9udGgiLCJpc0ZvY3VzYWJsZSIsIlJlYWN0LnVzZUxheW91dEVmZmVjdCIsIlJlYWN0LnVzZUVmZmVjdCIsImVmZmVjdCIsImdldENvbXB1dGVkU3R5bGUiLCJtaW4iLCJtYXgiLCJtYXRoTWF4IiwibWF0aE1pbiIsImhhc2giLCJhbGxQbGFjZW1lbnRzIiwicGxhY2VtZW50cyIsInBvcHBlck9mZnNldHMiLCJjb21wdXRlU3R5bGVzIiwiYXBwbHlTdHlsZXMiLCJvZmZzZXQiLCJmbGlwIiwicHJldmVudE92ZXJmbG93IiwiYXJyb3ciLCJoaWRlIiwiUmVhY3QudXNlUmVmIiwiUmVhY3QudXNlU3RhdGUiLCJSZWFjdC51c2VNZW1vIiwiaXNFcXVhbCIsImNyZWF0ZVBvcHBlciIsImRlZmF1bHRDcmVhdGVQb3BwZXIiLCJSZWFjdFByb3BUeXBlc1NlY3JldCIsIl9wcm9wVHlwZXNfMTVfOF8xX3Byb3BUeXBlc01vZHVsZSIsImNyZWF0ZUZvY3VzVHJhcCIsIm9iaiIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiY29uc3RydWN0b3IiLCJwcm90b3R5cGUiLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwidGFyZ2V0IiwiZGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5Iiwia2V5IiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwibyIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiRGVyaXZlZCIsImhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiU3VwZXIiLCJyZXN1bHQiLCJOZXdUYXJnZXQiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiYXJndW1lbnRzIiwiYXBwbHkiLCJzZWxmIiwiY2FsbCIsIlJlZmVyZW5jZUVycm9yIiwic2hhbSIsIlByb3h5IiwiQm9vbGVhbiIsInZhbHVlT2YiLCJlIiwiZ2V0UHJvdG90eXBlT2YiLCJyZXF1aXJlIiwiUHJvcFR5cGVzIiwiX3JlcXVpcmUiLCJGb2N1c1RyYXAiLCJfUmVhY3QkQ29tcG9uZW50IiwiX3N1cGVyIiwiX2NyZWF0ZVN1cGVyIiwiX3RoaXMiLCJ0YWlsb3JlZEZvY3VzVHJhcE9wdGlvbnMiLCJyZXR1cm5Gb2N1c09uRGVhY3RpdmF0ZSIsImZvY3VzVHJhcE9wdGlvbnMiLCJvcHRpb25OYW1lIiwiaGFzT3duUHJvcGVydHkiLCJvblBvc3REZWFjdGl2YXRlIiwiZm9jdXNUcmFwRWxlbWVudHMiLCJjb250YWluZXJFbGVtZW50cyIsInVwZGF0ZVByZXZpb3VzRWxlbWVudCIsImRvY3VtZW50Iiwib3B0aW9uVmFsdWUiLCJub2RlIiwiX3RoaXMkZ2V0RG9jdW1lbnQiLCJnZXREb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJFcnJvciIsImNvbmNhdCIsImdldE5vZGVGb3JPcHRpb24iLCJwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQiLCJjdXJyZW50RG9jdW1lbnQiLCJhY3RpdmVFbGVtZW50IiwiX3RoaXMyIiwiX3RoaXMkdGFpbG9yZWRGb2N1c1RyIiwiY2hlY2tDYW5SZXR1cm5Gb2N1cyIsIl90aGlzJHRhaWxvcmVkRm9jdXNUcjIiLCJwcmV2ZW50U2Nyb2xsIiwiZm9jdXNUcmFwIiwiZGVhY3RpdmF0ZSIsInJldHVybkZvY3VzIiwiZmluaXNoRGVhY3RpdmF0aW9uIiwicmV0dXJuRm9jdXNOb2RlIiwiZ2V0UmV0dXJuRm9jdXNOb2RlIiwiY2FuUmV0dXJuRm9jdXMiLCJ0aGVuIiwiZm9jdXNUcmFwRWxlbWVudERPTU5vZGVzIiwiZmluZERPTU5vZGUiLCJub2Rlc0V4aXN0Iiwic29tZSIsIl9jcmVhdGVGb2N1c1RyYXAiLCJhY3RpdmUiLCJhY3RpdmF0ZSIsInBhdXNlZCIsInBhdXNlIiwic2V0dXBGb2N1c1RyYXAiLCJwcmV2UHJvcHMiLCJ1cGRhdGVDb250YWluZXJFbGVtZW50cyIsImhhc0FjdGl2YXRlZCIsImhhc0RlYWN0aXZhdGVkIiwiaGFzUGF1c2VkIiwiaGFzVW5wYXVzZWQiLCJkZWFjdGl2YXRlVHJhcCIsInVucGF1c2UiLCJfdGhpczMiLCJjaGlsZCIsIkNoaWxkcmVuIiwib25seSIsInR5cGUiLCJGcmFnbWVudCIsImNvbXBvc2VkUmVmQ2FsbGJhY2siLCJjaGlsZFdpdGhSZWYiLCJjbG9uZUVsZW1lbnQiLCJDb21wb25lbnQiLCJFbGVtZW50VHlwZSIsIkVsZW1lbnQiLCJGdW5jdGlvbiIsInByb3BUeXBlcyIsImJvb2wiLCJzaGFwZSIsIm9iamVjdCIsIm9uQWN0aXZhdGUiLCJmdW5jIiwib25Qb3N0QWN0aXZhdGUiLCJjaGVja0NhbkZvY3VzVHJhcCIsIm9uRGVhY3RpdmF0ZSIsImluaXRpYWxGb2N1cyIsIm9uZU9mVHlwZSIsImluc3RhbmNlT2YiLCJzdHJpbmciLCJmYWxsYmFja0ZvY3VzIiwiZXNjYXBlRGVhY3RpdmF0ZXMiLCJjbGlja091dHNpZGVEZWFjdGl2YXRlcyIsInNldFJldHVybkZvY3VzIiwiYWxsb3dPdXRzaWRlQ2xpY2siLCJhcnJheU9mIiwiZGVmYXVsdFByb3BzIiwibW9kdWxlIiwiZ2V0Q3Vyc29yUG9zdGlvbiIsImlucHV0Iiwib2Zmc2V0TGVmdCIsImlucHV0WCIsIm9mZnNldFRvcCIsImlucHV0WSIsIm9mZnNldEhlaWdodCIsImlucHV0SCIsIm9mZnNldFdpZHRoIiwiaW5wdXRXIiwic2VsZWN0aW9uRW5kIiwic2VsZWN0aW9uUG9pbnQiLCJkaXYiLCJjcmVhdGVFbGVtZW50IiwiY29weVN0eWxlIiwid2luZG93Iiwic2V0UHJvcGVydHkiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicG9zaXRpb24iLCJ2aXNpYmlsaXR5Iiwid2hpdGVTcGFjZSIsInN3YXAiLCJpbnB1dFZhbHVlIiwidGFnTmFtZSIsInJlcGxhY2UiLCJ0ZXh0Q29udGVudCIsInN1YnN0cmluZyIsInNwYW4iLCJhcHBlbmRDaGlsZCIsImJvZHkiLCJzcGFuWCIsInNwYW5ZIiwic3BhbkgiLCJzcGFuVyIsInJlbW92ZUNoaWxkIiwieCIsImgiLCJ3IiwiaXNMaXN0IiwiaXNFZGl0b3IiLCJpc0VkaXRvckdvIiwicG9zaXRpb25YIiwiTWVtb0VkaXRvciIsImlzTGlzdFNob3duIiwidG9nZ2xlTGlzdCIsInVzZVRvZ2dsZSIsImlzRWRpdG9yU2hvd24iLCJ0b2dnbGVFZGl0b3IiLCJwcmV2R2xvYmFsU3RhdGVSZWYiLCJzZWxlY3RlZCIsInNldFNlbGVjdGVkIiwiaXNQb3BwZXJPcGVuIiwic2V0SXNQb3BwZXJPcGVuIiwiZGFpbHlOb3Rlc1NlcnZpY2UiLCJwb3BwZXJSZWYiLCJwb3BwZXJFbGVtZW50Iiwic2V0UG9wcGVyRWxlbWVudCIsInBvcHBlciIsIkRlZmF1bHRQcmVmaXgiLCJpc01vYmlsZSIsImlubmVyV2lkdGgiLCJVc2VCdXR0b25Ub1Nob3dFZGl0b3IiLCJEZWZhdWx0RWRpdG9yTG9jYXRpb24iLCJQbGF0Zm9ybSIsImxlYXZlcyIsIndvcmtzcGFjZSIsImdldExlYXZlc09mVHlwZSIsIk1FTU9TX1ZJRVdfVFlQRSIsIm1lbW9zSGVpZ2h0IiwibGVhZlZpZXciLCJsZWFmIiwidmlldyIsImNvbnRhaW5lckVsIiwiaW5uZXJIZWlnaHQiLCJkaXZUaGlzIiwibWVtb0VkaXRvckRpdiIsInNyYyIsInNob3dFZGl0b3JTdmciLCJidXR0b25Ub3AiLCJidXR0b25MZWZ0IiwidG9wIiwibGVmdCIsIm9uY2xpY2siLCJzY2FsZUVsZW1lbnRBbmkiLCJhbmltYXRlIiwidHJhbnNmb3JtIiwiZHVyYXRpb24iLCJpdGVyYXRpb25zIiwiSW5maW5pdHkiLCJyZXZlcnNlIiwicHJlcGVuZCIsIm1lbW9saXN0U2Nyb2xsIiwib25zY3JvbGwiLCJzY2FsZUVkaXRvckVsZW1lbnRBbmkiLCJvcGFjaXR5Iiwic2NhbGVPbmVFbGVtZW50QW5pIiwiY2FuY2VsIiwidXNlUG9wcGVyIiwicGxhY2VtZW50IiwibW9kaWZpZXJzIiwib3B0aW9ucyIsImFsbG93ZWRBdXRvUGxhY2VtZW50cyIsInJvb3RCb3VuZGFyeSIsInNlbGV0b3JQb3B1cFdpZHRoIiwiY2xvc2VQb3BwZXIiLCJtYXJrTWVtb0lkIiwiZWRpdG9yQ3VycmVudFZhbHVlIiwibWVtb0xpbmtUZXh0Iiwic2V0TWFya01lbW9JZCIsImVkaXRNZW1vSWQiLCJlZGl0TWVtbyIsIm1lbW9TZXJ2aWNlIiwiZ2V0TWVtb0J5SWQiLCJjb250ZW50IiwiaGFuZGxlUGFzdGVFdmVudCIsImNsaXBib2FyZERhdGEiLCJmaWxlcyIsInByZXZlbnREZWZhdWx0IiwidXJsIiwiaGFuZGxlVXBsb2FkRmlsZSIsImhhbmRsZURyb3BFdmVudCIsImRhdGFUcmFuc2ZlciIsImhhbmRsZUNsaWNrRXZlbnQiLCJoYW5kbGVLZXlEb3duRXZlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInN0YXJ0c1dpdGgiLCJpbWFnZSIsInJlc291cmNlU2VydmljZSIsInVwbG9hZCIsImVycm9yIiwiaGFuZGxlU2F2ZUJ0bkNsaWNrIiwiZ2xvYmFsU3RhdGVTZXJ2aWNlIiwicmVwbGFjZUFsbCIsInByZXZNZW1vIiwiZWRpdGVkTWVtbyIsInVwZGF0ZU1lbW8iLCJtZW1vVHlwZSIsInVwZGF0ZWRBdCIsImdldERhdGVUaW1lU3RyaW5nIiwiRGF0ZSIsIm5vdyIsInNldEVkaXRNZW1vSWQiLCJuZXdNZW1vIiwiY3JlYXRlTWVtbyIsInB1c2hNZW1vIiwiY2xlYXJRdWVyeSIsIm1lc3NhZ2UiLCJoYW5kbGVDYW5jZWxCdG5DbGljayIsImhhbmRsZUNvbnRlbnRDaGFuZ2UiLCJ0ZW1wRGl2IiwiaW5uZXJIVE1MIiwiaW5uZXJUZXh0IiwidHJpbSIsImN1cnJlbnRWYWx1ZSIsInByZXZTdHJpbmciLCJuZXh0U3RyaW5nIiwiZW5kc1dpdGgiLCJoYW5kbGVEYXRlSW5zZXJ0VHJpZ2dlciIsImRhdGUiLCJ0b2RheU1vbWVudCIsIkluc2VydERhdGVGb3JtYXQiLCJmb3JtYXQiLCJzZXRTZWxlY3Rpb25SYW5nZSIsImhhbmRsZUNoYW5nZVN0YXR1cyIsImhhbmRsZVNob3dFZGl0b3IiLCJmbGFnIiwiaGFuZGxlVGFnVGV4dEJ0bkNsaWNrIiwibmV4dFZhbHVlIiwiY3Vyc29ySW5kZXgiLCJ1cGRhdGVEYXRlU2VsZWN0b3JQb3B1cFBvc2l0aW9uIiwiZWRpdG9yV2lkdGgiLCJjbGllbnRXaWR0aCIsImhhbmRsZVVwbG9hZEZpbGVCdG5DbGljayIsImlucHV0RWwiLCJtdWx0aXBsZSIsImFjY2VwdCIsIm9uY2hhbmdlIiwiY2xpY2siLCJzaG93RWRpdFN0YXR1cyIsImVkaXRvckNvbmZpZyIsInVzZU1lbW8iLCJzaG93VG9vbHMiLCJ0YWciLCJpbWFnZVN2ZyIsImpvdXJuYWxTdmciLCJ0YXNrU3ZnIiwic3R5bGVzIiwiYXR0cmlidXRlcyIsIlNlYXJjaEJhciIsImxvY2F0aW9uU3RhdGUiLCJxdWVyeSIsImlzU2VhcmNoQmFyU2hvdyIsInRvZ2dsZVNlYXJjaGJhciIsImhhbmRsZU1lbW9UeXBlSXRlbUNsaWNrIiwicHJldlR5cGUiLCJsb2NhdGlvblNlcnZpY2UiLCJzZXRNZW1vVHlwZVF1ZXJ5IiwiaGFuZGxlVGV4dFF1ZXJ5SW5wdXQiLCJjdXJyZW50VGFyZ2V0Iiwic2V0VGV4dFF1ZXJ5IiwibW91c2VJbiIsIm1vdXNlT3V0Iiwic2VhcmNoIiwibWVtb1NwZWNpYWxUeXBlcyIsImlkeCIsInByZXZSZXF1ZXN0VGltZXN0YW1wIiwiTWVtb3NIZWFkZXIiLCJmaWx0ZXIiLCJpc01vYmlsZVZpZXciLCJxdWVyeVN0YXRlIiwicXVlcmllcyIsInRpdGxlVGV4dCIsInNldFRpdGxlVGV4dCIsInF1ZXJ5U2VydmljZSIsImdldFF1ZXJ5QnlJZCIsInRpdGxlIiwiaGFuZGxlTWVtb1RleHRDbGljayIsImZldGNoQWxsTWVtb3MiLCJjYXRjaCIsImhhbmRsZVNob3dTaWRlYmFyQnRuQ2xpY2siLCJzZXRTaG93U2lkZXJiYXJJbk1vYmlsZVZpZXciLCJtZW51U3ZnIiwiUHJvdmlkZXIiLCJzdG9yZSIsImNvbnRleHQiLCJDb250ZXh0IiwiYXBwU3RhdGUiLCJzZXRBcHBTdGF0ZSIsInVuc3Vic2NyaWJlIiwibnMiLCJCYXNlRGlhbG9nIiwiY2xpY2tTcGFjZURlc3Ryb3kiLCJoYW5kbGVTcGFjZUNsaWNrZWQiLCJoYW5kbGVFc2NDbGlja2VkIiwiY29uZmlnIiwiRGlhbG9nQ29tcG9uZW50IiwiYXBwZW5kIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJjbGFzc0xpc3QiLCJhZGQiLCJjYnMiLCJ1bm1vdW50Q29tcG9uZW50QXROb2RlIiwiQU5JTUFUSU9OX0RVUkFUSU9OIiwiZGlhbG9nUHJvcHMiLCJ1c2VBcHBDb250ZXh0IiwicmVuZGVyIiwiUHJldmlld0ltYWdlRGlhbG9nIiwiaW1nVXJsIiwiZmlsZXBhdGgiLCJpbWdSZWYiLCJpbWdXaWR0aCIsInNldEltZ1dpZHRoIiwidmF1bHQiLCJnZXRJbWFnZVNpemUiLCJ3aWR0aCIsImhhbmRsZUNsb3NlQnRuQ2xpY2siLCJoYW5kbGVEZWNyZWFzZUltYWdlU2l6ZSIsImhhbmRsZUluY3JlYXNlSW1hZ2VTaXplIiwiY29udmVydEJhc2U2NFRvQmxvYiIsImJhc2U2NCIsImJ5dGVzIiwiYXRvYiIsImFiIiwiQXJyYXlCdWZmZXIiLCJpYSIsIlVpbnQ4QXJyYXkiLCJjaGFyQ29kZUF0IiwiQmxvYiIsImNvcHlJbWFnZVRvQ2xpcGJvYXJkIiwibXlCYXNlNjQiLCJzcGxpdCIsImJsb2JJbnB1dCIsImNsaXBib2FyZEl0ZW1JbnB1dCIsIkNsaXBib2FyZEl0ZW0iLCJuYXZpZ2F0b3IiLCJ3cml0ZSIsImJ1ZmZlciIsImFkYXB0ZXIiLCJyZWFkQmluYXJ5IiwiYXJyIiwiYmxvYiIsImNsb3NlIiwiSW1hZ2UiLCJhbHQiLCJyZWZlcnJlclBvbGljeSIsImhhbmRsZUltYWdlQ2xpY2siLCJnZXRQYXRoT2ZJbWFnZSIsImdldFJlc291cmNlUGF0aCIsImRldGVjdFdpa2lJbnRlcm5hbExpbmsiLCJsaW5lVGV4dCIsIm1ldGFkYXRhQ2FjaGUiLCJpbnRlcm5hbEZpbGVOYW1lIiwiV0lLSV9JTUFHRV9VUkxfUkVHIiwiZXhlYyIsImludGVybmFsQWx0TmFtZSIsImdldEZpcnN0TGlua3BhdGhEZXN0IiwiZGVjb2RlVVJJQ29tcG9uZW50IiwibGlua1RleHQiLCJhbHRUZXh0IiwiaW1hZ2VQYXRoIiwiZGV0ZWN0TURJbnRlcm5hbExpbmsiLCJNQVJLRE9XTl9VUkxfUkVHIiwiTWVtb0NhcmREaWFsb2ciLCJtZW1vIiwic2V0TWVtbyIsImNyZWF0ZWRBdFN0ciIsImNyZWF0ZWRBdCIsImxpbmtNZW1vcyIsInNldExpbmtNZW1vcyIsImxpbmtlZE1lbW9zIiwic2V0TGlua2VkTWVtb3MiLCJleHRlcm5hbEltYWdlVXJscyIsImludGVybmFsSW1hZ2VVcmxzIiwiYWxsTWFya2Rvd25MaW5rIiwiYWxsSW50ZXJuYWxMaW5rIiwiSU1BR0VfVVJMX1JFRyIsImFsbEV4dGVybmFsSW1hZ2VVcmxzIiwiYW5vdGhlckV4dGVybmFsSW1hZ2VVcmxzIiwiQXJyYXkiLCJmcm9tIiwiTUFSS0RPV05fV0VCX1VSTF9SRUciLCJvbmUiLCJwdXNoIiwidHdvIiwiZmV0Y2hMaW5rZWRNZW1vcyIsIm1hdGNoZWRBcnIiLCJtYXRjaEFsbCIsIk1FTU9fTElOS19SRUciLCJtYXRjaFJlcyIsIm1lbW9UZW1wIiwiZGF0ZVN0ciIsImdldERhdGVTdHJpbmciLCJnZXRMaW5rZWRNZW1vcyIsInNvcnQiLCJhIiwiYiIsImdldFRpbWVTdGFtcEJ5RGF0ZSIsImhhbmRsZU1lbW9Db250ZW50Q2xpY2siLCJ0YXJnZXRFbCIsIm5leHRNZW1vSWQiLCJkYXRhc2V0IiwibmV4dE1lbW8iLCJoYW5kbGVMaW5rZWRNZW1vQ2xpY2siLCJoYW5kbGVFZGl0TWVtb0J0bkNsaWNrIiwiZWRpdCIsIl9faHRtbCIsImZvcm1hdE1lbW9Db250ZW50IiwiXyIsImJvdHRvbSIsInpJbmRleCIsInJhd3RleHQiLCJwYXJzZUh0bWxUb1Jhd1RleHQiLCJTaGFyZU1lbW9JbWFnZURpYWxvZyIsInByb3BzTWVtbyIsIm1lbW9zIiwibWVtb1N0YXRlIiwibWVtb3NMZW5ndGgiLCJjcmVhdGVkRGF5cyIsIk1hdGgiLCJjZWlsIiwiZm9vdGVyRW5kIiwiU2hhcmVGb290ZXJFbmQiLCJVc2VyTmFtZSIsImZvb3RlclN0YXJ0IiwiU2hhcmVGb290ZXJTdGFydCIsInRvU3RyaW5nIiwic2hvcnRjdXRJbWdVcmwiLCJzZXRTaG9ydGN1dEltZ1VybCIsImltZ0Ftb3VudCIsInNldEltZ0Ftb3VudCIsIm1lbW9FbFJlZiIsInNoYXJlRGlhbG9nQmFja2dyb3VuZENvbG9yIiwiYmFja2dyb3VuZENvbG9yIiwicGl4ZWxSYXRpbyIsImRldmljZVBpeGVsUmF0aW8iLCJjb252ZXJ0QmFja2dyb3VuZFRvQmFzZTY0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwib25sb2FkZW5kIiwiYmFzZTY0VXJsIiwicmVhZEFzRGF0YVVSTCIsImNoYW5nZUJhY2tncm91bmRJbWFnZSIsImltYWdlVXJsIiwibGlnaHRCYWNrZ3JvdW5kSW1hZ2UiLCJlbmNvZGVVUkkiLCJsaWdodEJhY2tncm91bmQiLCJkYXJrQmFja2dyb3VuZEltYWdlIiwiZGFya0JhY2tncm91bmQiLCJleGlzdHMiLCJEZWZhdWx0TGlnaHRCYWNrZ3JvdW5kSW1hZ2UiLCJEZWZhdWx0RGFya0JhY2tncm91bmRJbWFnZSIsIm1lbW9TaGFyZURpdiIsImJhY2tncm91bmRJbWFnZSIsImhhbmRsZUNvcHl0b0NsaXBib2FyZEJ0bkNsaWNrIiwiZGl2cyIsImdldEF0dHJpYnV0ZSIsImFGaWxlIiwiQXV0b1NhdmVXaGVuT25Nb2JpbGUiLCJhcnJheUJ1ZmZlciIsImV4dCIsImRhaWx5Tm90ZXMiLCJjcmVhdGVCaW5hcnkiLCJnZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMiLCJoYW5kbGVJbWFnZU9uTG9hZCIsImV2Iiwic2hhcmUiLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRSZXBlYXQiLCJNZW1vIiwic2hvd0NvbmZpcm1EZWxldGVCdG4iLCJ0b2dnbGVDb25maXJtRGVsZXRlQnRuIiwiaGFuZGxlU2hvd01lbW9TdG9yeURpYWxvZyIsImhhbmRsZU1hcmtNZW1vQ2xpY2siLCJlbGVtIiwiaGFuZGxlRWRpdE1lbW9DbGljayIsImhhbmRsZVNvdXJjZU1lbW9DbGljayIsImhhbmRsZURlbGV0ZU1lbW9DbGljayIsImhpZGVNZW1vQnlJZCIsImhhbmRsZU1vdXNlTGVhdmVNZW1vV3JhcHBlciIsImhhbmRsZUdlbk1lbW9JbWFnZUJ0bkNsaWNrIiwiaGFuZGxlTWVtb1R5cGVTaG93IiwiU2hvd1Rhc2tMYWJlbCIsInRhc2tCbGFuayIsInRhc2siLCJoYW5kbGVNZW1vS2V5RG93biIsImhhbmRsZU1lbW9Eb3VibGVDbGljayIsIm1lbW9JZCIsIm1vcmUiLCJtZW1vaWQiLCJlbmNvZGVIdG1sIiwicGFyc2VSYXdUZXh0VG9IdG1sIiwiam9pbiIsInNob3VsZFVzZU1hcmtkb3duUGFyc2VyIiwic2hvdWxkSGlkZUltYWdlVXJsIiwicGFyc2VNYXJrZWRUb0h0bWwiLCJUQUdfUkVHIiwiRklSU1RfVEFHX1JFRyIsIkxJTktfUkVHIiwiTURfTElOS19SRUciLCJ0ZW1wRGl2Q29udGFpbmVyIiwiYyIsImNvcHlTaG93bk1lbW9zIiwiTWVtb0xpc3QiLCJpc0ZldGNoaW5nIiwic2V0RmV0Y2hTdGF0dXMiLCJ3cmFwcGVyRWxlbWVudCIsInRhZ1F1ZXJ5IiwibWVtb0NvbnRlbnRUeXBlIiwidGV4dFF1ZXJ5IiwicXVlcnlJZCIsInF1ZXJ5RmlsdGVyIiwic2hvd01lbW9GaWx0ZXIiLCJ0byIsInNob3duTWVtb3MiLCJIaWRlRG9uZVRhc2tzIiwic2hvdWxkU2hvdyIsImZpbHRlcnMiLCJKU09OIiwicGFyc2UiLCJxdWVyeXN0cmluZyIsImlzQXJyYXkiLCJjaGVja1Nob3VsZFNob3dNZW1vV2l0aEZpbHRlcnMiLCJ0YWdzU2V0IiwiU2V0IiwiaXRlbXMiLCJ0ZW1wIiwiTk9QX0ZJUlNUX1RBR19SRUciLCJoYXMiLCJpbmNsdWRlcyIsImdldE15QWxsRGFpbHlOb3RlcyIsInNjcm9sbFRvIiwiaGFuZGxlTWVtb0xpc3RDbGljayIsImN1cnJUYWdRdWVyeSIsInNldFRhZ1F1ZXJ5Iiwic291cmNlUGF0aCIsIm9wZW5MaW5rVGV4dCIsIk1lbW9GaWx0ZXIiLCJzaG93RmlsdGVyIiwiaGFuZGxlQ29weUNsaWNrIiwibWVtb3NCeURhdGUiLCJnZXRNZW1vc0J5RGF0ZSIsInF1ZXJ5RGFpbHlNZW1vcyIsInRyYW5zZmVyTWVtb3NJbnRvVGV4dCIsImNvcHlUZXh0VG9DbGlwYm9hcmQiLCJzZXRNZW1vRmlsdGVyIiwiZ2V0VGV4dFdpdGhNZW1vVHlwZSIsInNldEZyb21BbmRUb1F1ZXJ5IiwiY29weSIsIkRlbGV0ZWRNZW1vIiwiaGFuZGxlRGVsZXRlZE1lbW9BY3Rpb24iLCJkZWxldGVkQXRTdHIiLCJkZWxldGVkQXQiLCJkZWxldGVNZW1vQnlJZCIsImhhbmRsZVJlc3RvcmVNZW1vQ2xpY2siLCJyZXN0b3JlTWVtb0J5SWQiLCJNZW1vVHJhc2giLCJsb2FkaW5nU3RhdGUiLCJ1c2VMb2FkaW5nIiwiZGVsZXRlZE1lbW9zIiwic2V0RGVsZXRlZE1lbW9zIiwiZmV0Y2hEZWxldGVkTWVtb3MiLCJmaW5hbGx5Iiwic2V0RmluaXNoIiwiaXNMb2FkaW5nIiwiUHJlZmVyZW5jZXNTZWN0aW9uIiwic2hvdWxkU3BsaXRNZW1vV29yZCIsImRlbW9NZW1vQ29udGVudCIsImhhbmRsZU9wZW5UaW55VW5kb0NoYW5nZWQiLCJzZXRBcHBTZXR0aW5nIiwiaGFuZGxlU3BsaXRXb3Jkc1ZhbHVlQ2hhbmdlZCIsImhhbmRsZUhpZGVJbWFnZVVybFZhbHVlQ2hhbmdlZCIsImhhbmRsZVVzZU1hcmtkb3duUGFyc2VyQ2hhbmdlZCIsImhhbmRsZUV4cG9ydEJ0bkNsaWNrIiwiZm9ybWF0ZWRNZW1vcyIsImpzb25TdHIiLCJzdHJpbmdpZnkiLCJzZXRBdHRyaWJ1dGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJkaXNwbGF5IiwiY2hlY2tib3hBY3RpdmUiLCJjaGVja2JveCIsIlNldHRpbmciLCJob21lUm91dGVyIiwiTWVtb3MiLCJBYm91dFNpdGVEaWFsb2ciLCJNZW51QnRuc1BvcHVwIiwic2hvd25TdGF0dXMiLCJzZXRTaG93blN0YXR1cyIsInBvcHVwRWxSZWYiLCJoYW5kbGVDbGlja091dHNpZGUiLCJjYXB0dXJlIiwib25jZSIsImhhbmRsZU15QWNjb3VudEJ0bkNsaWNrIiwic2V0dGluZyIsIm9wZW4iLCJvcGVuVGFiQnlJZCIsImhhbmRsZU1lbW9zVHJhc2hCdG5DbGljayIsInB1c2hIaXN0b3J5IiwiaGFuZGxlQWJvdXRCdG5DbGljayIsIkRhaWx5TWVtbyIsInRpbWVTdHIiLCJnZXRUaW1lU3RyaW5nIiwiRGF0ZVBpY2tlciIsImRhdGVzdGFtcCIsImhhbmRsZURhdGVTdGFtcENoYW5nZSIsImN1cnJlbnREYXRlU3RhbXAiLCJzZXRDdXJyZW50RGF0ZVN0YW1wIiwiZ2V0TW9udGhGaXJzdERheURhdGVTdGFtcCIsImZpcnN0RGF0ZSIsImZpcnN0RGF0ZURheSIsImdldERheSIsImRheUxpc3QiLCJnZXRUaW1lIiwiREFJTFlfVElNRVNUQU1QIiwiZGF5QW1vdW50IiwiZ2V0TW9udGhEYXlBbW91bnQiLCJoYW5kbGVEYXRlSXRlbUNsaWNrIiwiaGFuZGxlQ2hhbmdlTW9udGhCdG5DbGljayIsInllYXIiLCJnZXRGdWxsWWVhciIsIm1vbnRoIiwiZ2V0TW9udGgiLCJuZXh0RGF0ZVN0YW1wIiwiYXJyb3dMZWZ0IiwiYXJyb3dSaWdodCIsImQiLCJkYXRlVGVtcCIsImN1cnJlbnREYXRlIiwibmV4dE1vbnRoRGF0ZSIsInRpbWVzdGFtcCIsIkRhaWx5TWVtb0RpYXJ5RGlhbG9nIiwic2V0TWVtb3MiLCJnZXREYXRlU3RhbXBCeURhdGUiLCJzaG93RGF0ZVBpY2tlciIsInRvZ2dsZVNob3dEYXRlUGlja2VyIiwibWVtb3NFbFJlZiIsInNldERhaWx5TWVtb3MiLCJkYWlseU1lbW9zIiwiaGFuZGxlU2hhcmVCdG5DbGljayIsImhhbmRsZURhdGFQaWNrZXJDaGFuZ2UiLCJnZXREYXRlIiwiVXNlckJhbm5lciIsInRhZ3MiLCJ1c2VyU3RhdGUiLCJ1c2VyIiwidXNlcm5hbWUiLCJzaG91bGRTaG93UG9wdXBCdG5zIiwic2V0U2hvdWxkU2hvd1BvcHVwQnRucyIsImhhbmRsZVVzZXJuYW1lQ2xpY2siLCJoYW5kbGVQb3B1cEJ0bkNsaWNrIiwic2lkZWJhckVsIiwicG9wdXBFbCIsInNjcm9sbFRvcCIsInNob3dEYWlseU1lbW9EaWFyeURpYWxvZyIsIm51bGxJdGVtIiwiU2VsZWN0b3IiLCJkYXRhU291cmNlIiwiaGFuZGxlVmFsdWVDaGFuZ2VkIiwic2hvd1NlbGVjdG9yIiwidG9nZ2xlU2VsZWN0b3JTdGF0dXMiLCJzZWxldG9yRWxSZWYiLCJjdXJyZW50SXRlbSIsImhhbmRsZUl0ZW1DbGljayIsImhhbmRsZUN1cnJlbnRWYWx1ZUNsaWNrIiwiQ3JlYXRlUXVlcnlEaWFsb2ciLCJzZXRUaXRsZSIsInNldEZpbHRlcnMiLCJyZXF1ZXN0U3RhdGUiLCJzaG93bk1lbW9MZW5ndGgiLCJxdWVyeVRlbXAiLCJoYW5kbGVUaXRsZUlucHV0Q2hhbmdlIiwiZWRpdGVkUXVlcnkiLCJ1cGRhdGVRdWVyeSIsImVkaXRRdWVyeSIsImdldE15QWxsUXVlcmllcyIsImNyZWF0ZVF1ZXJ5IiwicHVzaFF1ZXJ5IiwiaGFuZGxlQWRkRmlsdGVyQmVuQ2xpY2siLCJsYXN0RmlsdGVyIiwiZ2V0RGVmYXVsdEZpbHRlciIsImhhbmRsZUZpbHRlckNoYW5nZSIsImhhbmRsZUZpbHRlclJlbW92ZSIsImYiLCJGaWx0ZXJJbnB1dGVyIiwiaW5wdXRFbGVtZW50cyIsInNldElucHV0RWxlbWVudHMiLCJvcGVyYXRvckVsZW1lbnQiLCJrZXlzIiwiZmlsdGVyQ29uc3RzIiwidmFsdWVzIiwib3BlcmF0b3JzIiwib3BlcmF0b3IiLCJoYW5kbGVPcGVyYXRvckNoYW5nZSIsInZhbHVlRWxlbWVudCIsImhhbmRsZVZhbHVlQ2hhbmdlIiwiaGFuZGxlUmVsYXRpb25DaGFuZ2UiLCJyZWxhdGlvbiIsImhhbmRsZVR5cGVDaGFuZ2UiLCJvcHMiLCJoYW5kbGVSZW1vdmVCdG5DbGljayIsInJlbGF0aW9uQ29uc3RzIiwiTWVtb0ZpbHRlcklucHV0ZXIiLCJRdWVyeUxpc3QiLCJzb3J0ZWRRdWVyaWVzIiwicGlubmVkQXQiLCJzaG93Q3JlYXRlUXVlcnlEaWFsb2ciLCJpc1N1Y2NlZWQiLCJRdWVyeUl0ZW1Db250YWluZXIiLCJpc0FjdGl2ZSIsInNob3dBY3Rpb25CdG5zIiwidG9nZ2xlU2hvd0FjdGlvbkJ0bnMiLCJoYW5kbGVRdWVyeUNsaWNrIiwiaGFuZGxlU2hvd0FjdGlvbkJ0bkNsaWNrIiwiaGFuZGxlQWN0aW9uQnRuQ29udGFpbmVyTW91c2VMZWF2ZSIsImRlbGV0ZVF1ZXJ5IiwiaGFuZGxlRWRpdFF1ZXJ5QnRuQ2xpY2siLCJoYW5kbGVQaW5RdWVyeUJ0bkNsaWNrIiwidW5waW5RdWVyeSIsInBpblF1ZXJ5IiwiaGFuZGxlRGVsZXRlQnRuTW91c2VMZWF2ZSIsIm1vcmVXaGl0ZSIsIlRhZ0xpc3QiLCJ0YWdzVGV4dCIsInNldFRhZ3MiLCJ1cGRhdGVUYWdzU3RhdGUiLCJzb3J0ZWRUYWdzIiwicm9vdCIsInN1YlRhZ3MiLCJzdWJ0YWdzIiwidGVtcE9iaiIsInRhZ1RleHQiLCJpbml0aWFsaXplZCIsIlRhZ0l0ZW1Db250YWluZXIiLCJoYXNTdWJUYWdzIiwic2hvd1N1YlRhZ3MiLCJ0b2dnbGVTdWJUYWdzIiwiaGFuZGxlVGFnQ2xpY2siLCJwYXRobmFtZSIsInNldFBhdGhuYW1lIiwiaGFuZGxlVG9nZ2xlQnRuQ2xpY2siLCJzdCIsInRhYmxlQ29uZmlnIiwiZ2V0SW5pdGlhbFVzYWdlU3RhdCIsInVzZWREYXlzQW1vdW50IiwiYmVnaW5EYXlUaW1lc3RhbXAiLCJpbml0aWFsVXNhZ2VTdGF0IiwicGFyc2VJbnQiLCJjb3VudCIsIlVzYWdlSGVhdE1hcCIsInRvZGF5VGltZVN0YW1wIiwiZW5kT2YiLCJ0b2RheURheSIsIm51bGxDZWxsIiwiZmlsbCIsInN0YXJ0T2YiLCJzdWJ0cmFjdCIsInN0YXJ0RGF0ZSIsImFsbFN0YXQiLCJzZXRBbGxTdGF0IiwicG9wdXBTdGF0Iiwic2V0UG9wdXBTdGF0IiwiY3VycmVudFN0YXQiLCJzZXRDdXJyZW50U3RhdCIsImZyb21UbyIsInNldEZyb21UbyIsImZyb21Ub1JlZiIsImNvbnRhaW5lckVsUmVmIiwicG9wdXBSZWYiLCJuZXdTdGF0IiwiY3JlYXRpb25EYXRlIiwiZGlmZiIsImhhbmRsZVVzYWdlU3RhdEl0ZW1Nb3VzZUVudGVyIiwidG9wVmFsdWUiLCJoYW5kbGVVc2FnZVN0YXRJdGVtTW91c2VMZWF2ZSIsImhhbmRsZVVzYWdlU3RhdEl0ZW1DbGljayIsInNoaWZ0S2V5IiwidGltZVN0YW1wRGF5cyIsImlzQmVmb3JlIiwic3BsaXRBY3RpdmVMZWFmIiwib3BlbkZpbGUiLCJhY3RpdmVMZWFmIiwiZ2V0TGVhZiIsInRvRGF0ZVN0cmluZyIsInYiLCJjb2xvckxldmVsIiwiU2lkZWJhciIsInNob3dTaWRlcmJhckluTW9iaWxlVmlldyIsIndyYXBwZXJFbFJlZiIsImhhbmRsZUNsaWNrT3V0c2lkZU9mV3JhcHBlciIsInNpZGVyYmFyU2hvd24iLCJwYXJlbnROb2RlIiwiU0hPV19TSURFUkJBUl9NT0JJTEVfQ0xBU1NOQU1FIiwiaG9tZVJvdXRlclN3aXRjaCIsImhhbmRsZVdpbmRvd1Jlc2l6ZSIsInNldElzTW9iaWxlVmlldyIsIkl0ZW1WaWV3IiwiQXBwIiwiUGx1Z2luU2V0dGluZ1RhYiIsIlBsdWdpbiIsImFwcEhhc0RhaWx5Tm90ZXNQbHVnaW5Mb2FkZWQiLCJGaWxlVmlldyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFBYSxrQkFBa0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1EvQixJQUFJLHdCQUF3QixPQUFPO0FBQ25DLElBQUksaUJBQWlCLE9BQU8sVUFBVTtBQUN0QyxJQUFJLG1CQUFtQixPQUFPLFVBQVU7QUFFeEMsa0JBQWtCLEtBQUs7QUFDdEIsTUFBSSxRQUFRLFFBQVEsUUFBUSxRQUFXO0FBQ3RDLFVBQU0sSUFBSSxVQUFVO0FBQUE7QUFHckIsU0FBTyxPQUFPO0FBQUE7QUFHZiwyQkFBMkI7QUFDMUIsTUFBSTtB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RyxXQUFFO0FBQUE7QUFBQTtBQUFJLGNBQVcsR0FBRSxHQUFFO0FBQUMsUUFBSSxJQUFFLEVBQUU7QUFBTyxNQUFFLEtBQUs7QUFBRztBQUFFLGlCQUFPO0FBQUMsWUFBSSxJQUFFLElBQUUsTUFBSSxHQUFFLElBQUUsRUFBRTtBQUFHLFlBQUcsQUFBUyxNQUFULFVBQVksSUFBRSxHQUFFLEdBQUU7QUFBRyxZQUFFLEtBQUcsR0FBRSxFQUFFLEtBQUcsR0FBRSxJQUFFO0FBQUE7QUFBTztBQUFBO0FBQUE7QUFBUyxjQUFXLEdBQUU7QUFBQyxRQUFFLEVBQUU7QUFBRyxXQUFPLEFBQVMsTUFBVCxTQUFXLE9BQUs7QUFBQTtBQUNoUCxjQUFXLEdBQUU7QUFBQyxRQUFJLElBQUUsRUFBRTtBQUFHLFFBQUcsQUFBUyxNQUFULFFBQVc7QUFBQyxVQUFJLElBQUUsRUFBRTtBQUFNLFVBQUcsTUFBSSxHQUFFO0FBQUMsVUFBRSxLQUFHO0FBQUU7QUFBRSxtQkFBUSxJQUFFLEdBQUUsSUFBRSxFQUFFLFFBQU8sSUFBRSxLQUFHO0FBQUMsZ0JBQUksS0FBRSxJQUFHLEtBQUUsS0FBRyxHQUFFLEtBQUUsRUFBRSxLQUFHLEtBQUUsS0FBRSxHQUFFLEtBQUUsRUFBRTtBQUFHLGdCQUFHLEFBQVMsT0FBVCxVQUFZLElBQUUsR0FBRSxJQUFFO0FBQUcsY0FBUyxPQUFULFVBQVksSUFBRSxHQUFFLElBQUUsTUFBSSxHQUFFLEtBQUcsSUFBRSxFQUFFLE1BQUcsR0FBRSxJQUFFLE1BQUksR0FBRSxLQUFHLElBQUUsRUFBRSxNQUFHLEdBQUUsSUFBRTtBQUFBLHFCQUFXLEFBQVMsT0FBVCxVQUFZLElBQUUsR0FBRSxJQUFFO0FBQUcsZ0JBQUUsS0FBRyxJQUFFLEVBQUUsTUFBRyxHQUFFLElBQUU7QUFBQTtBQUFPO0FBQUE7QUFBQTtBQUFTLGFBQU87QUFBQTtBQUFFLFdBQU87QUFBQTtBQUFLLGNBQVcsR0FBRSxHQUFFO0FBQUMsUUFBSSxJQUFFLEVBQUUsWUFBVSxFQUFFO0FBQVUsV0FBTyxBQUFJLE1BQUosSUFBTSxJ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 diff --git a/.obsidian/plugins/obsidian-memos/manifest.json b/.obsidian/plugins/obsidian-memos/manifest.json index 06878cc2..db539530 100644 --- a/.obsidian/plugins/obsidian-memos/manifest.json +++ b/.obsidian/plugins/obsidian-memos/manifest.json @@ -2,9 +2,9 @@ "id": "obsidian-memos", "name": "Obsidian Memos", "description": "A plugin for capturing ideas in Obsidian", - "version": "1.8.1", + "version": "1.9.5", "author": "Boninall", "authorUrl": "https://github.com/Quorafind/", "isDesktopOnly": false, - "minAppVersion": "0.13.14" + "minAppVersion": "0.14.0" } diff --git a/.obsidian/plugins/obsidian-memos/styles.css b/.obsidian/plugins/obsidian-memos/styles.css index 986d92d5..dda0f619 100644 --- a/.obsidian/plugins/obsidian-memos/styles.css +++ b/.obsidian/plugins/obsidian-memos/styles.css @@ -21,218 +21,237 @@ .hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper { +div[data-type='memos_view'] #root { display: flex; - flex-direction: column; + flex-direction: row; justify-content: flex-start; align-items: flex-start; - position: relative; width: 100%; - height: auto; - background-color: white; + height: 100%; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer { - display: inline-block; - width: 100%; - min-height: 24px; - max-height: 300px; - font-size: 15px; - line-height: 24px; - resize: none; - overflow-x: hidden; - background-color: transparent; - z-index: 1; - margin-bottom: 4px; - white-space: pre-wrap; +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.hide-scroll-bar { scrollbar-width: none; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar { +.hide-scroll-bar::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar-thumb { +.hide-scroll-bar::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar-thumb:hover { +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar { +.hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::placeholder { - padding-left: 2px; +@font-face { + font-family: 'DINPro'; + src: ''; + font-weight: normal; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer:focus::placeholder { - color: lightgray; +@font-face { + font-family: 'DINPro'; + src: ''; + font-weight: bold; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - width: 100%; +@font-face { + font-family: 'ubuntu-mono'; + src: ''; + font-style: normal; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .common-tools-container { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; +div[data-type='memos_view'] { + font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Noto Sans", "Noto Sans CJK SC", "Microsoft YaHei UI", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /*text-align: var();*/ + -webkit-font-smoothing: subpixel-antialiased; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container { - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: center; - flex-grow: 0; - flex-shrink: 0; +div[data-type='memos_view'] .view-content:not(.images-wrapper) img { + max-width: 100%; + cursor: default; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .action-btn { - border: none; - user-select: none; - cursor: pointer; - padding: 6px 12px; - border-radius: 6px; - font-size: 13px; - line-height: 32px; +.theme-light div[data-type='memos_view'] { + margin: 0; + padding: 0; + box-sizing: border-box; + color: #37352f; + -webkit-tap-highlight-color: transparent; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .action-btn:hover { - opacity: 0.8; +.theme-light div[data-type='memos_view'] body, +.theme-light div[data-type='memos_view'] html { + width: 100%; + height: 100%; + overflow: hidden; + font-size: 15px; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .cancel-btn { - color: gray; - background-color: transparent; - margin-right: 8px; - line-height: 18px; +.theme-light div[data-type='memos_view'] code { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; + background-color: pink; + padding: 2px 4px; + border-radius: 4px; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .confirm-btn { - cursor: pointer; - padding: 0 12px; - background-color: #55bb8e; - color: white; +.theme-light div[data-type='memos_view'] pre { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .confirm-btn:disabled { - cursor: not-allowed; - opacity: 0.6; +.theme-light div[data-type='memos_view'] pre * { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } -.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .confirm-btn > .icon-text { - margin-left: 4px; +.theme-light div[data-type='memos_view'] label, +.theme-light div[data-type='memos_view'] input, +.theme-light div[data-type='memos_view'] button:not(.rdp), +.theme-light div[data-type='memos_view'] textarea, +.theme-light div[data-type='memos_view'] img { + background-color: transparent; + user-select: none; + -webkit-tap-highlight-color: transparent; + border: none; + outline: none; } -.theme-light div[data-type='memos_view'] .scroll::-webkit-scrollbar { - display: none; +.theme-light div[data-type='memos_view'] input:-webkit-autofill, +.theme-light div[data-type='memos_view'] input:-webkit-autofill:hover, +.theme-light div[data-type='memos_view'] input:-webkit-autofill:focus, +.theme-light div[data-type='memos_view'] input:-webkit-autofill:active { + box-shadow: 0 0 0 30px white inset !important; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - position: relative; - width: 100%; - height: auto; - background-color: #000000; +.theme-light div[data-type='memos_view'] li:not(.rta__item) { + list-style-type: none; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer { - display: inline-block; - width: 100%; - min-height: 24px; - max-height: 300px; - font-size: 15px; - line-height: 24px; - resize: none; - overflow-x: hidden; - background-color: transparent; - z-index: 1; - margin-bottom: 4px; - white-space: pre-wrap; - scrollbar-width: none; +.theme-light div[data-type='memos_view'] li:not(.rta__item)::before { + content: '•'; + font-weight: bold; + margin-right: 4px; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar { - width: 0; - height: 0; +.theme-light div[data-type='memos_view'] a { cursor: pointer; + color: #5783f7; + text-underline-offset: 2px; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; -} -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-light div[data-type='memos_view'] a:hover { + background-color: #e4e4e4; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar { - display: none; +.theme-light div[data-type='memos_view'] a.is-unresolved { + cursor: pointer; + color: #8fa2d6; + text-underline-offset: 2px; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::placeholder { - padding-left: 2px; +.theme-light div[data-type='memos_view'] a.is-unresolved:hover { + background-color: #e4e4e4; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer:focus::placeholder { - color: #363636; +.theme-light div[data-type='memos_view'] .btn { + border: unset; + background-color: unset; + font-size: unset; + user-select: none; + cursor: pointer; + text-align: center; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - width: 100%; +.theme-light .hidden { + display: none !important; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .common-tools-container { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; +@media only screen and (max-width: 875px) { + .theme-light div[data-type='memos_view'] body, + .theme-light div[data-type='memos_view'] html { + -webkit-overflow-scrolling: touch; + } } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .common-tools-container > img { - filter: invert(0.8); - color: yellowgreen; +.theme-light div[data-type='memos_view'].mobile-view body, +.theme-light div[data-type='memos_view'].mobile-view html { + -webkit-overflow-scrolling: touch; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container { - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: center; - flex-grow: 0; - flex-shrink: 0; +.theme-dark div[data-type='memos_view'] { + margin: 0; + padding: 0; + box-sizing: border-box; + color: #37352f; + -webkit-tap-highlight-color: transparent; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .action-btn { - border: none; - user-select: none; - cursor: pointer; - padding: 6px 12px; - border-radius: 6px; - font-size: 13px; - line-height: 32px; +.theme-dark div[data-type='memos_view'] body, +.theme-dark div[data-type='memos_view'] html { + width: 100%; + height: 100%; + overflow: hidden; + font-size: 15px; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .action-btn > img { - filter: invert(0.8); +.theme-dark div[data-type='memos_view'] code { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; + background-color: #a8a8a8; + padding: 2px 4px; + border-radius: 4px; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .action-btn:hover { - opacity: 0.8; +.theme-dark div[data-type='memos_view'] pre { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .cancel-btn { - color: gray; +.theme-dark div[data-type='memos_view'] pre * { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.theme-dark div[data-type='memos_view'] label, +.theme-dark div[data-type='memos_view'] input, +.theme-dark div[data-type='memos_view'] button, +.theme-dark div[data-type='memos_view'] textarea, +.theme-dark div[data-type='memos_view'] img { background-color: transparent; - margin-right: 8px; - line-height: 18px; + user-select: none; + -webkit-tap-highlight-color: transparent; + border: none; + outline: none; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .confirm-btn { +.theme-dark div[data-type='memos_view'] input:-webkit-autofill, +.theme-dark div[data-type='memos_view'] input:-webkit-autofill:hover, +.theme-dark div[data-type='memos_view'] input:-webkit-autofill:focus, +.theme-dark div[data-type='memos_view'] input:-webkit-autofill:active { + box-shadow: 0 0 0 30px #000000 inset !important; +} +.theme-dark div[data-type='memos_view'] li:not(.rta__item) { + list-style-type: none; +} +.theme-dark div[data-type='memos_view'] li:not(.rta__item)::before { + content: '•'; + font-weight: bold; + margin-right: 4px; +} +.theme-dark div[data-type='memos_view'] a { cursor: pointer; - padding: 0 12px; - background-color: #940b01; - color: white; + color: #5783f7; + text-underline-offset: 2px; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .confirm-btn:disabled { - cursor: not-allowed; - opacity: 0.6; +.theme-dark div[data-type='memos_view'] a:hover { + background-color: #2c395a; } -.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .confirm-btn > .icon-text { - margin-left: 4px; +.theme-dark div[data-type='memos_view'] a.is-unresolved { + cursor: pointer; + color: #8fa2d6; + text-underline-offset: 2px; } -.theme-dark div[data-type='memos_view'] .scroll::-webkit-scrollbar { - display: none; +.theme-dark div[data-type='memos_view'] a.is-unresolved:hover { + background-color: #353535; +} +.theme-dark div[data-type='memos_view'] .btn { + border: unset; + background-color: unset; + font-size: unset; + user-select: none; + cursor: pointer; + text-align: center; +} +.theme-dark .hidden { + display: none !important; +} +.theme-dark div[data-type='memos_view'].mobile-view body, +.theme-dark div[data-type='memos_view'].mobile-view html { + -webkit-overflow-scrolling: touch; +} +.theme-dark div[data-type='memos_view'] svg { + fill: #cdcdcd; +} +.theme-dark .dialog-wrapper .btn-group, +.theme-dark .dialog-wrapper .btns-container { + fill: #cdcdcd; } .mono-font-family { font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; @@ -257,204 +276,207 @@ .hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-light .rta { - position: relative; - font-size: 15px; +.theme-light .dialog-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + position: fixed; + top: 0; + left: 0; width: 100%; height: 100%; - z-index: 10; -} -.theme-light .rta > ::-webkit-scrollbar { - width: 2px; - height: 16px; - background-color: #f5f5f5; + background-color: transparent; + z-index: 100; + transition: all 0.2s ease; + overflow-x: hidden; + overflow-y: scroll; + padding: 64px 0; + scrollbar-width: none; } -.theme-light .rta > ::-webkit-scrollbar-track { - background-color: #f5f5f5; +.theme-light .dialog-wrapper::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; } -.theme-light .rta ::-webkit-scrollbar-thumb { - background-color: #555; +.theme-light .dialog-wrapper::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-light .rta ::-webkit-scrollbar-track-piece { - background-color: #ffffff; +.theme-light .dialog-wrapper::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-light .rta__loader.rta__loader--empty-suggestion-data { +.theme-light .dialog-wrapper::-webkit-scrollbar { display: none; - border-radius: 3px; - box-shadow: 0 0 5px rgba(27, 31, 35, 0.1); - padding: 5px; } -.theme-light .rta--loading .rta__loader.rta__loader--suggestion-data { - display: none; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(255, 255, 255, 0.8); +.theme-light .dialog-wrapper.showup { + background-color: rgba(0, 0, 0, 0.6); } -.theme-light .rta--loading .rta__loader.rta__loader--suggestion-data > * { +.theme-light .dialog-wrapper.showoff { display: none; - position: relative; - top: 50%; -} -.theme-light .rta__textarea { - width: 100%; - height: 100%; - font-size: 1em; -} -.theme-light .rta__autocomplete { - position: absolute; - display: block; - margin-top: 1em; } -.theme-light .rta__autocomplete--top { - margin-top: 0; - margin-bottom: 1em; -} -.theme-light .rta__list { - margin: 0; - padding: 0; - background: #fff; - border: 1px solid #dfe2e5; - border-radius: 0px; - box-shadow: 0 0 10px rgba(27, 31, 35, 0.1); - list-style: none; +.theme-light .dialog-wrapper > .dialog-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + background-color: white; + padding: 16px; + border-radius: 8px; } -.theme-light .rta__entity { - background: white; +.theme-light .dialog-wrapper > .dialog-container > .dialog-header-container { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; width: 100%; - text-align: left; - outline: none; -} -.theme-light .rta__entity:hover { - cursor: pointer; -} -.theme-light .rta__item { - text-overflow: 'ellipsis'; - line-height: 30px; -} -.theme-light .rta__item:fisrt-child { - border-radius: 8px 8px 0px 0px; + margin-bottom: 16px; } -.theme-light .rta__item:not(:last-child) { - border-bottom: 1px solid #f3f3f3; +.theme-light .dialog-wrapper > .dialog-container > .dialog-header-container > .title-text > .icon-text { + margin-right: 6px; + font-size: 16px; } -.theme-light .rta__item:last-child { - border-radius: 0px 0px 0px 0px; +.theme-light .dialog-wrapper > .dialog-container > .dialog-header-container .btn { + width: 24px; + height: 24px; + padding: 0; + margin-right: 0; + border-radius: 4px; + background-color: transparent; } -.theme-light .rta__entity > * { - padding-left: 4px; - padding-right: 4px; +.theme-light .dialog-wrapper > .dialog-container > .dialog-header-container .btn > .icon-img { + width: 20px; + height: 20px; } -.theme-light .rta__entity--selected { - color: #fff; - text-decoration: none; - background: #82af48; +.theme-light .dialog-wrapper > .dialog-container > .dialog-header-container .btn:hover { + background-color: lightgray; } -.theme-dark .rta { - position: relative; - font-size: 15px; +.theme-light .dialog-wrapper > .dialog-container > .dialog-content-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; width: 100%; - height: 100%; - z-index: 10; -} -.theme-dark .rta > ::-webkit-scrollbar { - width: 2px; - height: 16px; - background-color: #0f0f0f; -} -.theme-dark .rta > ::-webkit-scrollbar-track { - background-color: #000000; } -.theme-dark .rta ::-webkit-scrollbar-thumb { - background-color: #c9c9c9; -} -.theme-dark .rta ::-webkit-scrollbar-track-piece { - background-color: #000000; +.theme-light .dialog-wrapper > .dialog-container > .dialog-footer-container { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + width: 100%; + margin-top: 16px; } -.theme-dark .rta__loader.rta__loader--empty-suggestion-data { - display: none; - border-radius: 3px; - box-shadow: 0 0 5px rgba(27, 31, 35, 0.1); - padding: 5px; +@media only screen and (max-width: 875px) { + .theme-light .dialog-wrapper { + width: 100%; + padding: 0 16px; + } + .theme-light .dialog-wrapper > .dialog-container { + max-width: 100%; + } } -.theme-dark .rta--loading .rta__loader.rta__loader--suggestion-data { - display: none; - position: absolute; +.theme-dark .dialog-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + position: fixed; top: 0; left: 0; width: 100%; height: 100%; - background: rgba(255, 255, 255, 0.8); -} -.theme-dark .rta--loading .rta__loader.rta__loader--suggestion-data > * { - display: none; - position: relative; - top: 50%; + background-color: transparent; + z-index: 100; + transition: all 0.2s ease; + overflow-x: hidden; + overflow-y: scroll; + padding: 64px 0; + scrollbar-width: none; } -.theme-dark .rta__textarea { - width: 100%; - height: 100%; - font-size: 1em; +.theme-dark .dialog-wrapper::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; } -.theme-dark .rta__autocomplete { - position: absolute; - display: block; - margin-top: 1em; +.theme-dark .dialog-wrapper::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-dark .rta__autocomplete--top { - margin-top: 0; - margin-bottom: 1em; +.theme-dark .dialog-wrapper::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-dark .rta__list { - margin: 0; - padding: 0; - background: #ffffff; - border: 1px solid #474747; - border-radius: 0px; - list-style: none; +.theme-dark .dialog-wrapper::-webkit-scrollbar { + display: none; } -.theme-dark .rta__entity { - color: #d2d1cd; - background: #000000; - width: 100%; - text-align: left; - outline: none; +.theme-dark .dialog-wrapper.showup { + background-color: rgba(85, 85, 85, 0.6); } -.theme-dark .rta__entity:hover { - cursor: pointer; +.theme-dark .dialog-wrapper.showoff { + display: none; } -.theme-dark .rta__item { - text-overflow: 'ellipsis'; - line-height: 30px; +.theme-dark .dialog-wrapper > .dialog-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + background-color: #000000; + padding: 16px; + border-radius: 8px; } -.theme-dark .rta__item:fisrt-child { - border-radius: 8px 8px 0px 0px; +.theme-dark .dialog-wrapper > .dialog-container > .dialog-header-container { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; + margin-bottom: 16px; } -.theme-dark .rta__item:not(:last-child) { - border-bottom: 1px solid #141414; +.theme-dark .dialog-wrapper > .dialog-container > .dialog-header-container > .title-text > .icon-text { + margin-right: 6px; + font-size: 16px; } -.theme-dark .rta__item:last-child { - border-radius: 0px 0px 0px 0px; +.theme-dark .dialog-wrapper > .dialog-container > .dialog-header-container .btn { + width: 24px; + height: 24px; + border-radius: 4px; + background-color: transparent; + padding: 0; + margin-right: 0; } -.theme-dark .rta__entity > * { - padding-left: 4px; - padding-right: 4px; +.theme-dark .dialog-wrapper > .dialog-container > .dialog-header-container .btn > .icon-img { + width: 20px; + height: 20px; + fill: #cdcdcd; } -.theme-dark .rta__entity--selected { - color: #000000; - text-decoration: none; - background: #af487b; +.theme-dark .dialog-wrapper > .dialog-container > .dialog-header-container .btn:hover { + background-color: #494949; +} +.theme-dark .dialog-wrapper > .dialog-container > .dialog-content-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 100%; +} +.theme-dark .dialog-wrapper > .dialog-container > .dialog-footer-container { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + width: 100%; + margin-top: 16px; } @media only screen and (max-width: 875px) { - .theme-light .rta__textarea { - max-height: 140px; - overflow-y: scroll; + .theme-dark .dialog-wrapper { + width: 100%; + padding: 0 16px; } - .theme-dark .rta__textarea { - max-height: 140px; - overflow-y: scroll; + .theme-dark .dialog-wrapper > .dialog-container { + max-width: 100%; } } .mono-font-family { @@ -480,929 +502,841 @@ .hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-light div[data-type='memos_view'] .memo-editor-wrapper { +.about-site-dialog > .dialog-container { + width: 420px; +} +.about-site-dialog > .dialog-container > .dialog-content-container { + line-height: 1.8; +} +.about-site-dialog > .dialog-container > .dialog-content-container > p { + margin: 2px 0; +} +.about-site-dialog > .dialog-container > .dialog-content-container > hr { + margin: 4px 0; + width: 100%; + height: 1px; + background-color: lightgray; + border: none; +} +.about-site-dialog > .dialog-container > .dialog-content-container .normal-text { display: flex; - flex-direction: column; + flex-direction: row; justify-content: flex-start; - align-items: flex-start; - position: relative; - width: 100%; - height: auto; - background-color: white; - padding: 16px; + align-items: center; + font-size: 13px; + color: gray; + white-space: pre-wrap; + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.about-site-dialog > .dialog-container > .dialog-content-container .pre-text { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +@media only screen and (max-width: 875px) { + .dialog-wrapper.about-site-dialog { + padding: 24px 16px; + padding-top: 64px; + } +} +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.hide-scroll-bar { + scrollbar-width: none; +} +.hide-scroll-bar::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; +} +.hide-scroll-bar::-webkit-scrollbar-thumb { + width: 0; + height: 0; border-radius: 8px; - border: 2px solid #e4e4e4; + background-color: #d5d5d5; } -.theme-light div[data-type='memos_view'] .memo-editor-wrapper.edit-ing { - border-color: #5783f7; +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-light div[data-type='memos_view'] .memo-editor-wrapper > .tip-text { - font-size: 12px; - line-height: 20px; - margin-top: 0px; - color: #cac8c4; +.hide-scroll-bar::-webkit-scrollbar { + display: none; } -.theme-light div[data-type='memos_view'] .memo-editor-wrapper > .memo-editor { +.theme-light div[data-type='memos_view'] .menu-btns-popup { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - position: relative; - width: 100%; - height: auto; - background-color: white; -} -.theme-light div[data-type='memos_view'] .memo-editor-wrapper > .date-picker { position: absolute; + margin-top: 4px; + margin-left: 90px; + padding: 4px; + width: 180px; + border-radius: 8px; z-index: 20; + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); + background-color: white; } -@media only screen and (max-width: 875px) { - .theme-light div[data-type='memos_view'] .memo-editor-wrapper { - width: calc(100% - 24px); - margin: auto; - } - .theme-light img.memo-show-editor-button { - position: fixed; - z-index: 10; - filter: opacity(30%); - } +.theme-light div[data-type='memos_view'] .menu-btns-popup:hover { + display: flex; } -.theme-dark div[data-type='memos_view'] .memo-editor-wrapper { +.theme-light div[data-type='memos_view'] .menu-btns-popup > .btn { display: flex; - flex-direction: column; + flex-direction: row; justify-content: flex-start; - align-items: flex-start; - position: relative; + align-items: center; width: 100%; - height: auto; - background-color: #3b3b3b; - padding: 16px; - border-radius: 8px; - border: 2px solid #353535; + padding: 8px 4px; + font-size: 14px; + line-height: 1.6; + border-radius: 4px; + text-align: left; } -.theme-dark div[data-type='memos_view'] .memo-editor-wrapper.edit-ing { - border-color: #3c3c3c; +.theme-light div[data-type='memos_view'] .menu-btns-popup > .btn > .icon { + display: block; + width: 28px; + text-align: center; + margin-right: 4px; + font-size: 14px; } -.theme-dark div[data-type='memos_view'] .memo-editor-wrapper > .tip-text { - font-size: 12px; - line-height: 20px; - margin-top: 0px; - color: #5e5b56; +.theme-light div[data-type='memos_view'] .menu-btns-popup > .btn:hover { + background-color: #f8f8f8; } -.theme-dark div[data-type='memos_view'] .memo-editor-wrapper > .memo-editor { +div[data-type='memos_view'].mobile-view .menu-btns-popup { + margin-left: 64px; +} +.theme-dark div[data-type='memos_view'] .menu-btns-popup { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - position: relative; - width: 100%; - height: auto; - background-color: #383838; -} -.theme-dark div[data-type='memos_view'] .memo-editor-wrapper > .date-picker { position: absolute; + margin-top: 4px; + margin-left: 90px; + padding: 4px; + width: 180px; + border-radius: 8px; z-index: 20; + background-color: #000000; } -@media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .memo-editor-wrapper { - width: calc(100% - 24px); - margin: auto; - } - .theme-dark img.memo-show-editor-button { - position: fixed; - z-index: 10; - transition: visibility 0s linear 0.5s, opacity 0.5s linear; - filter: invert(0.8) opacity(65%); - } +.theme-dark div[data-type='memos_view'] .menu-btns-popup:hover { + display: flex; } -:root { - --rdp-cell-size: 40px; - --rdp-accent-color: #0000ff; - --rdp-background-color: #e7edff; - /* Switch to dark colors for dark themes */ - --rdp-accent-color-dark: #3003e1; - --rdp-background-color-dark: #180270; - /* Outline border for focused elements */ - --rdp-outline: 2px solid var(--rdp-accent-color); - /* Outline border for focused and selected elements */ - --rdp-outline-selected: 2px solid rgba(0, 0, 0, 0.75); - --rdp-dark-cell-size: 40px; - --rdp-dark-accent-color: #494949; - --rdp-dark-background-color: #838383; - /* Switch to dark colors for dark themes */ - --rdp-dark-accent-color-dark: #050505; - --rdp-dark-background-color-dark: #7e7e7e; - /* Outline border for focused elements */ - --rdp-dark-outline: 2px solid var(--rdp-accent-color); - /* Outline border for focused and selected elements */ - --rdp-dark-outline-selected: 2px solid rgba(255, 255, 255, 0.75); +.theme-dark div[data-type='memos_view'] .menu-btns-popup > .btn { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + width: 100%; + padding: 8px 4px; + font-size: 14px; + line-height: 1.6; + border-radius: 4px; + text-align: left; } -.theme-light .rdp { - margin: 1em; - border-style: solid; - border-width: 1px; - border-color: #9b9b9b; - overflow: auto; +.theme-dark div[data-type='memos_view'] .menu-btns-popup > .btn > .icon { + display: block; + width: 28px; + text-align: center; + margin-right: 4px; + font-size: 14px; } -/* Hide elements for devices that are not screen readers */ -.rdp-vhidden { - box-sizing: border-box; - padding: 0; - margin: 0; - background: transparent; - border: 0; - -moz-appearance: none; - -webkit-appearance: none; - appearance: none; - position: absolute !important; - top: 0; - width: 1px !important; - height: 1px !important; - padding: 0 !important; - overflow: hidden !important; - clip: rect(1px, 1px, 1px, 1px) !important; - border: 0 !important; +.theme-dark div[data-type='memos_view'] .menu-btns-popup > .btn:hover { + background-color: #808080; } -/* Buttons */ -.rdp-button_reset { - appearance: none; - position: relative; - margin: 0; - padding: 0; - cursor: default; - color: inherit; - outline: none; - background: none; - font: inherit; - -moz-appearance: none; - -webkit-appearance: none; +.theme-dark div[data-type='memos_view'].mobile-view .menu-btns-popup { + margin-left: 64px; } -.rdp-button { - border: 2px solid transparent; +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } -.rdp-button[disabled] { - opacity: 0.25; +.hide-scroll-bar { + scrollbar-width: none; } -.rdp-button:not([disabled]) { +.hide-scroll-bar::-webkit-scrollbar { + width: 0; + height: 0; cursor: pointer; } -.rdp-button:focus:not([disabled]), -.rdp-button:active:not([disabled]) { - color: inherit; - border: var(--rdp-outline); - background-color: var(--rdp-background-color); +.hide-scroll-bar::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.rdp-button:hover:not([disabled]) { - background-color: var(--rdp-background-color); +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.rdp-months { - display: flex; - background: white; - padding: 4px; +.hide-scroll-bar::-webkit-scrollbar { + display: none; } -.rdp-month { - margin: 0 1em; +.theme-light .preview-image-dialog { + padding: 0; } -.rdp-month:first-child { - margin-left: 0; +.theme-light .preview-image-dialog > .dialog-container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: relative; + width: 100%; + height: 100%; + background-color: unset; + padding: 0; } -.rdp-month:last-child { - margin-right: 0; +.theme-light .preview-image-dialog > .dialog-container > .close-btn { + position: fixed; + top: 36px; + right: 36px; + width: 36px; + height: 36px; + padding: 4px; + cursor: pointer; + border-radius: 4px; + background-color: #d8d8d8; + z-index: 1; } -.rdp-table { - margin: 0; - max-width: calc(var(--rdp-cell-size) * 7); - border-collapse: collapse; +.theme-light .preview-image-dialog > .dialog-container > .close-btn > .icon-img { + width: 28px; + height: 28px; } -.rdp-with_weeknumber .rdp-table { - max-width: calc(var(--rdp-cell-size) * 8); - border-collapse: collapse; +.theme-light .preview-image-dialog > .dialog-container > .close-btn:hover { + opacity: 0.8; } -.rdp-caption { +.theme-light .preview-image-dialog > .dialog-container > .img-container { + width: 100%; + height: 100%; display: flex; - align-items: center; - justify-content: space-between; - padding: 0; - text-align: left; + flex-direction: column; + overflow: auto; + scrollbar-width: none; } -.rdp-multiple_months .rdp-caption { - position: relative; - display: block; - text-align: center; +.theme-light .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; } -.rdp-caption_dropdowns { - position: relative; - display: inline-flex; +.theme-light .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.rdp-caption_label { - position: relative; - z-index: 1; - display: inline-flex; - align-items: center; - margin: 0; - padding: 0 0.25em; - white-space: nowrap; - color: currentColor; - border: 0; - border: 2px solid transparent; - font-family: inherit; - font-size: 140%; - font-weight: bold; +.theme-light .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.rdp-nav { - white-space: nowrap; +.theme-light .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar { + display: none; } -.rdp-multiple_months .rdp-caption_start .rdp-nav { - position: absolute; - top: 50%; - left: 0; - transform: translateY(-50%); +.theme-light .preview-image-dialog > .dialog-container > .img-container > img { + padding: 16px; + height: auto; + margin: auto; } -.rdp-multiple_months .rdp-caption_end .rdp-nav { - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); +.theme-light .preview-image-dialog > .dialog-container > .img-container > .loading-text { + color: white; + font-size: 24px; + margin: auto; + border-bottom: 2px solid white; + padding: 8px 4px; } -.rdp-nav_button { - display: inline-flex; - align-items: center; +.theme-light .preview-image-dialog > .dialog-container > .action-btns-container { + display: flex; + flex-direction: row; justify-content: center; - width: var(--rdp-cell-size); - height: var(--rdp-cell-size); - padding: 0.25em; - border-radius: 100%; + align-items: center; + position: fixed; + bottom: 36px; + z-index: 1; } -/* ---------- */ -/* Dropdowns */ -/* ---------- */ -.rdp-dropdown_year, -.rdp-dropdown_month { - position: relative; - display: inline-flex; +.theme-light .preview-image-dialog > .dialog-container > .action-btns-container > .btn { + display: flex; + flex-direction: row; + justify-content: center; align-items: center; + width: 40px; + height: 40px; + font-size: 20px; + margin-right: 16px; + border-radius: 4px; + background-color: lightgray; + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); } -.rdp-dropdown { - appearance: none; - position: absolute; - z-index: 2; - top: 0; - bottom: 0; - left: 0; - width: 100%; - margin: 0; +.theme-light .preview-image-dialog > .dialog-container > .action-btns-container > .btn:last-child { + margin-right: 0; +} +.theme-light .preview-image-dialog > .dialog-container > .action-btns-container > .btn:hover, +.theme-light .preview-image-dialog > .dialog-container > .action-btns-container > .btn:active { + opacity: 0.8; +} +@media only screen and (max-width: 875px) { + .theme-light .preview-image-dialog { + padding: 0; + } + .theme-light .preview-image-dialog > .dialog-container { + max-width: 100%; + } + .theme-light .preview-image-dialog > .dialog-container > .img-container > img { + padding: 6px; + } +} +.theme-dark .preview-image-dialog { padding: 0; - cursor: inherit; - opacity: 0; - border: none; - background-color: transparent; - font-family: inherit; - font-size: inherit; - line-height: inherit; } -.rdp-dropdown[disabled] { - opacity: unset; - color: unset; +.theme-dark .preview-image-dialog > .dialog-container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: relative; + width: 100%; + height: 100%; + background-color: unset; + padding: 0; } -.rdp-dropdown:focus:not([disabled]) + .rdp-caption_label, -.rdp-dropdown:active:not([disabled]) + .rdp-caption_label { - border: var(--rdp-outline); - border-radius: 6px; - background-color: var(--rdp-background-color); +.theme-dark .preview-image-dialog > .dialog-container > .close-btn { + position: fixed; + top: 36px; + right: 36px; + width: 36px; + height: 36px; + padding: 4px; + cursor: pointer; + border-radius: 4px; + background-color: #c39999; + z-index: 1; } -.rdp-dropdown_icon { - margin: 0 0 0 5px; +.theme-dark .preview-image-dialog > .dialog-container > .close-btn > .icon-img { + width: 28px; + height: 28px; + fill: #cdcdcd; } -.rdp-head { - border: 0; +.theme-dark .preview-image-dialog > .dialog-container > .close-btn:hover { + opacity: 0.8; } -.rdp-head_row, -.rdp-row { +.theme-dark .preview-image-dialog > .dialog-container > .img-container { + width: 100%; height: 100%; + display: flex; + flex-direction: column; + overflow: auto; + scrollbar-width: none; } -.rdp-head_cell { - vertical-align: middle; - text-transform: uppercase; - font-size: 0.75em; - font-weight: 700; - text-align: center; - height: 100%; - height: var(--rdp-cell-size); - padding: 0; +.theme-dark .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; } -.rdp-tbody { - border: 0; +.theme-dark .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.rdp-foot { - margin: 0.5em; +.theme-dark .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.rdp-cell { - width: var(--rdp-cell-size); - height: 100%; - height: var(--rdp-cell-size); - padding: 0; - text-align: center; +.theme-dark .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar { + display: none; } -.rdp-weeknumber { - font-size: 0.75em; +.theme-dark .preview-image-dialog > .dialog-container > .img-container > img { + padding: 16px; + height: auto; + margin: auto; } -.rdp-weeknumber, -.rdp-day { +.theme-dark .preview-image-dialog > .dialog-container > .img-container > .loading-text { + color: #000000; + font-size: 24px; + margin: auto; + border-bottom: 2px solid #000000; + padding: 8px 4px; +} +.theme-dark .preview-image-dialog > .dialog-container > .action-btns-container { display: flex; - overflow: hidden; - align-items: center; + flex-direction: row; justify-content: center; - box-sizing: border-box; - width: var(--rdp-cell-size); - max-width: var(--rdp-cell-size); - height: var(--rdp-cell-size); - margin: 0; - border: 2px solid transparent; - border-radius: 100%; -} -.rdp-day_today:not(.rdp-day_outside) { - font-weight: bold; + align-items: center; + position: fixed; + bottom: 36px; + z-index: 1; } -.rdp-day_selected:not([disabled]), -.rdp-day_selected:focus:not([disabled]), -.rdp-day_selected:active:not([disabled]), -.rdp-day_selected:hover:not([disabled]) { - color: white; - background-color: var(--rdp-accent-color); +.theme-dark .preview-image-dialog > .dialog-container > .action-btns-container > .btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 40px; + height: 40px; + font-size: 20px; + margin-right: 16px; + border-radius: 4px; + background-color: #2c2c2c; } -.rdp-day_selected:focus:not([disabled]) { - border: var(--rdp-outline-selected); +.theme-dark .preview-image-dialog > .dialog-container > .action-btns-container > .btn:last-child { + margin-right: 0; } -.rdp:not([dir='rtl']) .rdp-day_range_start:not(.rdp-day_range_end) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; +.theme-dark .preview-image-dialog > .dialog-container > .action-btns-container > .btn:hover, +.theme-dark .preview-image-dialog > .dialog-container > .action-btns-container > .btn:active { + opacity: 0.8; } -.rdp:not([dir='rtl']) .rdp-day_range_end:not(.rdp-day_range_start) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; +@media only screen and (max-width: 875px) { + .theme-dark .preview-image-dialog { + padding: 0; + } + .theme-dark .preview-image-dialog > .dialog-container { + max-width: 100%; + } + .theme-dark .preview-image-dialog > .dialog-container > .img-container > img { + padding: 6px; + } } -.rdp[dir='rtl'] .rdp-day_range_start:not(.rdp-day_range_end) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } -.rdp[dir='rtl'] .rdp-day_range_end:not(.rdp-day_range_start) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; +.hide-scroll-bar { + scrollbar-width: none; } -.rdp-day_range_end.rdp-day_range_start { - border-radius: 100%; +.hide-scroll-bar::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; } -.rdp-day_range_middle { - border-radius: 0; +.hide-scroll-bar::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-dark .rdp { - margin: 1em; - border-style: solid; - border-width: 1px; - border-color: #9b9b9b; - overflow: auto; - color: #dddddd; - /* Hide elements for devices that are not screen readers */ - /* Buttons */ - /* ---------- */ - /* Dropdowns */ - /* ---------- */ +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-dark .rdp .rdp-vhidden { - box-sizing: border-box; - padding: 0; - margin: 0; - background: transparent; - border: 0; - -moz-appearance: none; - -webkit-appearance: none; - appearance: none; - position: absolute !important; - top: 0; - width: 1px !important; - height: 1px !important; - padding: 0 !important; - overflow: hidden !important; - clip: rect(1px, 1px, 1px, 1px) !important; - border: 0 !important; +.hide-scroll-bar::-webkit-scrollbar { + display: none; } -.theme-dark .rdp .rdp-button_reset { - appearance: none; - position: relative; - margin: 0; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container { padding: 0; - cursor: default; - color: inherit; - outline: none; - background: none; - font: inherit; - -moz-appearance: none; - -webkit-appearance: none; + background-color: transparent; } -.theme-dark .rdp .rdp-button { - border: 2px solid transparent; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > * { + flex-shrink: 0; } -.theme-dark .rdp .rdp-button[disabled] { - opacity: 0.25; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container { + position: relative; + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 512px; + min-height: 64px; + max-width: 100%; + padding: 12px 24px; + margin-bottom: 12px; + border-radius: 8px; + background-color: #fbf4de; } -.theme-dark .rdp .rdp-button:not([disabled]) { - cursor: pointer; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > * { + z-index: 1; } -.theme-dark .rdp .rdp-button:focus:not([disabled]), -.theme-dark .rdp .rdp-button:active:not([disabled]) { - color: inherit; - border: var(--rdp-dark-outline); - background-color: var(--rdp-dark-background-color); +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; + height: auto; + padding-bottom: 0; + margin-bottom: 0; + margin-top: 0; } -.theme-dark .rdp .rdp-button:hover:not([disabled]) { - background-color: var(--rdp-dark-background-color); +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .time-text { + font-size: 14px; + color: gray; + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } -.theme-dark .rdp .rdp-months { +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container { display: flex; - background: #252525; - padding: 4px; + flex-direction: row; + justify-content: flex-end; + align-items: center; } -.theme-dark .rdp .rdp-month { - margin: 0 1em; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container > .btn { + background-color: transparent; + padding: 0; } -.theme-dark .rdp .rdp-month:first-child { - margin-left: 0; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container > .btn:hover { + background-color: white; } -.theme-dark .rdp .rdp-month:last-child { - margin-right: 0; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container > .btn > .icon-img { + width: 20px; + height: 20px; } -.theme-dark .rdp .rdp-table { - margin: 0; - max-width: calc(var(--rdp-dark-cell-size) * 7); - border-collapse: collapse; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 100%; + padding-top: 8px; } -.theme-dark .rdp .rdp-with_weeknumber .rdp-table { - max-width: calc(var(--rdp-dark-cell-size) * 8); - border-collapse: collapse; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .memo-content-text { + width: 100%; + font-size: 16px; + line-height: 1.6; + word-wrap: break-word; + word-break: break-all; + padding-top: 4px; } -.theme-dark .rdp .rdp-caption { - display: flex; - align-items: center; - justify-content: space-between; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .memo-content-text .tag-span { + margin: 0; padding: 0; - text-align: left; + font-size: 14px; + color: #5783f7; + background-color: unset; + padding-left: 4px; + padding-right: 6px; + margin-left: 4px; + cursor: unset; } -.theme-dark .rdp .rdp-multiple_months .rdp-caption { - position: relative; - display: block; - text-align: center; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + margin-top: 8px; + width: 100%; + overflow-x: auto; + overflow-y: hidden; + padding-bottom: 2px; + scrollbar-width: none; } -.theme-dark .rdp .rdp-caption_dropdowns { - position: relative; - display: inline-flex; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper::-webkit-scrollbar { + width: 0; + height: 2px; + cursor: pointer; } -.theme-dark .rdp .rdp-caption_label { - position: relative; - z-index: 1; - display: inline-flex; - align-items: center; - margin: 0; - padding: 0 0.25em; - white-space: nowrap; - color: currentColor; - border: 0; - border: 2px solid transparent; - font-family: inherit; - font-size: 140%; - font-weight: bold; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper::-webkit-scrollbar-thumb { + width: 0; + height: 2px; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-dark .rdp .rdp-nav { - white-space: nowrap; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-dark .rdp .rdp-multiple_months .rdp-caption_start .rdp-nav { - position: absolute; - top: 50%; - left: 0; - transform: translateY(-50%); +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img { + margin-right: 8px; + width: auto; + height: 128px; + flex-shrink: 0; + flex-grow: 0; + overflow-y: hidden; + scrollbar-width: none; } -.theme-dark .rdp .rdp-multiple_months .rdp-caption_end .rdp-nav { - position: absolute; - top: 50%; - right: 0; - transform: translateY(-50%); +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; } -.theme-dark .rdp .rdp-nav_button { - display: inline-flex; - align-items: center; - justify-content: center; - width: var(--rdp-dark-cell-size); - height: var(--rdp-dark-cell-size); - padding: 0.25em; - border-radius: 100%; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-dark .rdp .rdp-dropdown_year, -.theme-dark .rdp .rdp-dropdown_month { - position: relative; - display: inline-flex; - align-items: center; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-dark .rdp .rdp-dropdown { - appearance: none; - position: absolute; - z-index: 2; - top: 0; - bottom: 0; - left: 0; - width: 100%; - margin: 0; - padding: 0; - cursor: inherit; - opacity: 0; - border: none; - background-color: transparent; - font-family: inherit; - font-size: inherit; - line-height: inherit; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar { + display: none; } -.theme-dark .rdp .rdp-dropdown[disabled] { - opacity: unset; - color: unset; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img:hover { + border-color: lightgray; } -.theme-dark .rdp .rdp-dropdown:focus:not([disabled]) + .rdp-caption_label, -.theme-dark .rdp .rdp-dropdown:active:not([disabled]) + .rdp-caption_label { - border: var(--rdp-dark-outline); - border-radius: 6px; - background-color: var(--rdp-dark-background-color); +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img:last-child { + margin-right: 0; } -.theme-dark .rdp .rdp-dropdown_icon { - margin: 0 0 0 5px; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img > img { + width: auto; + max-height: 128px; + border-radius: 8px; } -.theme-dark .rdp .rdp-head { - border: 0; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .normal-text { + margin-top: 8px; + font-size: 13px; + color: gray; } -.theme-dark .rdp .rdp-head_row, -.theme-dark .rdp .rdp-row { +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .layer-container, +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .background-layer-container { + position: absolute; + bottom: -3px; + left: 3px; + width: calc(100% - 6px); height: 100%; + border-radius: 8px; + z-index: -1; + background-color: #fbf4de; + border-bottom: 1px solid lightgray; } -.theme-dark .rdp .rdp-head_cell { - vertical-align: middle; - text-transform: uppercase; - font-size: 0.75em; - font-weight: 700; - text-align: center; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .layer-container { + z-index: 0; + background-color: #fbf4de; + border: 1px solid lightgray; + width: 100%; height: 100%; - height: var(--rdp-dark-cell-size); - padding: 0; + position: absolute; + top: 0; + left: 0; } -.theme-dark .rdp .rdp-tbody { - border: 0; -} -.theme-dark .rdp .rdp-foot { - margin: 0.5em; -} -.theme-dark .rdp .rdp-cell { - width: var(--rdp-dark-cell-size); - height: 100%; - height: var(--rdp-dark-cell-size); - padding: 0; - text-align: center; -} -.theme-dark .rdp .rdp-weeknumber { - font-size: 0.75em; -} -.theme-dark .rdp .rdp-weeknumber, -.theme-dark .rdp .rdp-day { +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper { display: flex; - overflow: hidden; - align-items: center; - justify-content: center; - box-sizing: border-box; - width: var(--rdp-dark-cell-size); - max-width: var(--rdp-dark-cell-size); - height: var(--rdp-dark-cell-size); - margin: 0; - border: 2px solid transparent; - border-radius: 100%; -} -.theme-dark .rdp .rdp-day_today:not(.rdp-day_outside) { - font-weight: bold; -} -.theme-dark .rdp .rdp-day_selected:not([disabled]), -.theme-dark .rdp .rdp-day_selected:focus:not([disabled]), -.theme-dark .rdp .rdp-day_selected:active:not([disabled]), -.theme-dark .rdp .rdp-day_selected:hover:not([disabled]) { - color: white; - background-color: var(--rdp-dark-accent-color); -} -.theme-dark .rdp .rdp-day_selected:focus:not([disabled]) { - border: var(--rdp-dark-outline-selected); -} -.theme-dark .rdp .rdp:not([dir='rtl']) .rdp-day_range_start:not(.rdp-day_range_end) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.theme-dark .rdp .rdp:not([dir='rtl']) .rdp-day_range_end:not(.rdp-day_range_start) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 512px; + max-width: 100%; + margin-top: 8px; + padding: 12px 24px; + border-radius: 8px; + background-color: white; } -.theme-dark .rdp .rdp[dir='rtl'] .rdp-day_range_start:not(.rdp-day_range_end) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper:last-child { + margin-bottom: 36px; } -.theme-dark .rdp .rdp[dir='rtl'] .rdp-day_range_end:not(.rdp-day_range_start) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .normal-text { + font-size: 13px; } -.theme-dark .rdp .rdp-day_range_end.rdp-day_range_start { - border-radius: 100%; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .linked-memo-container { + font-size: 13px; + line-height: 24px; + margin-top: 8px; + cursor: pointer; + max-width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } -.theme-dark .rdp .rdp-day_range_middle { - border-radius: 0; +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .linked-memo-container:hover { + opacity: 0.8; } -.mono-font-family { +.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .linked-memo-container > .time-text { + color: gray; font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } -.hide-scroll-bar { - scrollbar-width: none; -} -.hide-scroll-bar::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; +@media only screen and (max-width: 875px) { + .theme-light div[data-type='memos_view'] .dialog-wrapper.memo-card-dialog { + padding: 24px 16px; + padding-top: 64px; + } } -.hide-scroll-bar::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container { + padding: 0; + background-color: transparent; } -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > * { + flex-shrink: 0; } -.hide-scroll-bar::-webkit-scrollbar { - display: none; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container { + position: relative; + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 512px; + min-height: 64px; + max-width: 100%; + padding: 12px 24px; + margin-bottom: 12px; + border-radius: 8px; + background-color: #5f5f5f; } -.theme-light div[data-type='memos_view'] .search-bar-container { - width: 160px; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > * { + z-index: 1; } -.theme-light div[data-type='memos_view'] .search-bar-container > .search-bar-inputer { +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container { display: flex; flex-direction: row; - justify-content: flex-start; + justify-content: space-between; align-items: center; - background-color: #fcfcfc; width: 100%; - height: 40px; - padding: 4px 16px; - border-radius: 8px; -} -.theme-light div[data-type='memos_view'] .search-bar-container > .search-bar-inputer > .icon-img { - margin-right: 8px; - width: 14px; height: auto; - opacity: 0.6; -} -.theme-light div[data-type='memos_view'] .search-bar-container > .search-bar-inputer > .text-input { - width: 100%; - font-size: 15px; + padding-bottom: 0; + margin-bottom: 0; + margin-top: 0; } -.theme-light div[data-type='memos_view'] .search-bar-container > .search-bar-inputer > .text-input:hover { - box-shadow: 0 0 0 1px var(--background-modifier-border-hover); +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .time-text { + font-size: 14px; + color: #a8a8a8; + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } -.theme-light div[data-type='memos_view'] .search-bar-container > .search-bar-inputer:hover + .quickly-action-wrapper { +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container { display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; } -.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper { - display: none; - position: absolute; - top: 52px; - right: -7px; - z-index: 12; - padding: 8px; - width: 320px; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container > .btn { + background-color: transparent; + padding: 0; } -.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container { +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container > .btn:hover { + background-color: #444444; +} +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container > .btn > .icon-img { + width: 20px; + height: 20px; + fill: #cdcdcd; +} +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; width: 100%; - background-color: white; - padding: 8px 16px; - border-radius: 8px; - box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); -} -.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .title-text { - color: gray; - font-size: 12px; + padding-top: 8px; } -.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: flex-start; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .memo-content-text { width: 100%; - font-size: 13px; - margin-top: 8px; + font-size: 16px; + line-height: 1.6; + word-wrap: break-word; + word-break: break-all; + padding-top: 4px; } -.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .section-text { - color: gray; - margin-right: 4px; - flex-shrink: 0; - line-height: 26px; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .memo-content-text .tag-span { + margin: 0; + padding: 0; + font-size: 14px; + color: #bbbec7; + background-color: unset; + cursor: unset; } -.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container { +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper { display: flex; flex-direction: row; justify-content: flex-start; align-items: flex-start; - flex-wrap: wrap; - user-select: none; -} -.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - line-height: 26px; + margin-top: 8px; + width: 100%; + overflow-x: auto; + overflow-y: hidden; + padding-bottom: 2px; + scrollbar-width: none; } -.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .type-item { +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper::-webkit-scrollbar { + width: 0; + height: 2px; cursor: pointer; - padding: 0 4px; - border-radius: 6px; -} -.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .type-item:hover { - background-color: #f8f8f8; -} -.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .type-item.selected { - background-color: #55bb8e; - color: white; } -.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .split-text { - color: lightgray; - margin: 0 2px; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper::-webkit-scrollbar-thumb { + width: 0; + height: 2px; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper:hover { - display: flex; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -@media only screen and (max-width: 875px) { - .theme-light div[data-type='memos_view'] .search-bar-container { - width: 120px; - } - .theme-light div[data-type='memos_view'] .search-bar-container > .search-bar-inputer { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - background-color: #fcfcfc; - height: 40px; - padding: 4px 16px; - border-radius: 8px; - width: 120%; - margin-left: -35px; - } - .theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper { - display: none; - position: absolute; - top: 42px; - right: -2px; - z-index: 12; - padding-right: 20px; - padding-left: 8px; - padding-top: 8px; - padding-bottom: 8px; - width: 320px; - } +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img { + margin-right: 8px; + width: auto; + height: 128px; + flex-shrink: 0; + flex-grow: 0; + overflow-y: hidden; + scrollbar-width: none; } -.theme-dark div[data-type='memos_view'] .search-bar-container { - width: 160px; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .search-bar-inputer { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - background-color: #302e2e; - width: 100%; - height: 40px; - padding: 8px 16px; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar-thumb { + width: 0; + height: 0; border-radius: 8px; + background-color: #d5d5d5; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .search-bar-inputer > .icon-img { - margin-right: 8px; - width: 14px; - height: auto; - opacity: 0.8; - filter: invert(1); +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .search-bar-inputer > .text-input { - width: 100%; - font-size: 15px; - color: #d2d1cd; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar { + display: none; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .search-bar-inputer:hover + .quickly-action-wrapper { - display: flex; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img:hover { + border-color: #3a3a3a; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper { - display: none; - position: absolute; - top: 52px; - right: -7px; - z-index: 12; - padding: 8px; - width: 320px; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img:last-child { + margin-right: 0; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - background-color: #000000; - padding: 8px 16px; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img > img { + width: auto; + max-height: 128px; border-radius: 8px; - margin-top: -8px; -} -.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .title-text { - color: #cccccc; - font-size: 12px; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - font-size: 13px; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .normal-text { margin-top: 8px; + font-size: 13px; + color: gray; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .section-text { - color: #dfdfdf; - margin-right: 4px; - flex-shrink: 0; - line-height: 26px; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .layer-container, +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .background-layer-container { + position: absolute; + bottom: -3px; + left: 3px; + width: calc(100% - 6px); + height: 100%; + border-radius: 8px; + z-index: -1; + background-color: #5f5f5f; + border-bottom: 1px solid #3f3f3f; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: flex-start; - flex-wrap: wrap; - user-select: none; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .layer-container { + z-index: 0; + background-color: #5f5f5f; + border: 1px solid #3f3f3f; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div { +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper { display: flex; - flex-direction: row; + flex-direction: column; justify-content: flex-start; - align-items: center; - line-height: 26px; + align-items: flex-start; + width: 512px; + max-width: 100%; + margin-top: 8px; + padding: 12px 24px; + border-radius: 8px; + background-color: #000000; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .type-item { - cursor: pointer; - padding: 0 4px; - border-radius: 6px; - color: #d2d1cd; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper:last-child { + margin-bottom: 36px; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .type-item:hover { - background-color: #808080; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .normal-text { + font-size: 13px; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .type-item.selected { - background-color: #457560; - color: #000000; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .linked-memo-container { + font-size: 13px; + line-height: 24px; + margin-top: 8px; + cursor: pointer; + max-width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .split-text { - color: #686868; - margin: 0 2px; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .linked-memo-container:hover { + opacity: 0.8; } -.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper:hover { - display: flex; +.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .linked-memo-container > .time-text { + color: #a8a8a8; + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } @media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .search-bar-container { - width: 120px; - } - .theme-dark div[data-type='memos_view'] .search-bar-container > .search-bar-inputer { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - background-color: #302e2e; - height: 40px; - padding: 8px 16px; - border-radius: 8px; - width: 120%; - margin-left: -35px; - } - .theme-dark div[data-type='memos_view'] .search-bar-container > .search-bar-inputer > .icon-img { - margin-right: 8px; - width: 14px; - height: auto; - opacity: 0.8; - filter: invert(1); - } - .theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper { - display: none; - position: absolute; - top: 42px; - right: -2px; - z-index: 2; - padding: 8px; - width: 320px; + .theme-dark div[data-type='memos_view'] .dialog-wrapper.memo-card-dialog { + padding: 24px 16px; + padding-top: 64px; } } .mono-font-family { @@ -1428,171 +1362,32 @@ .hide-scroll-bar::-webkit-scrollbar { display: none; } -div[data-type='memos_view'] .section-header-container, -div[data-type='memos_view'] .memos-header-container { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - width: 100%; - height: 40px; - flex-wrap: nowrap; - margin-top: 16px; - flex-shrink: 0; -} -div[data-type='memos_view'] .section-header-container > .title-text, -div[data-type='memos_view'] .memos-header-container > .title-text { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - font-weight: bold; - font-size: 18px; - line-height: 40px; - color: #37352f; - margin-right: 8px; - overflow: hidden; - text-overflow: ellipsis; - flex-shrink: 0; +div[data-type='memos_view'] .image-container { + width: 200px; + height: auto; + overflow-y: scroll; cursor: pointer; + -webkit-tap-highlight-color: transparent; + scrollbar-width: none; } -div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, -div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 24px; - height: 24px; - margin-right: 4px; - flex-shrink: 0; - background-color: unset; +div[data-type='memos_view'] .image-container::-webkit-scrollbar { + width: 2px; + height: 0; + cursor: pointer; } -div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, -div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { - width: 18px; - height: 18px; +div[data-type='memos_view'] .image-container::-webkit-scrollbar-thumb { + width: 2px; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -div[data-type='memos_view'] .section-header-container > .btns-container, -div[data-type='memos_view'] .memos-header-container > .btns-container { - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: center; +div[data-type='memos_view'] .image-container::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -@media only screen and (max-width: 875px) { - div[data-type='memos_view'] .section-header-container, - div[data-type='memos_view'] .memos-header-container { - height: auto; - margin-top: 4px; - margin-bottom: 0; - padding: 0 12px; - padding-bottom: 8px; - } - div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, - div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 60px; - height: 24px; - margin-right: -8px; - margin-left: -20px; - flex-shrink: 0; - background-color: unset; - } - div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, - div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { - width: 18px; - height: 18px; - } -} -.theme-dark div[data-type='memos_view'] .section-header-container, -.theme-dark div[data-type='memos_view'] .memos-header-container { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - width: 100%; - height: 40px; - flex-wrap: nowrap; - margin-top: 16px; - flex-shrink: 0; -} -.theme-dark div[data-type='memos_view'] .section-header-container > .title-text, -.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - font-weight: bold; - font-size: 18px; - line-height: 40px; - color: #d2d1cd; - margin-right: 8px; - overflow: hidden; - text-overflow: ellipsis; - flex-shrink: 0; - cursor: pointer; -} -.theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, -.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 24px; - height: 24px; - margin-right: 4px; - flex-shrink: 0; - background-color: unset; -} -.theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, -.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { - width: 18px; - height: 18px; - filter: invert(0.8); -} -.theme-dark div[data-type='memos_view'] .section-header-container > .btns-container, -.theme-dark div[data-type='memos_view'] .memos-header-container > .btns-container { - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: center; -} -@media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .section-header-container, - .theme-dark div[data-type='memos_view'] .memos-header-container { - height: auto; - margin-top: 4px; - margin-bottom: 0; - padding: 0 12px; - padding-bottom: 8px; - } - .theme-dark div[data-type='memos_view'] .section-header-container > .title-text, - .theme-dark div[data-type='memos_view'] .memos-header-container > .title-text { - color: #d2d1cd; - } - .theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, - .theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 60px; - height: 24px; - margin-right: -8px; - margin-left: -20px; - flex-shrink: 0; - background-color: unset; - } - .theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, - .theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { - width: 18px; - height: 18px; - filter: invert(0.8); - } +div[data-type='memos_view'] .image-container > img { + margin: auto; + width: 100%; + height: auto; } .mono-font-family { font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; @@ -1617,344 +1412,547 @@ div[data-type='memos_view'] .memos-header-container > .btns-container { .hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-light div[data-type='memos_view'] .filter-query-container { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - width: 100%; - flex-wrap: wrap; - padding: 4px 12px; - padding-bottom: 4px; - font-size: 13px; - line-height: 1.8; +.theme-light .share-memo-image-dialog > .dialog-container { + width: 380px; + padding: 0; + background-color: #eaeaea; } -.theme-light div[data-type='memos_view'] .filter-query-container > .filter-query { +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-header-container { + padding: 8px 16px; + padding-left: 24px; + margin-bottom: 0; + background-color: white; + border-top-left-radius: 8px; + border-top-right-radius: 8px; + font-family: 'RobotoDraft', 'Roboto', sans-serif; + -webkit-font-smoothing: antialiased; +} +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-header-container > .btn-group > .copy-btn { + background-color: #ffffff; +} +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-header-container > .btn-group > .close-btn { + background-color: #ffffff; +} +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container { display: flex; - flex-direction: row; + flex-direction: column; justify-content: flex-start; align-items: flex-start; + position: relative; + width: 100%; + min-height: 128px; } -.theme-light div[data-type='memos_view'] .filter-query-container > .filter-query > .tip-text { - padding: 2px 0; - margin-left: -6px; - margin-right: 3px; -} -.theme-light div[data-type='memos_view'] .filter-query-container > .filter-query > .filter-item-container { - padding: 2px 8px; - padding-left: 4px; - margin-right: 6px; - cursor: pointer; - background-color: #e4e4e4; - border-radius: 4px; - max-width: 200px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .tip-words-container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + width: 100%; + border-bottom: 1px solid lightgray; + background-color: white; + padding: 0 24px; + padding-bottom: 8px; } -.theme-light div[data-type='memos_view'] .filter-query-container > .filter-query > .filter-item-container > .icon-text { - letter-spacing: 2px; +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .tip-words-container > .tip-text { + color: gray; + font-size: 13px; + line-height: 24px; } -.theme-light div[data-type='memos_view'] .filter-query-container > .filter-query > .filter-item-container:hover { - text-decoration: line-through; +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .tip-words-container.loading > .tip-text { + animation: 1s linear 1s infinite alternate breathing; } -.theme-light div[data-type='memos_view'] .filter-query-container > .copy-memo { - padding-right: 6px; +@keyframes breathing { + from { + opacity: 1; + } + to { + opacity: 0.4; + } } -.theme-light div[data-type='memos_view'] .filter-query-container > .copy-memo > .icon-img { - width: 20px; +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 380px; + max-width: 100%; height: auto; + user-select: none; + position: relative; } -.theme-light div[data-type='memos_view'] .filter-query-container > .copy-memo:hover { - opacity: 0.8; - filter: contrast(1) brightness(1) invert(0.5); -} -@media only screen and (max-width: 875px) { - .theme-light div[data-type='memos_view'] .filter-query-container { - padding-left: 20px; - } +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-shortcut-img { + position: absolute; + top: 0; + left: 0; + z-index: 1; + width: 100%; + height: auto; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; } -.theme-dark div[data-type='memos_view'] .filter-query-container { +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background { display: flex; - flex-direction: row; - justify-content: space-between; + justify-content: center; align-items: center; + margin-top: 15px; + margin-right: 15px; + margin-bottom: 15px; + margin-left: 12px; + width: calc(100% - 24px); + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + position: relative; + border-radius: 16px; + overflow: hidden; + -webkit-box-shadow: 15px 15px 27px #e1e1e3, -15px -15px 27px #ffffff; + box-shadow: 15px 15px 27px #c1c1c1, -15px -15px 27px #e2e2e2; +} +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .property-image { + height: 6em; width: 100%; - flex-wrap: wrap; - padding: 4px 12px; - padding-bottom: 4px; - font-size: 13px; - line-height: 1.8; + position: Absolute; + top: 0px; } -.theme-dark div[data-type='memos_view'] .filter-query-container > .filter-query { +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .time-text { + width: 100%; + padding: 0 24px; + padding-top: 20px; + font-size: 12px; + color: gray; + background-color: white; +} +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .background-container { + height: 6em; + background: transparent; +} +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .memo-content-text { + padding-right: 8%; + padding-bottom: 12px; + padding-left: 8%; + width: 100%; + word-wrap: break-word; + font-size: 15px; + background-color: white; +} +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container { display: flex; - flex-direction: row; + flex-direction: column; justify-content: flex-start; align-items: flex-start; + width: 100%; + height: auto; + padding: 0 20px; + padding-bottom: 8px; + background-color: white; + scrollbar-width: none; } -.theme-dark div[data-type='memos_view'] .filter-query-container > .filter-query > .tip-text { - padding: 2px 0; - margin-left: -6px; - margin-right: 3px; - color: #d2d1cd; -} -.theme-dark div[data-type='memos_view'] .filter-query-container > .filter-query > .filter-item-container { - padding: 2px 8px; - padding-left: 4px; - margin-right: 6px; +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar { + width: 0; + height: 0; cursor: pointer; - background-color: #cacdcf; - border-radius: 4px; - max-width: 200px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; } -.theme-dark div[data-type='memos_view'] .filter-query-container > .filter-query > .filter-item-container > .icon-text { - letter-spacing: 2px; -} -.theme-dark div[data-type='memos_view'] .filter-query-container > .filter-query > .filter-item-container:hover { - text-decoration: line-through; -} -.theme-dark div[data-type='memos_view'] .filter-query-container > .copy-memo { - padding-right: 6px; -} -.theme-dark div[data-type='memos_view'] .filter-query-container > .copy-memo > .icon-img { - width: 20px; - height: auto; - opacity: 0.8; - filter: invert(1); -} -.theme-dark div[data-type='memos_view'] .filter-query-container > .copy-memo:hover { - opacity: 0.8; - filter: contrast(1) brightness(1) invert(0.9); -} -@media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .filter-query-container { - padding-left: 20px; - } -} -.mono-font-family { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; -} -.hide-scroll-bar { - scrollbar-width: none; -} -.hide-scroll-bar::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; -} -.hide-scroll-bar::-webkit-scrollbar-thumb { +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.hide-scroll-bar::-webkit-scrollbar { +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar { display: none; } -.theme-light .dialog-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - position: fixed; - top: 0; - left: 0; +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container > img { width: 100%; - height: 100%; - background-color: transparent; - z-index: 100; - transition: all 0.2s ease; - overflow-x: hidden; - overflow-y: scroll; - padding: 64px 0; - scrollbar-width: none; + height: auto; + margin-bottom: 8px; + border-radius: 4px; } -.theme-light .dialog-wrapper::-webkit-scrollbar { - width: 0; - height: 0; +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background .tag-span { + display: inline-block; + /* width: auto; */ + padding-left: 4px; + padding-right: 6px; + margin-left: -2px; + line-height: 22px; + font-size: 12px; + border: none; + border-radius: 4px; + color: #5783f7; + background-color: #eef3fe; cursor: pointer; + vertical-align: bottom; + text-align: left; } -.theme-light .dialog-wrapper::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; -} -.theme-light .dialog-wrapper::-webkit-scrollbar-thumb:hover { - background-color: #ccc; -} -.theme-light .dialog-wrapper::-webkit-scrollbar { - display: none; -} -.theme-light .dialog-wrapper.showup { - background-color: rgba(0, 0, 0, 0.6); -} -.theme-light .dialog-wrapper.showoff { - display: none; -} -.theme-light .dialog-wrapper > .dialog-container { +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container { display: flex; - flex-direction: column; + flex-direction: row; justify-content: flex-start; - align-items: flex-start; - background-color: white; - padding: 16px; - border-radius: 8px; + align-items: center; + flex-wrap: nowrap; + width: 100%; + padding: 16px 26px; + background: white; } -.theme-light .dialog-wrapper > .dialog-container > .dialog-header-container { +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start { display: flex; flex-direction: row; - justify-content: space-between; + justify-content: flex-start; align-items: center; width: 100%; - margin-bottom: 16px; -} -.theme-light .dialog-wrapper > .dialog-container > .dialog-header-container > .title-text > .icon-text { - margin-right: 6px; - font-size: 16px; -} -.theme-light .dialog-wrapper > .dialog-container > .dialog-header-container .btn { - width: 24px; - height: 24px; - padding: 2px; - border-radius: 4px; + font-size: 12px; + line-height: 20px; + color: #ffffff; } -.theme-light .dialog-wrapper > .dialog-container > .dialog-header-container .btn > .icon-img { - width: 20px; - height: 20px; +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start .property-social-icons { + width: 1em; + height: 1em; + background-color: black; } -.theme-light .dialog-wrapper > .dialog-container > .dialog-header-container .btn:hover { - background-color: lightgray; +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start > .name-text { + font-size: 13px; + color: #37352f; + margin-left: 8px; + line-height: 20px; } -.theme-light .dialog-wrapper > .dialog-container > .dialog-content-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start > .icon-text { + font-size: 15px; + margin-right: 6px; } -.theme-light .dialog-wrapper > .dialog-container > .dialog-footer-container { +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-end { display: flex; flex-direction: row; justify-content: flex-end; align-items: center; width: 100%; - margin-top: 16px; + font-size: 12px; + line-height: 20px; + color: gray; +} +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-end > .name-text { + font-size: 13px; + color: #37352f; + margin-left: 4px; + line-height: 20px; +} +.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-end > .icon-text { + font-size: 15px; + margin-right: 6px; } @media only screen and (max-width: 875px) { - .theme-light .dialog-wrapper { + .theme-light .dialog-wrapper.share-memo-image-dialog { + padding: 24px 16px; + padding-top: 64px; + justify-content: unset; + } + .theme-light .dialog-wrapper.share-memo-image-dialog::-webkit-scrollbar { + display: none; + } + .theme-light .dialog-wrapper.share-memo-image-dialog .memo-background > .memo-content-text { + padding-right: 8%; + padding-bottom: 12px; + padding-left: 8%; width: 100%; - padding: 0 16px; + word-wrap: break-word; + font-size: 15px; + background-color: white; } - .theme-light .dialog-wrapper > .dialog-container { - max-width: 100%; + .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + flex-wrap: nowrap; + width: 100%; + padding: 16px 26px; + background: white; + } + .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container > .normal-text.footer-start { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + width: 100%; + font-size: 12px; + line-height: 20px; + color: #ffffff; + } + .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container > .normal-text.footer-start .property-social-icons { + width: 1em; + height: 1em; + background-color: black; + } + .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container > .normal-text.footer-start > .name-text { + font-size: 13px; + color: #37352f; + margin-left: 8px; + margin-right: -15px; + line-height: 20px; + } + .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container > .normal-text.footer-start > .icon-text { + font-size: 15px; + margin-right: 6px; + } + .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container > .normal-text.footer-end { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + width: 100%; + font-size: 12px; + line-height: 20px; + color: gray; + } + .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container > .normal-text.footer-end > .name-text { + font-size: 13px; + color: #37352f; + margin-left: 4px; + line-height: 20px; + } + .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container > .normal-text.footer-end > .icon-text { + font-size: 15px; + margin-right: 6px; } } -.theme-dark .dialog-wrapper { +.theme-dark .share-memo-image-dialog > .dialog-container { + width: 380px; + padding: 0; + background-color: #727171; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-header-container { + padding: 8px 16px; + padding-left: 24px; + margin-bottom: 0; + background-color: #000000; + border-top-left-radius: 8px; + border-top-right-radius: 8px; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-header-container > .btn-group > .close-btn { + background-color: #000000; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-header-container > .btn-group > .close-btn > .icon-img { + fill: #cdcdcd; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container { display: flex; flex-direction: column; justify-content: flex-start; - align-items: center; - position: fixed; - top: 0; + align-items: flex-start; + position: relative; + width: 100%; + min-height: 128px; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .tip-words-container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + width: 100%; + border-bottom: 1px solid #3a3a3a; + background-color: #000000; + padding: 0 24px; + padding-bottom: 8px; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .tip-words-container > .tip-text { + color: #bdbdbd; + font-size: 13px; + line-height: 24px; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .tip-words-container.loading > .tip-text { + animation: 1s linear 1s infinite alternate breathing; +} +@keyframes breathing { + from { + opacity: 1; + } + to { + opacity: 0.4; + } +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 380px; + max-width: 100%; + height: auto; + user-select: none; + position: relative; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-shortcut-img { + position: absolute; + top: 0; left: 0; + z-index: 1; width: 100%; - height: 100%; - background-color: transparent; - z-index: 100; - transition: all 0.2s ease; - overflow-x: hidden; - overflow-y: scroll; - padding: 64px 0; + height: auto; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background { + display: flex; + justify-content: center; + align-items: center; + margin-top: 15px; + margin-right: 15px; + margin-bottom: 15px; + margin-left: 12px; + width: calc(100% - 27px); + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + position: relative; + border-radius: 16px; + overflow: hidden; + -webkit-box-shadow: 15px 15px 27px #666666, -15px -15px 27px #3a3a3a; + box-shadow: 6px 4px 4px 2px #383333, 5px 2px 4px 2px #444444; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .property-image { + height: 6em; + width: 100%; + position: Absolute; + top: 0px; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .time-text { + width: 100%; + padding: 0 24px; + padding-top: 20px; + font-size: 12px; + color: #b9b9b9; + background-color: #1f1f1f; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .background-container { + height: 6em; + background: transparent; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .memo-content-text { + padding-right: 8%; + padding-bottom: 12px; + padding-left: 8%; + width: 100%; + word-wrap: break-word; + font-size: 15px; + background-color: #1f1f1f; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 100%; + height: auto; + padding: 0 20px; + padding-bottom: 8px; + background-color: #1f1f1f; scrollbar-width: none; } -.theme-dark .dialog-wrapper::-webkit-scrollbar { +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.theme-dark .dialog-wrapper::-webkit-scrollbar-thumb { +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.theme-dark .dialog-wrapper::-webkit-scrollbar-thumb:hover { +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.theme-dark .dialog-wrapper::-webkit-scrollbar { +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar { display: none; } -.theme-dark .dialog-wrapper.showup { - background-color: rgba(85, 85, 85, 0.6); +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container > img { + width: 100%; + height: auto; + margin-bottom: 8px; + border-radius: 4px; } -.theme-dark .dialog-wrapper.showoff { - display: none; +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background .tag-span { + display: inline-block; + /* width: auto; */ + padding-left: 4px; + padding-right: 6px; + margin-left: -2px; + line-height: 22px; + font-size: 12px; + border: none; + border-radius: 4px; + color: #d7e0f7; + background-color: #555a65; + cursor: pointer; + vertical-align: bottom; + text-align: left; } -.theme-dark .dialog-wrapper > .dialog-container { +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container { display: flex; - flex-direction: column; + flex-direction: row; justify-content: flex-start; - align-items: flex-start; + align-items: center; + flex-wrap: nowrap; + width: 100%; + padding: 16px 26px; background-color: #000000; - padding: 16px; - border-radius: 8px; } -.theme-dark .dialog-wrapper > .dialog-container > .dialog-header-container { +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start { display: flex; flex-direction: row; - justify-content: space-between; + justify-content: flex-start; align-items: center; width: 100%; - margin-bottom: 16px; -} -.theme-dark .dialog-wrapper > .dialog-container > .dialog-header-container > .title-text > .icon-text { - margin-right: 6px; - font-size: 16px; + font-size: 12px; + line-height: 20px; + color: #a1a1a1; } -.theme-dark .dialog-wrapper > .dialog-container > .dialog-header-container .btn { - width: 24px; - height: 24px; - padding: 2px; - border-radius: 4px; +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start .property-social-icons { + width: 1em; + height: 1em; background-color: black; } -.theme-dark .dialog-wrapper > .dialog-container > .dialog-header-container .btn > .icon-img { - width: 20px; - height: 20px; - filter: invert(0.8); -} -.theme-dark .dialog-wrapper > .dialog-container > .dialog-header-container .btn:hover { - background-color: #494949; +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start > .name-text { + font-size: 13px; + color: #d2d1cd; + margin-left: 8px; + line-height: 20px; } -.theme-dark .dialog-wrapper > .dialog-container > .dialog-content-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start > .icon-text { + font-size: 15px; + margin-right: 6px; } -.theme-dark .dialog-wrapper > .dialog-container > .dialog-footer-container { +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-end { display: flex; flex-direction: row; justify-content: flex-end; align-items: center; width: 100%; - margin-top: 16px; + font-size: 12px; + line-height: 20px; + color: #a1a1a1; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-end > .name-text { + font-size: 13px; + color: #d2d1cd; + margin-left: 4px; + line-height: 20px; +} +.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-end > .icon-text { + font-size: 15px; + margin-right: 6px; } @media only screen and (max-width: 875px) { - .theme-dark .dialog-wrapper { - width: 100%; - padding: 0 16px; + .theme-dark .dialog-wrapper.share-memo-image-dialog { + padding: 24px 16px; + padding-top: 64px; + justify-content: unset; } - .theme-dark .dialog-wrapper > .dialog-container { - max-width: 100%; + .theme-dark .dialog-wrapper.share-memo-image-dialog::-webkit-scrollbar { + display: none; } } .mono-font-family { @@ -1980,389 +1978,471 @@ div[data-type='memos_view'] .memos-header-container > .btns-container { .hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-light .preview-image-dialog { - padding: 0; -} -.theme-light .preview-image-dialog > .dialog-container { +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text, +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text { display: flex; flex-direction: column; - justify-content: center; - align-items: center; - position: relative; + justify-content: flex-start; + align-items: flex-start; + width: 400px; + word-wrap: break-word; + word-break: break-word; + white-space: pre-wrap; +} +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text > p, +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text > p { + display: inline-block; width: 100%; - height: 100%; - background-color: unset; - padding: 0; + height: auto; + margin-bottom: 4px; + font-size: 15px; + line-height: 24px; + min-height: 24px; + white-space: pre-wrap; } -.theme-light .preview-image-dialog > .dialog-container > .close-btn { - position: fixed; - top: 36px; - right: 36px; - width: 36px; - height: 36px; - padding: 4px; - cursor: pointer; +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text > p > a, +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text > p > a { + width: 400px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .tag-span, +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text .tag-span { + display: inline-block; + width: auto; + padding-left: 4px; + padding-right: 6px; + margin-left: 4px; + line-height: 24px; + font-size: 13px; + border: none; border-radius: 4px; - background-color: #d8d8d8; - z-index: 1; + color: #5783f7; + background-color: #eef3fe; + cursor: pointer; + vertical-align: bottom; } -.theme-light .preview-image-dialog > .dialog-container > .close-btn > .icon-img { - width: 28px; - height: 28px; +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .tag-span:hover, +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text .tag-span:hover { + background-color: #5783f7; + color: white; } -.theme-light .preview-image-dialog > .dialog-container > .close-btn:hover { +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .memo-link-text, +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text .memo-link-text { + display: inline-block; + color: #5783f7; + font-weight: bold; + border-bottom: none; + text-decoration: none; + cursor: pointer; +} +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .memo-link-text:hover, +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text .memo-link-text:hover { opacity: 0.8; } -.theme-light .preview-image-dialog > .dialog-container > .img-container { +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .counter-block, +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text .counter-block, +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .todo-block, +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text .todo-block { + display: inline-block; + text-align: center; + width: 1.4rem; + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text pre, +.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text pre { width: 100%; - height: 100%; + margin: 4px 0; + padding: 8px 12px; + border-radius: 4px; + font-size: 15px; + line-height: 1.5; + background-color: #f6f5f4; + white-space: pre-wrap; +} +.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text { display: flex; flex-direction: column; - overflow: auto; - scrollbar-width: none; -} -.theme-light .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; -} -.theme-light .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; -} -.theme-light .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar-thumb:hover { - background-color: #ccc; -} -.theme-light .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar { - display: none; + justify-content: flex-start; + align-items: flex-start; + width: 100%; + word-wrap: break-word; + word-break: break-word; + white-space: pre-wrap; } -.theme-light .preview-image-dialog > .dialog-container > .img-container > img { - padding: 16px; +.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text > p { + display: inline-block; + width: 100%; height: auto; - margin: auto; -} -.theme-light .preview-image-dialog > .dialog-container > .img-container > .loading-text { - color: white; - font-size: 24px; - margin: auto; - border-bottom: 2px solid white; - padding: 8px 4px; -} -.theme-light .preview-image-dialog > .dialog-container > .action-btns-container { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - position: fixed; - bottom: 36px; - z-index: 1; + margin-bottom: 4px; + margin-top: -2px; + font-size: 15px; + line-height: 24px; + min-height: 24px; + white-space: pre-wrap; } -.theme-light .preview-image-dialog > .dialog-container > .action-btns-container > .btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 40px; - height: 40px; - font-size: 20px; - margin-right: 16px; +.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text .tag-span { + display: inline-block; + width: auto; + padding-left: 4px; + padding-right: 6px; + margin-left: 4px; + line-height: 24px; + font-size: 13px; + border: none; border-radius: 4px; - background-color: lightgray; - box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); + color: #5783f7; + background-color: #eef3fe; + cursor: pointer; + vertical-align: bottom; } -.theme-light .preview-image-dialog > .dialog-container > .action-btns-container > .btn:last-child { - margin-right: 0; +.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text .tag-span:hover { + background-color: #5783f7; + color: white; } -.theme-light .preview-image-dialog > .dialog-container > .action-btns-container > .btn:hover, -.theme-light .preview-image-dialog > .dialog-container > .action-btns-container > .btn:active { - opacity: 0.8; +.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text .memo-link-text { + display: inline-block; + color: #5783f7; + font-weight: bold; + border-bottom: none; + text-decoration: none; + cursor: pointer; } -@media only screen and (max-width: 875px) { - .theme-light .preview-image-dialog { - padding: 0; - } - .theme-light .preview-image-dialog > .dialog-container { - max-width: 100%; - } - .theme-light .preview-image-dialog > .dialog-container > .img-container > img { - padding: 6px; - } +.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text .memo-link-text:hover { + opacity: 0.8; } -.theme-dark .preview-image-dialog { - padding: 0; +.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text .counter-block, +.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text .todo-block { + display: inline-block; + text-align: center; + width: 1.4rem; + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } -.theme-dark .preview-image-dialog > .dialog-container { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - position: relative; +.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text pre { width: 100%; - height: 100%; - background-color: unset; - padding: 0; -} -.theme-dark .preview-image-dialog > .dialog-container > .close-btn { - position: fixed; - top: 36px; - right: 36px; - width: 36px; - height: 36px; - padding: 4px; - cursor: pointer; + margin: 4px 0; + padding: 8px 12px; border-radius: 4px; - background-color: #c39999; - z-index: 1; + font-size: 15px; + line-height: 1.5; + background-color: #f6f5f4; + white-space: pre-wrap; } -.theme-dark .preview-image-dialog > .dialog-container > .close-btn > .icon-img { - width: 28px; - height: 28px; +.theme-light div[data-type='memos_view'].mobile-view .memo-content-text > p { + font-size: 15px; + line-height: 26px; + min-height: 26px; + white-space: pre-wrap; } -.theme-dark .preview-image-dialog > .dialog-container > .close-btn:hover { - opacity: 0.8; +.theme-light div[data-type='memos_view'].mobile-view .memo-content-text .tag-span { + line-height: 26px; + font-size: 14px; } -.theme-dark .preview-image-dialog > .dialog-container > .img-container { - width: 100%; - height: 100%; +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text { display: flex; flex-direction: column; - overflow: auto; - scrollbar-width: none; + justify-content: flex-start; + align-items: flex-start; + width: 100%; + word-wrap: break-word; + word-break: break-word; + white-space: pre-wrap; + color: #d2d1cd; } -.theme-dark .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar { - width: 0; - height: 0; +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text > p { + display: inline-block; + width: 100%; + height: auto; + margin-bottom: 4px; + font-size: 15px; + line-height: 24px; + min-height: 24px; + white-space: pre-wrap; + color: #d2d1cd; +} +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .tag-span { + display: inline-block; + width: auto; + padding-left: 4px; + padding-right: 6px; + margin-left: 4px; + line-height: 24px; + font-size: 13px; + border: none; + border-radius: 4px; + color: #bbbec7; + background-color: #616161; cursor: pointer; + vertical-align: bottom; } -.theme-dark .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .tag-span:hover { + background-color: #bbbec7; + color: #000000; } -.theme-dark .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .memo-link-text { + display: inline-block; + color: #bbbec7; + font-weight: bold; + border-bottom: none; + text-decoration: none; + cursor: pointer; } -.theme-dark .preview-image-dialog > .dialog-container > .img-container::-webkit-scrollbar { - display: none; -} -.theme-dark .preview-image-dialog > .dialog-container > .img-container > img { - padding: 16px; - height: auto; - margin: auto; -} -.theme-dark .preview-image-dialog > .dialog-container > .img-container > .loading-text { - color: #000000; - font-size: 24px; - margin: auto; - border-bottom: 2px solid #000000; - padding: 8px 4px; -} -.theme-dark .preview-image-dialog > .dialog-container > .action-btns-container { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - position: fixed; - bottom: 36px; - z-index: 1; -} -.theme-dark .preview-image-dialog > .dialog-container > .action-btns-container > .btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 40px; - height: 40px; - font-size: 20px; - margin-right: 16px; - border-radius: 4px; - background-color: #2c2c2c; -} -.theme-dark .preview-image-dialog > .dialog-container > .action-btns-container > .btn:last-child { - margin-right: 0; -} -.theme-dark .preview-image-dialog > .dialog-container > .action-btns-container > .btn:hover, -.theme-dark .preview-image-dialog > .dialog-container > .action-btns-container > .btn:active { +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .memo-link-text:hover { opacity: 0.8; } -@media only screen and (max-width: 875px) { - .theme-dark .preview-image-dialog { - padding: 0; - } - .theme-dark .preview-image-dialog > .dialog-container { - max-width: 100%; - } - .theme-dark .preview-image-dialog > .dialog-container > .img-container > img { - padding: 6px; - } -} -.mono-font-family { +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .counter-block, +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .todo-block { + display: inline-block; + text-align: center; + width: 1.4rem; font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } -.hide-scroll-bar { - scrollbar-width: none; -} -.hide-scroll-bar::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; -} -.hide-scroll-bar::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; -} -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text pre { + width: 100%; + margin: 4px 0; + padding: 8px 12px; + border-radius: 4px; + font-size: 15px; + line-height: 1.5; + background-color: #0c0c0c; + white-space: pre-wrap; } -.hide-scroll-bar::-webkit-scrollbar { - display: none; +.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text, +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 100%; + word-wrap: break-word; + word-break: break-word; + white-space: pre-wrap; + color: #d2d1cd; } -div[data-type='memos_view'] .image-container { - width: 200px; +.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text > p, +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text > p { + display: inline-block; + width: 100%; height: auto; - overflow-y: scroll; - cursor: pointer; - -webkit-tap-highlight-color: transparent; - scrollbar-width: none; + margin-bottom: 4px; + margin-top: -2px; + font-size: 15px; + line-height: 24px; + min-height: 24px; + white-space: pre-wrap; + color: #d2d1cd; } -div[data-type='memos_view'] .image-container::-webkit-scrollbar { - width: 2px; - height: 0; +.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text .tag-span, +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text .tag-span { + display: inline-block; + width: auto; + padding-left: 4px; + padding-right: 6px; + margin-left: 4px; + line-height: 24px; + font-size: 13px; + border: none; + border-radius: 4px; + color: #bbbec7; + background-color: #616161; cursor: pointer; + vertical-align: bottom; } -div[data-type='memos_view'] .image-container::-webkit-scrollbar-thumb { - width: 2px; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; +.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text .tag-span:hover, +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text .tag-span:hover { + background-color: #bbbec7; + color: white; } -div[data-type='memos_view'] .image-container::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text .memo-link-text, +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text .memo-link-text { + display: inline-block; + color: #bbbec7; + font-weight: bold; + border-bottom: none; + text-decoration: none; + cursor: pointer; } -div[data-type='memos_view'] .image-container > img { - margin: auto; - width: 100%; - height: auto; +.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text .memo-link-text:hover, +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text .memo-link-text:hover { + opacity: 0.8; } -.mono-font-family { +.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text .counter-block, +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text .counter-block, +.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text .todo-block, +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text .todo-block { + display: inline-block; + text-align: center; + width: 1.4rem; font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } -.hide-scroll-bar { - scrollbar-width: none; -} -.hide-scroll-bar::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; -} -.hide-scroll-bar::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; -} -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text pre, +.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-comment-text pre { + width: 100%; + margin: 4px 0; + padding: 8px 12px; + border-radius: 4px; + font-size: 15px; + line-height: 1.5; + background-color: #f6f5f4; + white-space: pre-wrap; } -.hide-scroll-bar::-webkit-scrollbar { - display: none; +.theme-dark div[data-type='memos_view'].mobile-view .memolist-wrapper .memo-content-text { + color: #d2d1cd; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container { - padding: 0; - background-color: transparent; +.theme-dark div[data-type='memos_view'].mobile-view .memolist-wrapper .memo-content-text > p { + font-size: 15px; + line-height: 26px; + min-height: 26px; + white-space: pre-wrap; + color: #d2d1cd; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > * { - flex-shrink: 0; +.theme-dark div[data-type='memos_view'].mobile-view .memolist-wrapper .memo-content-text .tag-span { + line-height: 26px; + font-size: 14px; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container { - position: relative; +.theme-light div[data-type='memos_view'] .memo-wrapper { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - width: 512px; - min-height: 64px; - max-width: 100%; - padding: 12px 24px; - margin-bottom: 12px; + width: 100%; + padding: 12px 18px; + background-color: #ffffff; border-radius: 8px; - background-color: #fbf4de; + border: 1px solid #f1f1f1; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > * { - z-index: 1; +.theme-light div[data-type='memos_view'] .memo-wrapper:hover { + border-color: #e4e4e4; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container { +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper { display: flex; flex-direction: row; justify-content: space-between; align-items: center; width: 100%; - height: auto; - padding-bottom: 0; - margin-bottom: 0; - margin-top: 0; + height: 24px; + margin-bottom: 14px; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .time-text { - font-size: 14px; - color: gray; - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-left-wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container { +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-left-wrapper > .time-text { + font-size: 12px; + line-height: 24px; + color: #a8a8a8; + flex-shrink: 0; + cursor: pointer; +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-left-wrapper > .memo-type-img { + width: 11%; + height: 20px; + margin-left: 3px; + filter: opacity(0.9) invert(80%); +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper { display: flex; flex-direction: row; justify-content: flex-end; align-items: center; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container > .btn { +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .comment-button-wrapper { display: flex; flex-direction: row; justify-content: center; align-items: center; - width: 24px; - height: 24px; - margin-left: 4px; - border-radius: 4px; -} -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container > .btn:hover { - background-color: white; + font-size: 12px; + width: 40%; + height: 21px; + margin-right: 4px; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container > .btn > .icon-img { - width: 20px; - height: 20px; +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + position: relative; + flex-shrink: 0; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container { +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container > .more-action-btns-wrapper { display: flex; flex-direction: column; justify-content: flex-start; - align-items: flex-start; - width: 100%; - padding-top: 8px; + align-items: center; + position: absolute; + flex-wrap: nowrap; + top: calc(100% - 14px); + right: -16px; + width: auto; + height: auto; + padding: 12px; + z-index: 1; + display: none; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .memo-content-text { +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container > .more-action-btns-wrapper:hover { + display: flex; +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container { + width: 112px; + height: auto; + line-height: 18px; + padding: 4px; + white-space: nowrap; + border-radius: 8px; + background-color: white; + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); + z-index: 1; +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn { width: 100%; - font-size: 16px; - line-height: 1.6; - word-wrap: break-word; - word-break: break-all; - padding-top: 4px; + padding: 8px 0 8px 24px; + border-radius: 4px; + height: unset; + line-height: unset; + justify-content: flex-start; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .memo-content-text .tag-span { - margin: 0; - padding: 0; - font-size: 14px; - color: #5783f7; - background-color: unset; - padding-left: 4px; - padding-right: 6px; - margin-left: 4px; +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn.delete-btn { + color: #d28653; +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn.delete-btn.final-confirm { + font-weight: bold; +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container .btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 100%; + height: 28px; + font-size: 13px; + border-radius: 4px; +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container .btn:hover { + background-color: #f8f8f8; +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container .btn.more-action-btn { + width: 28px; cursor: unset; + margin-right: -6px; + opacity: 0.8; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper { +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container .btn.more-action-btn > .icon-img { + width: 16px; + height: 16px; +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container .btn.more-action-btn:hover { + background-color: unset; +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container .btn.more-action-btn:hover + .more-action-btns-wrapper { + display: flex; +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-content-text { + width: 100%; +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper { display: flex; flex-direction: row; justify-content: flex-start; @@ -2371,24 +2451,24 @@ div[data-type='memos_view'] .image-container > img { width: 100%; overflow-x: auto; overflow-y: hidden; - padding-bottom: 2px; + padding-bottom: 4px; scrollbar-width: none; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper::-webkit-scrollbar { +.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper::-webkit-scrollbar { width: 0; height: 2px; cursor: pointer; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper::-webkit-scrollbar-thumb { +.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper::-webkit-scrollbar-thumb { width: 0; height: 2px; border-radius: 8px; background-color: #d5d5d5; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper::-webkit-scrollbar-thumb:hover { +.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img { +.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img { margin-right: 8px; width: auto; height: 128px; @@ -2397,192 +2477,239 @@ div[data-type='memos_view'] .image-container > img { overflow-y: hidden; scrollbar-width: none; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar { +.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar-thumb { +.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar-thumb:hover { +.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar { +.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar { display: none; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img:hover { +.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img:hover { border-color: lightgray; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img:last-child { +.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img:last-child { margin-right: 0; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img > img { +.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img > img { width: auto; max-height: 128px; border-radius: 8px; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .normal-text { +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper { + width: 100%; +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list { + border-top: 1px solid #e4e4e4; margin-top: 8px; - font-size: 13px; - color: gray; + overflow-y: auto; + max-height: 300px; + scrollbar-width: none; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .layer-container, -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .background-layer-container { - position: absolute; - bottom: -3px; - left: 3px; - width: calc(100% - 6px); - height: 100%; +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list::-webkit-scrollbar-thumb { + width: 0; + height: 0; border-radius: 8px; - z-index: -1; - background-color: #fbf4de; - border-bottom: 1px solid lightgray; + background-color: #d5d5d5; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .layer-container { - z-index: 0; - background-color: #fbf4de; - border: 1px solid lightgray; - width: 100%; - height: 100%; - position: absolute; - top: 0; - left: 0; +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper { +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list::-webkit-scrollbar { + display: none; +} +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list .memo-comment { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - width: 512px; - max-width: 100%; - margin-top: 8px; - padding: 12px 24px; - border-radius: 8px; - background-color: white; -} -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper:last-child { - margin-bottom: 36px; -} -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .normal-text { - font-size: 13px; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .linked-memo-container { - font-size: 13px; +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list .memo-comment .memo-comment-time { + font-size: 12px; line-height: 24px; - margin-top: 8px; + color: #a8a8a8; + flex-shrink: 0; cursor: pointer; - max-width: 100%; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .linked-memo-container:hover { - opacity: 0.8; +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list .memo-comment .memo-comment-text { + width: 100%; + font-size: 12px; } -.theme-light .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .linked-memo-container > .time-text { - color: gray; - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-inputer > .common-editor-wrapper { + border: 1px solid #e4e4e4; + margin-top: 8px; + border-radius: 8px; + padding-bottom: 10px; + padding-top: 8px; } -@media only screen and (max-width: 875px) { - .theme-light div[data-type='memos_view'] .dialog-wrapper.memo-card-dialog { - padding: 24px 16px; - padding-top: 64px; - } +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-inputer > .common-editor-wrapper > .common-editor-inputer { + font-size: 12px; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container { - padding: 0; - background-color: transparent; +.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper .confirm-btn { + transform: scale(0.9); } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > * { - flex-shrink: 0; +.theme-light div[data-type='memos_view'].mobile-view .memo-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container { + line-height: 0; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container { - position: relative; +.theme-dark div[data-type='memos_view'] .memo-wrapper { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - width: 512px; - min-height: 64px; - max-width: 100%; - padding: 12px 24px; - margin-bottom: 12px; + width: 100%; + padding: 12px 18px; + background-color: #303030; border-radius: 8px; - background-color: #5f5f5f; + border: 1px solid #4a4a4a; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > * { - z-index: 1; +.theme-dark div[data-type='memos_view'] .memo-wrapper:hover { + border-color: #353535; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper { display: flex; flex-direction: row; justify-content: space-between; align-items: center; width: 100%; - height: auto; - padding-bottom: 0; - margin-bottom: 0; - margin-top: 0; + height: 24px; + margin-bottom: 14px; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .time-text { - font-size: 14px; +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-left-wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-left-wrapper > .time-text { + font-size: 12px; + line-height: 24px; color: #a8a8a8; - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; + flex-shrink: 0; + cursor: pointer; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-left-wrapper > .memo-type-img { + width: 11%; + height: 20px; + margin-left: 3px; + filter: invert(0.9); +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper { display: flex; flex-direction: row; justify-content: flex-end; align-items: center; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container > .btn { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .comment-button-wrapper { display: flex; flex-direction: row; justify-content: center; align-items: center; - width: 24px; - height: 24px; - margin-left: 4px; - border-radius: 4px; - background-color: #5f5f5f; -} -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container > .btn:hover { - background-color: #444444; + font-size: 12px; + width: 40%; + height: 21px; + margin-right: 4px; + fill: #cdcdcd; + filter: invert(0.9); } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .header-container > .btns-container > .btn > .icon-img { - width: 20px; - height: 20px; - filter: invert(0.8); +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + position: relative; + flex-shrink: 0; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container > .more-action-btns-wrapper { display: flex; flex-direction: column; justify-content: flex-start; - align-items: flex-start; - width: 100%; - padding-top: 8px; -} -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .memo-content-text { - width: 100%; - font-size: 16px; - line-height: 1.6; - word-wrap: break-word; - word-break: break-all; - padding-top: 4px; -} -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .memo-content-text .tag-span { - margin: 0; - padding: 0; - font-size: 14px; - color: #bbbec7; - background-color: unset; + align-items: center; + position: absolute; + flex-wrap: nowrap; + top: calc(100% - 14px); + right: -16px; + width: auto; + height: auto; + padding: 12px; + z-index: 1; + display: none; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container > .more-action-btns-wrapper:hover { + display: flex; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container { + width: 112px; + height: auto; + line-height: 18px; + padding: 4px; + white-space: nowrap; + border-radius: 8px; + background-color: #181818; + z-index: 1; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn { + width: 100%; + padding: 8px 0 8px 24px; + border-radius: 4px; + height: unset; + line-height: unset; + justify-content: flex-start; + color: #d2d1cd; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn.delete-btn { + color: #940b01; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn.delete-btn.final-confirm { + font-weight: bold; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container .btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 100%; + height: 28px; + font-size: 13px; + border-radius: 4px; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container .btn:hover { + background-color: #808080; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container .btn.more-action-btn { + width: 28px; cursor: unset; + margin-right: -6px; + opacity: 0.8; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container .btn.more-action-btn > .icon-img { + width: 16px; + height: 16px; + fill: #cdcdcd; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container .btn.more-action-btn:hover { + background-color: unset; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-right-wrapper > .btns-container .btn.more-action-btn:hover + .more-action-btns-wrapper { + display: flex; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-content-text { + width: 100%; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper { display: flex; flex-direction: row; justify-content: flex-start; @@ -2591,24 +2718,24 @@ div[data-type='memos_view'] .image-container > img { width: 100%; overflow-x: auto; overflow-y: hidden; - padding-bottom: 2px; + padding-bottom: 4px; scrollbar-width: none; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper::-webkit-scrollbar { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper::-webkit-scrollbar { width: 0; height: 2px; cursor: pointer; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper::-webkit-scrollbar-thumb { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper::-webkit-scrollbar-thumb { width: 0; height: 2px; border-radius: 8px; background-color: #d5d5d5; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper::-webkit-scrollbar-thumb:hover { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img { margin-right: 8px; width: auto; height: 128px; @@ -2617,101 +2744,101 @@ div[data-type='memos_view'] .image-container > img { overflow-y: hidden; scrollbar-width: none; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar-thumb { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar-thumb:hover { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img::-webkit-scrollbar { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar { display: none; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img:hover { - border-color: #3a3a3a; +.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img:hover { + border-color: #444444; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img:last-child { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img:last-child { margin-right: 0; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .memo-container > .images-wrapper > .memo-img > img { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img > img { width: auto; max-height: 128px; border-radius: 8px; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .normal-text { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper { + width: 100%; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list { + border-top: 1px solid #7a7a7a; margin-top: 8px; - font-size: 13px; - color: gray; + overflow-y: auto; + max-height: 400px; + scrollbar-width: none; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .layer-container, -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .background-layer-container { - position: absolute; - bottom: -3px; - left: 3px; - width: calc(100% - 6px); - height: 100%; +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list::-webkit-scrollbar-thumb { + width: 0; + height: 0; border-radius: 8px; - z-index: -1; - background-color: #5f5f5f; - border-bottom: 1px solid #3f3f3f; + background-color: #d5d5d5; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .memo-card-container > .layer-container { - z-index: 0; - background-color: #5f5f5f; - border: 1px solid #3f3f3f; - width: 100%; - height: 100%; - position: absolute; - top: 0; - left: 0; +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper { +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list::-webkit-scrollbar { + display: none; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list .memo-comment { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - width: 512px; - max-width: 100%; - margin-top: 8px; - padding: 12px 24px; - border-radius: 8px; - background-color: #000000; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper:last-child { - margin-bottom: 36px; +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list .memo-comment .memo-comment-time { + font-size: 12px; + line-height: 24px; + color: #a8a8a8; + flex-shrink: 0; + cursor: pointer; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .normal-text { - font-size: 13px; +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-list .memo-comment .memo-comment-text { + width: 100%; + font-size: 12px; + color: #d2d1cd; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .linked-memo-container { - font-size: 13px; - line-height: 24px; +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-inputer > .common-editor-wrapper { + border: 1px solid #353535; margin-top: 8px; - cursor: pointer; - max-width: 100%; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + border-radius: 8px; + padding-bottom: 10px; + padding-top: 8px; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .linked-memo-container:hover { - opacity: 0.8; +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-inputer > .common-editor-wrapper > .common-editor-inputer { + font-size: 12px; } -.theme-dark .dialog-wrapper.memo-card-dialog > .dialog-container > .linked-memos-wrapper > .linked-memo-container > .time-text { - color: #a8a8a8; - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-inputer > .common-editor-wrapper > .common-editor-inputer .textarea { + margin-left: 5px; } -@media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .dialog-wrapper.memo-card-dialog { - padding: 24px 16px; - padding-top: 64px; - } +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper > .memo-comment-inputer > .common-editor-wrapper > .common-editor-inputer .textarea:focus { + margin-left: 8px; + margin-right: 8px; +} +.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-comment-wrapper .confirm-btn { + transform: scale(0.9); +} +.theme-dark div[data-type='memos_view'].mobile-view .memo-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container { + line-height: 0; } .mono-font-family { font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; @@ -2736,548 +2863,442 @@ div[data-type='memos_view'] .image-container > img { .hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-light .share-memo-image-dialog > .dialog-container { - width: 380px; - padding: 0; - background-color: #eaeaea; -} -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-header-container { - padding: 8px 16px; - padding-left: 24px; - margin-bottom: 0; - background-color: white; - border-top-left-radius: 8px; - border-top-right-radius: 8px; - font-family: 'RobotoDraft', 'Roboto', sans-serif; - -webkit-font-smoothing: antialiased; -} -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-header-container > .btn-group > .copy-btn { - background-color: #ffffff; -} -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-header-container > .btn-group > .close-btn { - background-color: #ffffff; -} -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container { +.theme-light div[data-type='memos_view'] .common-editor-wrapper { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; position: relative; width: 100%; - min-height: 128px; -} -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .tip-words-container { - display: flex; - flex-direction: column; - justify-content: center; - align-items: flex-start; - width: 100%; - border-bottom: 1px solid lightgray; + height: auto; background-color: white; - padding: 0 24px; - padding-bottom: 8px; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .tip-words-container > .tip-text { - color: gray; - font-size: 13px; +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer { + display: inline-block; + width: 100%; + min-height: 24px; + max-height: 300px; + font-size: 15px; line-height: 24px; + resize: none; + overflow-x: hidden; + background-color: transparent; + z-index: 1; + margin-bottom: 4px; + white-space: pre-wrap; + scrollbar-width: none; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .tip-words-container.loading > .tip-text { - animation: 1s linear 1s infinite alternate breathing; +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; } -@keyframes breathing { - from { - opacity: 1; - } - to { - opacity: 0.4; - } +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 380px; - max-width: 100%; - height: auto; - user-select: none; - position: relative; +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-shortcut-img { - position: absolute; - top: 0; - left: 0; - z-index: 1; +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar { + display: none; +} +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::placeholder { + padding-left: 2px; +} +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer:focus::placeholder { + color: lightgray; +} +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; width: 100%; - height: auto; - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background { +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .common-tools-container { display: flex; - justify-content: center; + flex-direction: row; + justify-content: flex-start; align-items: center; - margin-top: 15px; - margin-right: 15px; - margin-bottom: 15px; - margin-left: 12px; - width: calc(100% - 24px); - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - position: relative; - border-radius: 16px; - overflow: hidden; - -webkit-box-shadow: 15px 15px 27px #e1e1e3, -15px -15px 27px #ffffff; - box-shadow: 15px 15px 27px #c1c1c1, -15px -15px 27px #e2e2e2; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .property-image { - height: 6em; - width: 100%; - position: Absolute; - top: 0px; +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + flex-grow: 0; + flex-shrink: 0; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .time-text { - width: 100%; - padding: 0 24px; - padding-top: 20px; - font-size: 12px; +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .action-btn { + border: none; + user-select: none; + cursor: pointer; + padding: 6px 12px; + border-radius: 6px; + font-size: 13px; + line-height: 32px; +} +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .action-btn:hover { + opacity: 0.8; +} +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .cancel-btn { color: gray; - background-color: white; + background-color: transparent; + margin-right: 8px; + line-height: 18px; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .background-container { - height: 6em; - background: transparent; +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .confirm-btn { + cursor: pointer; + padding: 0 12px; + background-color: #55bb8e; + color: white; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .memo-content-text { - padding-right: 8%; - padding-bottom: 12px; - padding-left: 8%; - width: 100%; - word-wrap: break-word; - font-size: 15px; - background-color: white; +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .confirm-btn:disabled { + cursor: not-allowed; + opacity: 0.6; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container { +.theme-light div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .confirm-btn > .icon-text { + margin-left: 4px; +} +.theme-light div[data-type='memos_view'] .scroll::-webkit-scrollbar { + display: none; +} +.theme-dark div[data-type='memos_view'] .common-editor-wrapper { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; + position: relative; width: 100%; height: auto; - padding: 0 20px; - padding-bottom: 8px; - background-color: white; + background-color: #3b3b3b; +} +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer { + display: inline-block; + width: 100%; + min-height: 24px; + max-height: 300px; + font-size: 15px; + line-height: 24px; + resize: none; + overflow-x: hidden; + background-color: transparent; + z-index: 1; + margin-bottom: 4px; + white-space: pre-wrap; scrollbar-width: none; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar { +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar-thumb { +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar-thumb:hover { +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar { +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::-webkit-scrollbar { display: none; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container > img { - width: 100%; - height: auto; - margin-bottom: 8px; - border-radius: 4px; +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer::placeholder { + padding-left: 2px; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background .tag-span { - display: inline-block; - /* width: auto; */ - padding-left: 4px; - padding-right: 6px; - margin-left: -2px; - line-height: 22px; - font-size: 12px; - border: none; - border-radius: 4px; - color: #5783f7; - background-color: #eef3fe; - cursor: pointer; - vertical-align: bottom; - text-align: left; +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-editor-inputer:focus::placeholder { + color: #363636; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container { +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper { display: flex; flex-direction: row; - justify-content: flex-start; + justify-content: space-between; align-items: center; - flex-wrap: nowrap; width: 100%; - padding: 16px 26px; - background: white; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start { +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .common-tools-container { display: flex; flex-direction: row; justify-content: flex-start; align-items: center; - width: 100%; - font-size: 12px; - line-height: 20px; - color: #ffffff; -} -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start .property-social-icons { - width: 1em; - height: 1em; - background-color: black; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start > .name-text { - font-size: 13px; - color: #37352f; - margin-left: 8px; - line-height: 20px; -} -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start > .icon-text { - font-size: 15px; - margin-right: 6px; +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .common-tools-container > img { + filter: invert(0.8); + color: yellowgreen; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-end { +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container { display: flex; flex-direction: row; justify-content: flex-end; align-items: center; - width: 100%; - font-size: 12px; - line-height: 20px; - color: gray; + flex-grow: 0; + flex-shrink: 0; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-end > .name-text { +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .action-btn { + border: none; + user-select: none; + cursor: pointer; + padding: 6px 12px; + border-radius: 6px; font-size: 13px; - color: #37352f; + line-height: 32px; +} +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .action-btn > img { + filter: invert(0.8); +} +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .action-btn:hover { + opacity: 0.8; +} +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .cancel-btn { + color: gray; + background-color: transparent; + margin-right: 8px; + line-height: 18px; +} +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .confirm-btn { + cursor: pointer; + padding: 0 12px; + background-color: #940b01; + color: white; +} +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .confirm-btn:disabled { + cursor: not-allowed; + opacity: 0.6; +} +.theme-dark div[data-type='memos_view'] .common-editor-wrapper > .common-tools-wrapper > .btns-container > .confirm-btn > .icon-text { margin-left: 4px; - line-height: 20px; } -.theme-light .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-end > .icon-text { +.theme-dark div[data-type='memos_view'] .scroll::-webkit-scrollbar { + display: none; +} +div[data-type='memos_view'] .memo-editor-wrapper .confirm-btn { + margin-right: unset; +} +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.hide-scroll-bar { + scrollbar-width: none; +} +.hide-scroll-bar::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; +} +.hide-scroll-bar::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; +} +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { + background-color: #ccc; +} +.hide-scroll-bar::-webkit-scrollbar { + display: none; +} +.theme-light .rta { + position: relative; font-size: 15px; - margin-right: 6px; + width: 100%; + height: 100%; + z-index: 10; } -@media only screen and (max-width: 875px) { - .theme-light .dialog-wrapper.share-memo-image-dialog { - padding: 24px 16px; - padding-top: 64px; - justify-content: unset; - } - .theme-light .dialog-wrapper.share-memo-image-dialog::-webkit-scrollbar { - display: none; - } - .theme-light .dialog-wrapper.share-memo-image-dialog .memo-background > .memo-content-text { - padding-right: 8%; - padding-bottom: 12px; - padding-left: 8%; - width: 100%; - word-wrap: break-word; - font-size: 15px; - background-color: white; - } - .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - flex-wrap: nowrap; - width: 100%; - padding: 16px 26px; - background: white; - } - .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container > .normal-text.footer-start { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - width: 100%; - font-size: 12px; - line-height: 20px; - color: #ffffff; - } - .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container > .normal-text.footer-start .property-social-icons { - width: 1em; - height: 1em; - background-color: black; - } - .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container > .normal-text.footer-start > .name-text { - font-size: 13px; - color: #37352f; - margin-left: 8px; - margin-right: -15px; - line-height: 20px; - } - .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container > .normal-text.footer-start > .icon-text { - font-size: 15px; - margin-right: 6px; - } - .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container > .normal-text.footer-end { - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: center; - width: 100%; - font-size: 12px; - line-height: 20px; - color: gray; - } - .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container > .normal-text.footer-end > .name-text { - font-size: 13px; - color: #37352f; - margin-left: 4px; - line-height: 20px; - } - .theme-light .dialog-wrapper.share-memo-image-dialog .watermark-container > .normal-text.footer-end > .icon-text { - font-size: 15px; - margin-right: 6px; - } -} -.theme-dark .share-memo-image-dialog > .dialog-container { - width: 380px; - padding: 0; - background-color: #727171; -} -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-header-container { - padding: 8px 16px; - padding-left: 24px; - margin-bottom: 0; - background-color: #000000; - border-top-left-radius: 8px; - border-top-right-radius: 8px; -} -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-header-container > .btn-group > .close-btn { - background-color: #000000; -} -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-header-container > .btn-group > .close-btn > .icon-img { - filter: invert(0.8); -} -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - position: relative; - width: 100%; - min-height: 128px; -} -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .tip-words-container { - display: flex; - flex-direction: column; - justify-content: center; - align-items: flex-start; - width: 100%; - border-bottom: 1px solid #3a3a3a; - background-color: #000000; - padding: 0 24px; - padding-bottom: 8px; +.theme-light .rta > ::-webkit-scrollbar { + width: 2px; + height: 16px; + background-color: #f5f5f5; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .tip-words-container > .tip-text { - color: #bdbdbd; - font-size: 13px; - line-height: 24px; +.theme-light .rta > ::-webkit-scrollbar-track { + background-color: #f5f5f5; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .tip-words-container.loading > .tip-text { - animation: 1s linear 1s infinite alternate breathing; +.theme-light .rta ::-webkit-scrollbar-thumb { + background-color: #555; } -@keyframes breathing { - from { - opacity: 1; - } - to { - opacity: 0.4; - } +.theme-light .rta ::-webkit-scrollbar-track-piece { + background-color: #ffffff; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 380px; - max-width: 100%; - height: auto; - user-select: none; - position: relative; +.theme-light .rta__loader.rta__loader--empty-suggestion-data { + display: none; + border-radius: 3px; + box-shadow: 0 0 5px rgba(27, 31, 35, 0.1); + padding: 5px; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-shortcut-img { +.theme-light .rta--loading .rta__loader.rta__loader--suggestion-data { + display: none; position: absolute; top: 0; left: 0; - z-index: 1; width: 100%; - height: auto; - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; + height: 100%; + background: rgba(255, 255, 255, 0.8); } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background { - display: flex; - justify-content: center; - align-items: center; - margin-top: 15px; - margin-right: 15px; - margin-bottom: 15px; - margin-left: 12px; - width: calc(100% - 27px); - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; +.theme-light .rta--loading .rta__loader.rta__loader--suggestion-data > * { + display: none; position: relative; - border-radius: 16px; - overflow: hidden; - -webkit-box-shadow: 15px 15px 27px #666666, -15px -15px 27px #3a3a3a; - box-shadow: 6px 4px 4px 2px #383333, 5px 2px 4px 2px #444444; + top: 50%; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .property-image { - height: 6em; +.theme-light .rta__textarea { width: 100%; - position: Absolute; - top: 0px; + height: 100%; + font-size: 1em; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .time-text { - width: 100%; - padding: 0 24px; - padding-top: 20px; - font-size: 12px; - color: #b9b9b9; - background-color: #1f1f1f; +.theme-light .rta__autocomplete { + position: absolute; + display: block; + margin-top: 1em; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .background-container { - height: 6em; - background: transparent; +.theme-light .rta__autocomplete--top { + margin-top: 0; + margin-bottom: 1em; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .memo-content-text { - padding-right: 8%; - padding-bottom: 12px; - padding-left: 8%; - width: 100%; - word-wrap: break-word; - font-size: 15px; - background-color: #1f1f1f; +.theme-light .rta__list { + margin: 0; + padding: 0; + background: #fff; + border: 1px solid #dfe2e5; + border-radius: 0px; + box-shadow: 0 0 10px rgba(27, 31, 35, 0.1); + list-style: none; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; +.theme-light .rta__entity { + background: white; width: 100%; - height: auto; - padding: 0 20px; - padding-bottom: 8px; - background-color: #1f1f1f; - scrollbar-width: none; + text-align: left; + outline: none; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar { - width: 0; - height: 0; +.theme-light .rta__entity:hover { cursor: pointer; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; +.theme-light .rta__item { + text-overflow: 'ellipsis'; + line-height: 30px; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-light .rta__item:fisrt-child { + border-radius: 8px 8px 0px 0px; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container::-webkit-scrollbar { - display: none; +.theme-light .rta__item:not(:last-child) { + border-bottom: 1px solid #f3f3f3; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .images-container > img { - width: 100%; - height: auto; - margin-bottom: 8px; - border-radius: 4px; +.theme-light .rta__item:last-child { + border-radius: 0px 0px 0px 0px; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background .tag-span { - display: inline-block; - /* width: auto; */ +.theme-light .rta__entity > * { padding-left: 4px; - padding-right: 6px; - margin-left: -2px; - line-height: 22px; - font-size: 12px; - border: none; - border-radius: 4px; - color: #d7e0f7; - background-color: #555a65; - cursor: pointer; - vertical-align: bottom; - text-align: left; + padding-right: 4px; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - flex-wrap: nowrap; +.theme-light .rta__entity--selected { + color: #fff; + text-decoration: none; + background: #82af48; +} +.theme-dark .rta { + position: relative; + font-size: 15px; width: 100%; - padding: 16px 26px; + height: 100%; + z-index: 10; +} +.theme-dark .rta > ::-webkit-scrollbar { + width: 2px; + height: 16px; + background-color: #0f0f0f; +} +.theme-dark .rta > ::-webkit-scrollbar-track { background-color: #000000; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - width: 100%; - font-size: 12px; - line-height: 20px; - color: #a1a1a1; +.theme-dark .rta ::-webkit-scrollbar-thumb { + background-color: #c9c9c9; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start .property-social-icons { - width: 1em; - height: 1em; - background-color: black; +.theme-dark .rta ::-webkit-scrollbar-track-piece { + background-color: #000000; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start > .name-text { - font-size: 13px; - color: #d2d1cd; - margin-left: 8px; - line-height: 20px; +.theme-dark .rta__loader.rta__loader--empty-suggestion-data { + display: none; + border-radius: 3px; + box-shadow: 0 0 5px rgba(27, 31, 35, 0.1); + padding: 5px; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-start > .icon-text { - font-size: 15px; - margin-right: 6px; +.theme-dark .rta--loading .rta__loader.rta__loader--suggestion-data { + display: none; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(255, 255, 255, 0.8); } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-end { - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: center; +.theme-dark .rta--loading .rta__loader.rta__loader--suggestion-data > * { + display: none; + position: relative; + top: 50%; +} +.theme-dark .rta__textarea { width: 100%; - font-size: 12px; - line-height: 20px; - color: #a1a1a1; + height: 100%; + font-size: 1em; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-end > .name-text { - font-size: 13px; +.theme-dark .rta__autocomplete { + position: absolute; + display: block; + margin-top: 1em; +} +.theme-dark .rta__autocomplete--top { + margin-top: 0; + margin-bottom: 1em; +} +.theme-dark .rta__list { + margin: 0; + padding: 0; + background: #ffffff; + border: 1px solid #474747; + border-radius: 0px; + list-style: none; +} +.theme-dark .rta__entity { color: #d2d1cd; - margin-left: 4px; - line-height: 20px; + background: #000000; + width: 100%; + text-align: left; + outline: none; } -.theme-dark .share-memo-image-dialog > .dialog-container > .dialog-content-container > .memo-container > .memo-background > .watermark-container > .normal-text.footer-end > .icon-text { - font-size: 15px; - margin-right: 6px; +.theme-dark .rta__entity:hover { + cursor: pointer; } -@media only screen and (max-width: 875px) { - .theme-dark .dialog-wrapper.share-memo-image-dialog { - padding: 24px 16px; - padding-top: 64px; - justify-content: unset; - } - .theme-dark .dialog-wrapper.share-memo-image-dialog::-webkit-scrollbar { - display: none; - } +.theme-dark .rta__item { + text-overflow: 'ellipsis'; + line-height: 30px; +} +.theme-dark .rta__item:fisrt-child { + border-radius: 8px 8px 0px 0px; +} +.theme-dark .rta__item:not(:last-child) { + border-bottom: 1px solid #141414; +} +.theme-dark .rta__item:last-child { + border-radius: 0px 0px 0px 0px; +} +.theme-dark .rta__entity > * { + padding-left: 4px; + padding-right: 4px; +} +.theme-dark .rta__entity--selected { + color: #000000; + text-decoration: none; + background: #af487b; +} +.theme-light div[data-type='memos_view'].mobile-view .rta__textarea { + max-height: 140px; + overflow-y: scroll; +} +.theme-dark div[data-type='memos_view'].mobile-view .rta__textarea { + max-height: 140px; + overflow-y: scroll; } .mono-font-family { font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; @@ -3302,702 +3323,558 @@ div[data-type='memos_view'] .image-container > img { .hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text { +.theme-light .daily-memo-wrapper { display: flex; - flex-direction: column; + flex-direction: row; justify-content: flex-start; align-items: flex-start; - width: 400px; - word-wrap: break-word; - word-break: break-word; - white-space: pre-wrap; + position: relative; + width: calc(100% - 24px); + margin-left: 24px; + padding: 0; + padding-bottom: 24px; + border: none; + border-left: 2px solid #f8f8f8; } -.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text > p { - display: inline-block; - width: 100%; - height: auto; - margin-bottom: 4px; - font-size: 15px; +.theme-light .daily-memo-wrapper:last-child { + border-left: none; + padding-bottom: 0; +} +.theme-light .daily-memo-wrapper > .time-wrapper { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: relative; + left: -24px; + margin-top: -2px; + flex-shrink: 0; + width: 48px; + height: 28px; + border-radius: 6px; + background-color: #eaeaea; + color: #52504b; + border: 2px solid white; +} +.theme-light .daily-memo-wrapper > .time-wrapper > .normal-text { + margin: 0 auto; + font-size: 11px; line-height: 24px; - min-height: 24px; - white-space: pre-wrap; } -.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text > p > a { - width: 400px; +.theme-light .daily-memo-wrapper > .memo-content-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 100%; + margin-left: -12px; + padding: 0; + font-size: 16px; + margin-top: -3px; +} +.theme-light .daily-memo-wrapper > .memo-content-container > .memo-content-text { + margin-top: -14px; +} +.theme-light .daily-memo-wrapper > .memo-content-container > .memo-content-text p > a { + width: 20em; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } -.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .tag-span { - display: inline-block; - width: auto; +.theme-light .daily-memo-wrapper > .memo-content-container > .memo-content-text .tag-span { + cursor: unset; padding-left: 4px; padding-right: 6px; margin-left: 4px; - line-height: 24px; - font-size: 13px; - border: none; - border-radius: 4px; +} +.theme-light .daily-memo-wrapper > .memo-content-container > .memo-content-text .tag-span:hover { color: #5783f7; background-color: #eef3fe; - cursor: pointer; - vertical-align: bottom; } -.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .tag-span:hover { - background-color: #5783f7; - color: white; +.theme-light .daily-memo-wrapper > .memo-content-container > .images-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 100%; } -.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .memo-link-text { - display: inline-block; - color: #5783f7; - font-weight: bold; - border-bottom: none; - text-decoration: none; - cursor: pointer; -} -.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .memo-link-text:hover { - opacity: 0.8; -} -.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .counter-block, -.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .todo-block { - display: inline-block; - text-align: center; - width: 1.4rem; - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; -} -.theme-light div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text pre { +.theme-light .daily-memo-wrapper > .memo-content-container > .images-container > img { width: 100%; - margin: 4px 0; - padding: 8px 12px; + height: auto; border-radius: 4px; - font-size: 15px; - line-height: 1.5; - background-color: #f6f5f4; - white-space: pre-wrap; + margin-bottom: 8px; + margin-top: 16px; } -.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text { +.theme-light .daily-memo-wrapper > .memo-content-container > .images-container > img:last-child { + margin-bottom: 0; +} +.theme-dark .daily-memo-wrapper { display: flex; - flex-direction: column; + flex-direction: row; justify-content: flex-start; align-items: flex-start; - width: 100%; - word-wrap: break-word; - word-break: break-word; - white-space: pre-wrap; + position: relative; + width: calc(100% - 24px); + margin-left: 24px; + padding: 0; + padding-bottom: 24px; + border: none; + border-left: 2px solid #808080; } -.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text > p { - display: inline-block; - width: 100%; - height: auto; - margin-bottom: 4px; +.theme-dark .daily-memo-wrapper:last-child { + border-left: none; + padding-bottom: 0; +} +.theme-dark .daily-memo-wrapper > .time-wrapper { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: relative; + left: -24px; margin-top: -2px; - font-size: 15px; - line-height: 24px; - min-height: 24px; - white-space: pre-wrap; + flex-shrink: 0; + width: 48px; + height: 28px; + border-radius: 6px; + background-color: #727171; + color: #c7c4bb; + border: 2px solid #727171; } -.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text .tag-span { - display: inline-block; - width: auto; - padding-left: 4px; - padding-right: 6px; - margin-left: 4px; +.theme-dark .daily-memo-wrapper > .time-wrapper > .normal-text { + margin: 0 auto; + font-size: 11px; line-height: 24px; - font-size: 13px; - border: none; - border-radius: 4px; - color: #5783f7; - background-color: #eef3fe; - cursor: pointer; - vertical-align: bottom; } -.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text .tag-span:hover { - background-color: #5783f7; - color: white; -} -.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text .memo-link-text { - display: inline-block; - color: #5783f7; - font-weight: bold; - border-bottom: none; - text-decoration: none; - cursor: pointer; +.theme-dark .daily-memo-wrapper > .memo-content-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 100%; + margin-left: -12px; + padding: 0; + font-size: 16px; + margin-top: -3px; } -.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text .memo-link-text:hover { - opacity: 0.8; +.theme-dark .daily-memo-wrapper > .memo-content-container > .memo-content-text { + margin-top: -14px; + text-overflow: clip; + -webkit-line-clamp: 2; + /*限制在一个块元素显示的文本的行数*/ + -webkit-box-orient: vertical; + overflow: hidden; + width: 80%; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + -webkit-text-overflow: ellipsis; + -moz-text-overflow: ellipsis; + white-space: nowrap; + /*规定段落中的文本不进行换行*/ } -.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text .counter-block, -.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text .todo-block { - display: inline-block; - text-align: center; - width: 1.4rem; - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-dark .daily-memo-wrapper > .memo-content-container > .memo-content-text p > a.link { + width: 20em; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + overflow: hidden; } -.theme-light [data-type='memos_view'] .memolist-wrapper .memo-content-text pre { - width: 100%; - margin: 4px 0; - padding: 8px 12px; - border-radius: 4px; - font-size: 15px; - line-height: 1.5; - background-color: #f6f5f4; - white-space: pre-wrap; +.theme-dark .daily-memo-wrapper > .memo-content-container > .memo-content-text .tag-span { + cursor: unset; + padding-left: 4px; + padding-right: 6px; + margin-left: 4px; } -@media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .memo-content-text > p { - font-size: 15px; - line-height: 26px; - min-height: 26px; - white-space: pre-wrap; - } - .theme-dark div[data-type='memos_view'] .memo-content-text .tag-span { - line-height: 26px; - font-size: 14px; - } +.theme-dark .daily-memo-wrapper > .memo-content-container > .memo-content-text .tag-span:hover { + color: #bbbec7; + background-color: #616161; } -.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text { +.theme-dark .daily-memo-wrapper > .memo-content-container > .images-container { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; width: 100%; - word-wrap: break-word; - word-break: break-word; - white-space: pre-wrap; - color: #d2d1cd; } -.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text > p { - display: inline-block; +.theme-dark .daily-memo-wrapper > .memo-content-container > .images-container > img { width: 100%; height: auto; - margin-bottom: 4px; - font-size: 15px; - line-height: 24px; - min-height: 24px; - white-space: pre-wrap; - color: #d2d1cd; -} -.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .tag-span { - display: inline-block; - width: auto; - padding-left: 4px; - padding-right: 6px; - margin-left: 4px; - line-height: 24px; - font-size: 13px; - border: none; border-radius: 4px; - color: #bbbec7; - background-color: #616161; - cursor: pointer; - vertical-align: bottom; + margin-bottom: 8px; + margin-top: 16px; } -.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .tag-span:hover { - background-color: #bbbec7; - color: #000000; +.theme-dark .daily-memo-wrapper > .memo-content-container > .images-container > img:last-child { + margin-bottom: 0; } -.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .memo-link-text { - display: inline-block; - color: #bbbec7; - font-weight: bold; - border-bottom: none; - text-decoration: none; +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.hide-scroll-bar { + scrollbar-width: none; +} +.hide-scroll-bar::-webkit-scrollbar { + width: 0; + height: 0; cursor: pointer; } -.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .memo-link-text:hover { - opacity: 0.8; +.hide-scroll-bar::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .counter-block, -.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text .todo-block { - display: inline-block; - text-align: center; - width: 1.4rem; - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-dark div[data-type='memos_view'] .daily-memo-wrapper .memo-content-text pre { - width: 100%; - margin: 4px 0; - padding: 8px 12px; - border-radius: 4px; - font-size: 15px; - line-height: 1.5; - background-color: #0c0c0c; - white-space: pre-wrap; +.hide-scroll-bar::-webkit-scrollbar { + display: none; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text { +.theme-light .date-picker-wrapper { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; + padding: 16px; +} +.theme-light .date-picker-wrapper > .date-picker-header { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; width: 100%; - word-wrap: break-word; - word-break: break-word; - white-space: pre-wrap; - color: #d2d1cd; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text > p { - display: inline-block; +.theme-light .date-picker-wrapper > .date-picker-header > .btn-text { + width: 24px; + height: 24px; + border-radius: 4px; + cursor: pointer; + user-select: none; +} +.theme-light .date-picker-wrapper > .date-picker-header > .btn-text > .icon-img { width: 100%; height: auto; - margin-bottom: 4px; - margin-top: -2px; - font-size: 15px; - line-height: 24px; - min-height: 24px; - white-space: pre-wrap; - color: #d2d1cd; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text .tag-span { - display: inline-block; - width: auto; - padding-left: 4px; - padding-right: 6px; - margin-left: 4px; +.theme-light .date-picker-wrapper > .date-picker-header > .btn-text:hover { + background-color: #f8f8f8; +} +.theme-light .date-picker-wrapper > .date-picker-header > .normal-text { + margin: 0 4px; line-height: 24px; - font-size: 13px; - border: none; - border-radius: 4px; - color: #bbbec7; - background-color: #616161; - cursor: pointer; - vertical-align: bottom; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text .tag-span:hover { - background-color: #bbbec7; - color: white; +.theme-light .date-picker-wrapper > .date-picker-day-container { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + width: 280px; + flex-wrap: wrap; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text .memo-link-text { - display: inline-block; - color: #bbbec7; - font-weight: bold; - border-bottom: none; - text-decoration: none; - cursor: pointer; +.theme-light .date-picker-wrapper > .date-picker-day-container > .date-picker-day-header { + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: center; + width: 100%; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text .memo-link-text:hover { - opacity: 0.8; +.theme-light .date-picker-wrapper > .date-picker-day-container > .date-picker-day-header > .day-item { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 36px; + height: 36px; + user-select: none; + color: gray; + font-size: 13px; + margin: 2px 0; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text .counter-block, -.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text .todo-block { - display: inline-block; - text-align: center; - width: 1.4rem; - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-light .date-picker-wrapper > .date-picker-day-container > .day-item { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 36px; + height: 36px; + border-radius: 50%; + font-size: 14px; + user-select: none; + cursor: pointer; + margin: 2px; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text pre { - width: 100%; - margin: 4px 0; - padding: 8px 12px; - border-radius: 4px; - font-size: 15px; - line-height: 1.5; - background-color: #f6f5f4; - white-space: pre-wrap; +.theme-light .date-picker-wrapper > .date-picker-day-container > .day-item:hover { + background-color: #f8f8f8; } -@media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text { - color: #d2d1cd; - } - .theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text > p { - font-size: 15px; - line-height: 26px; - min-height: 26px; - white-space: pre-wrap; - color: #d2d1cd; - } - .theme-dark div[data-type='memos_view'] .memolist-wrapper .memo-content-text .tag-span { - line-height: 26px; - font-size: 14px; - } +.theme-light .date-picker-wrapper > .date-picker-day-container > .day-item.current { + background-color: #eef3fe; + font-size: 16px; + color: #5783f7; + font-weight: bold; } -.theme-light div[data-type='memos_view'] .memo-wrapper { +.theme-light .date-picker-wrapper > .date-picker-day-container > .day-item.null { + background-color: unset; + cursor: unset; +} +.theme-light .editor-date-picker { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - width: 100%; - padding: 12px 18px; - background-color: #ffffff; - border-radius: 8px; - border: 1px solid transparent; -} -.theme-light div[data-type='memos_view'] .memo-wrapper:hover { - border-color: #e4e4e4; + padding: unset; + background-color: white; + border: 1px dashed #2f3437; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper { +.theme-light .editor-date-picker > .date-picker-header { display: flex; flex-direction: row; - justify-content: space-between; + justify-content: center; align-items: center; width: 100%; +} +.theme-light .editor-date-picker > .date-picker-header > .btn-text { + width: 24px; height: 24px; - margin-bottom: 14px; + border-radius: 4px; + cursor: pointer; + user-select: none; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-left-wrapper { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; +.theme-light .editor-date-picker > .date-picker-header > .btn-text > .icon-img { + width: 100%; + height: auto; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-left-wrapper > .time-text { - font-size: 12px; +.theme-light .editor-date-picker > .date-picker-header > .btn-text:hover { + background-color: #f8f8f8; +} +.theme-light .editor-date-picker > .date-picker-header > .normal-text { + margin: 0 4px; line-height: 24px; - color: #a8a8a8; - flex-shrink: 0; - cursor: pointer; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-left-wrapper > .memo-type-img { - width: 11%; - height: 20px; - margin-left: 3px; - filter: opacity(0.5) invert(80%); +.theme-light .editor-date-picker > .date-picker-day-container { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + width: 280px; + flex-wrap: wrap; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container { +.theme-light .editor-date-picker > .date-picker-day-container > .date-picker-day-header { display: flex; flex-direction: row; - justify-content: flex-end; + justify-content: space-around; align-items: center; - position: relative; - flex-shrink: 0; + width: 100%; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper { +.theme-light .editor-date-picker > .date-picker-day-container > .date-picker-day-header > .day-item { display: flex; flex-direction: column; - justify-content: flex-start; + justify-content: center; align-items: center; - position: absolute; - flex-wrap: nowrap; - top: calc(100% - 14px); - right: -16px; - width: auto; - height: auto; - padding: 12px; - z-index: 1; - display: none; + width: 36px; + height: 36px; + user-select: none; + color: gray; + font-size: 13px; + margin: 2px 0; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper:hover { +.theme-light .editor-date-picker > .date-picker-day-container > .day-item { display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 36px; + height: 36px; + border-radius: 50%; + font-size: 14px; + user-select: none; + cursor: pointer; + margin: 2px; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container { - width: 112px; - height: auto; - line-height: 18px; - padding: 4px; - white-space: nowrap; - border-radius: 8px; - background-color: white; - box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); - z-index: 1; +.theme-light .editor-date-picker > .date-picker-day-container > .day-item:hover { + background-color: #f8f8f8; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn { - width: 100%; - padding: 8px 0; - padding-left: 24px; - border-radius: 4px; - height: unset; - line-height: unset; - justify-content: flex-start; +.theme-light .editor-date-picker > .date-picker-day-container > .day-item.current { + background-color: #eef3fe; + font-size: 16px; + color: #5783f7; + font-weight: bold; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn.delete-btn { - color: #d28653; +.theme-light .editor-date-picker > .date-picker-day-container > .day-item.null { + background-color: unset; + cursor: unset; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn.delete-btn.final-confirm { - font-weight: bold; +.theme-dark .date-picker-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + padding: 16px; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container .btn { +.theme-dark .date-picker-wrapper > .date-picker-header { display: flex; flex-direction: row; justify-content: center; align-items: center; width: 100%; - height: 28px; - font-size: 13px; - border-radius: 4px; -} -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container .btn:hover { - background-color: #f8f8f8; -} -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn { - width: 28px; - cursor: unset; - margin-right: -6px; - opacity: 0.8; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn > .icon-img { - width: 16px; - height: 16px; +.theme-dark .date-picker-wrapper > .date-picker-header > .btn-text { + width: 24px; + height: 24px; + border-radius: 4px; + cursor: pointer; + user-select: none; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn:hover { - background-color: unset; +.theme-dark .date-picker-wrapper > .date-picker-header > .btn-text > .icon-img { + width: 100%; + height: auto; + fill: #cdcdcd; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn:hover + .more-action-btns-wrapper { - display: flex; +.theme-dark .date-picker-wrapper > .date-picker-header > .btn-text:hover { + background-color: #808080; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .memo-content-text { - width: 100%; +.theme-dark .date-picker-wrapper > .date-picker-header > .normal-text { + margin: 0 4px; + line-height: 24px; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper { +.theme-dark .date-picker-wrapper > .date-picker-day-container { display: flex; flex-direction: row; justify-content: flex-start; align-items: flex-start; - margin-top: 8px; - width: 100%; - overflow-x: auto; - overflow-y: hidden; - padding-bottom: 4px; - scrollbar-width: none; -} -.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper::-webkit-scrollbar { - width: 0; - height: 2px; - cursor: pointer; + width: 280px; + flex-wrap: wrap; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper::-webkit-scrollbar-thumb { - width: 0; - height: 2px; - border-radius: 8px; - background-color: #d5d5d5; +.theme-dark .date-picker-wrapper > .date-picker-day-container > .date-picker-day-header { + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: center; + width: 100%; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper::-webkit-scrollbar-thumb:hover { - background-color: #ccc; -} -.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img { - margin-right: 8px; - width: auto; - height: 128px; - flex-shrink: 0; - flex-grow: 0; - overflow-y: hidden; - scrollbar-width: none; +.theme-dark .date-picker-wrapper > .date-picker-day-container > .date-picker-day-header > .day-item { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 36px; + height: 36px; + user-select: none; + color: #b8b8b8; + font-size: 13px; + margin: 2px 0; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar { - width: 0; - height: 0; +.theme-dark .date-picker-wrapper > .date-picker-day-container > .day-item { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 36px; + height: 36px; + border-radius: 50%; + font-size: 14px; + user-select: none; cursor: pointer; + margin: 2px; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; -} -.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar-thumb:hover { - background-color: #ccc; -} -.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar { - display: none; -} -.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img:hover { - border-color: lightgray; -} -.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img:last-child { - margin-right: 0; +.theme-dark .date-picker-wrapper > .date-picker-day-container > .day-item:hover { + background-color: #808080; } -.theme-light div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img > img { - width: auto; - max-height: 128px; - border-radius: 8px; +.theme-dark .date-picker-wrapper > .date-picker-day-container > .day-item.current { + background-color: #616161; + font-size: 16px; + color: #5783f7; + font-weight: bold; } -@media only screen and (max-width: 875px) { - .theme-light div[data-type='memos_view'] .memo-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container { - line-height: 0px; - } +.theme-dark .date-picker-wrapper > .date-picker-day-container > .day-item.null { + background-color: unset; + cursor: unset; } -.theme-dark div[data-type='memos_view'] .memo-wrapper { +.theme-dark .editor-date-picker { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - width: 100%; - padding: 12px 18px; - background-color: #303030; - border-radius: 8px; - border: 1px solid transparent; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper:hover { - border-color: #353535; + padding: unset; + background-color: #2f3437; + border: 1px dashed #cacdcf; } -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper { +.theme-dark .editor-date-picker > .date-picker-header { display: flex; flex-direction: row; - justify-content: space-between; + justify-content: center; align-items: center; width: 100%; +} +.theme-dark .editor-date-picker > .date-picker-header > .btn-text { + width: 24px; height: 24px; - margin-bottom: 14px; + border-radius: 4px; + cursor: pointer; + user-select: none; } -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-left-wrapper { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; +.theme-dark .editor-date-picker > .date-picker-header > .btn-text > .icon-img { + width: 100%; + height: auto; + fill: #cdcdcd; } -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-left-wrapper > .time-text { - font-size: 12px; - line-height: 24px; - color: #a8a8a8; - flex-shrink: 0; - cursor: pointer; +.theme-dark .editor-date-picker > .date-picker-header > .btn-text:hover { + background-color: #808080; } -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .memo-top-left-wrapper > .memo-type-img { - width: 11%; - height: 20px; - margin-left: 3px; - filter: invert(0.8); +.theme-dark .editor-date-picker > .date-picker-header > .normal-text { + margin: 0 4px; + line-height: 24px; } -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container { +.theme-dark .editor-date-picker > .date-picker-day-container { display: flex; flex-direction: row; - justify-content: flex-end; - align-items: center; - position: relative; - flex-shrink: 0; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper { - display: flex; - flex-direction: column; justify-content: flex-start; - align-items: center; - position: absolute; - flex-wrap: nowrap; - top: calc(100% - 14px); - right: -16px; - width: auto; - height: auto; - padding: 12px; - z-index: 1; - display: none; + align-items: flex-start; + width: 280px; + flex-wrap: wrap; } -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper:hover { +.theme-dark .editor-date-picker > .date-picker-day-container > .date-picker-day-header { display: flex; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container { - width: 112px; - height: auto; - line-height: 18px; - padding: 4px; - white-space: nowrap; - border-radius: 8px; - background-color: #181818; - z-index: 1; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn { + flex-direction: row; + justify-content: space-around; + align-items: center; width: 100%; - padding: 8px 0; - padding-left: 24px; - border-radius: 4px; - height: unset; - line-height: unset; - justify-content: flex-start; - color: #d2d1cd; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn.delete-btn { - color: #940b01; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn.delete-btn.final-confirm { - font-weight: bold; } -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container .btn { +.theme-dark .editor-date-picker > .date-picker-day-container > .date-picker-day-header > .day-item { display: flex; - flex-direction: row; + flex-direction: column; justify-content: center; align-items: center; - width: 100%; - height: 28px; + width: 36px; + height: 36px; + user-select: none; + color: #b8b8b8; font-size: 13px; - border-radius: 4px; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container .btn:hover { - background-color: #808080; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn { - width: 28px; - cursor: unset; - margin-right: -6px; - opacity: 0.8; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn > .icon-img { - width: 16px; - height: 16px; - filter: invert(0.8); -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn:hover { - background-color: unset; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn:hover + .more-action-btns-wrapper { - display: flex; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .memo-content-text { - width: 100%; + margin: 2px 0; } -.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper { +.theme-dark .editor-date-picker > .date-picker-day-container > .day-item { display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: flex-start; - margin-top: 8px; - width: 100%; - overflow-x: auto; - overflow-y: hidden; - padding-bottom: 4px; - scrollbar-width: none; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper::-webkit-scrollbar { - width: 0; - height: 2px; - cursor: pointer; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper::-webkit-scrollbar-thumb { - width: 0; - height: 2px; - border-radius: 8px; - background-color: #d5d5d5; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper::-webkit-scrollbar-thumb:hover { - background-color: #ccc; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img { - margin-right: 8px; - width: auto; - height: 128px; - flex-shrink: 0; - flex-grow: 0; - overflow-y: hidden; - scrollbar-width: none; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar { - width: 0; - height: 0; + flex-direction: column; + justify-content: center; + align-items: center; + width: 36px; + height: 36px; + border-radius: 50%; + font-size: 14px; + user-select: none; cursor: pointer; + margin: 2px; } -.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar-thumb:hover { - background-color: #ccc; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar { - display: none; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img:hover { - border-color: #444444; -} -.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img:last-child { - margin-right: 0; +.theme-dark .editor-date-picker > .date-picker-day-container > .day-item:hover { + background-color: #808080; } -.theme-dark div[data-type='memos_view'] .memo-wrapper > .images-wrapper > .memo-img > img { - width: auto; - max-height: 128px; - border-radius: 8px; +.theme-dark .editor-date-picker > .date-picker-day-container > .day-item.current { + background-color: #616161; + font-size: 16px; + color: #5783f7; + font-weight: bold; } -@media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .memo-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container { - line-height: 0px; - } +.theme-dark .editor-date-picker > .date-picker-day-container > .day-item.null { + background-color: unset; + cursor: unset; } .mono-font-family { font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; @@ -4022,964 +3899,883 @@ div[data-type='memos_view'] .image-container > img { .hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-light div[data-type='memos_view'] .memolist-wrapper { +.theme-light .daily-memo-diary-dialog > .dialog-container { + width: 440px; + max-width: 100%; + padding: 0; +} +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container { display: flex; flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - flex-grow: 1; + justify-content: center; + align-items: center; + position: relative; width: 100%; - overflow-y: scroll; - gap: 8px; - scrollbar-width: none; -} -.theme-light div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; -} -.theme-light div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; -} -.theme-light div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar-thumb:hover { - background-color: #ccc; + padding: 24px; + margin-bottom: 0; + padding-bottom: 0; } -.theme-light div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar { - display: none; +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; } -.theme-light div[data-type='memos_view'] .memolist-wrapper > .status-text-container { +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container { display: flex; - flex-direction: column; + flex-direction: row; justify-content: flex-start; align-items: center; - width: 100%; - margin-top: 16px; - margin-bottom: 16px; } -.theme-light div[data-type='memos_view'] .memolist-wrapper > .status-text-container.completed { - margin-bottom: 64px; +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text { + width: 24px; + height: 24px; + margin-right: 8px; + border-radius: 4px; + cursor: pointer; + user-select: none; } -.theme-light div[data-type='memos_view'] .memolist-wrapper > .status-text-container.invisible { - visibility: hidden; +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text:last-child { + margin-right: 0; } -.theme-light div[data-type='memos_view'] .memolist-wrapper > .status-text-container > .status-text { - font-size: 13px; - color: gray; +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text > .icon-img { + width: 100%; + height: auto; } -.theme-light div[data-type='memos_view'] .memolist-wrapper.completed { - padding-bottom: 80px; +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text:hover { + background-color: lightgray; } -@media only screen and (max-width: 875px) { - div[data-type='memos_view'] .memolist-wrapper { - padding: 0 12px; - } +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text.share-btn { + padding: 2px; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper { +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - flex-grow: 1; - width: 100%; - overflow-y: scroll; - gap: 8px; - scrollbar-width: none; -} -.theme-dark div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; + width: 440px; + max-width: 100%; + height: auto; + padding: 24px 24px; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin: auto; + padding-bottom: 24px; + z-index: 1; + user-select: none; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .year-text { + margin: auto; + font-weight: bold; + color: gray; + text-align: center; + line-height: 24px; + margin-bottom: 12px; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar { - display: none; +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin: auto; + width: 96px; + height: 96px; + border-radius: 32px; + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); + border: 1px solid rgba(0, 0, 0, 0.1); + text-align: center; + z-index: 1; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper > .status-text-container { +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .month-text, +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .day-text { display: flex; flex-direction: column; - justify-content: flex-start; + justify-content: center; align-items: center; width: 100%; - margin-top: 16px; - margin-bottom: 16px; -} -.theme-dark div[data-type='memos_view'] .memolist-wrapper > .status-text-container.completed { - margin-bottom: 64px; + height: 24px; + font-size: 14px; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper > .status-text-container.invisible { - visibility: hidden; +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .month-text { + background-color: #1337a3; + color: white; + border-top-left-radius: 32px; + border-top-right-radius: 32px; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper > .status-text-container > .status-text { - font-size: 13px; - color: #ffffff; +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .date-text { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + padding-top: 4px; + height: 48px; + font-size: 44px; + font-weight: bold; } -.theme-dark div[data-type='memos_view'] .memolist-wrapper.completed { - padding-bottom: 80px; +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .day-text { + font-size: 12px; } -@media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .memolist-wrapper { - padding: 0 12px; - } +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-picker { + margin: 0 auto; + border: 1px solid lightgray; + border-radius: 8px; + margin-bottom: 24px; } -.mono-font-family { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .tip-container { + margin: auto; + padding: 16px 0; } -.hide-scroll-bar { - scrollbar-width: none; +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .tip-container > .tip-text { + font-style: italic; } -.hide-scroll-bar::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; +.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .dailymemos-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + margin-top: 8px; + width: 100%; } -.hide-scroll-bar::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; +@media only screen and (max-width: 875px) { + .theme-light .dialog-wrapper.daily-memo-diary-dialog { + padding: 0; + scrollbar-width: none; + } + .theme-light .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; + } + .theme-light .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; + } + .theme-light .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar-thumb:hover { + background-color: #ccc; + } + .theme-light .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar { + display: none; + } + .theme-light .dialog-wrapper.daily-memo-diary-dialog > .dialog-container { + width: 100%; + height: 100%; + border-radius: 0; + overflow-y: auto; + overflow-x: hidden; + padding-bottom: 16px; + } + .theme-light .dialog-wrapper.daily-memo-diary-dialog > .dialog-container > .dialog-header-container { + padding-top: 32px; + } + .theme-light .dialog-wrapper.daily-memo-diary-dialog > .dialog-container::-webkit-scrollbar { + display: none; + } } -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-dark .daily-memo-diary-dialog > .dialog-container { + width: 440px; + max-width: 100%; + padding: 0; } -.hide-scroll-bar::-webkit-scrollbar { - display: none; +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: relative; + width: 100%; + padding: 24px; + margin-bottom: 0; + padding-bottom: 0; } -div[data-type='memos_view'] .section-header-container, -div[data-type='memos_view'] .memos-header-container { +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper { display: flex; flex-direction: row; justify-content: space-between; align-items: center; width: 100%; - height: 40px; - flex-wrap: nowrap; - margin-top: 16px; - flex-shrink: 0; } -div[data-type='memos_view'] .section-header-container > .title-text, -div[data-type='memos_view'] .memos-header-container > .title-text { +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container { display: flex; flex-direction: row; justify-content: flex-start; align-items: center; - font-weight: bold; - font-size: 18px; - line-height: 40px; - color: #37352f; - margin-right: 8px; - overflow: hidden; - text-overflow: ellipsis; - flex-shrink: 0; - cursor: pointer; } -div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, -div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text { width: 24px; height: 24px; - margin-right: 4px; - flex-shrink: 0; - background-color: unset; + margin-right: 8px; + border-radius: 4px; + cursor: pointer; + user-select: none; } -div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, -div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { - width: 18px; - height: 18px; +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text:last-child { + margin-right: 0; } -div[data-type='memos_view'] .section-header-container > .btns-container, -div[data-type='memos_view'] .memos-header-container > .btns-container { - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: center; +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text > .icon-img { + width: 100%; + height: auto; + fill: #cdcdcd; } -@media only screen and (max-width: 875px) { - div[data-type='memos_view'] .section-header-container, - div[data-type='memos_view'] .memos-header-container { - height: auto; - margin-top: 4px; - margin-bottom: 0; - padding: 0 12px; - padding-bottom: 8px; - } - div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, - div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 60px; - height: 24px; - margin-right: -8px; - margin-left: -20px; - flex-shrink: 0; - background-color: unset; - } - div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, - div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { - width: 18px; - height: 18px; - } +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text:hover { + background-color: #383838; } -.theme-dark div[data-type='memos_view'] .section-header-container, -.theme-dark div[data-type='memos_view'] .memos-header-container { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - width: 100%; - height: 40px; - flex-wrap: nowrap; - margin-top: 16px; - flex-shrink: 0; +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text.share-btn { + padding: 2px; } -.theme-dark div[data-type='memos_view'] .section-header-container > .title-text, -.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text { +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container { display: flex; - flex-direction: row; + flex-direction: column; justify-content: flex-start; - align-items: center; - font-weight: bold; - font-size: 18px; - line-height: 40px; - color: #d2d1cd; - margin-right: 8px; - overflow: hidden; - text-overflow: ellipsis; - flex-shrink: 0; - cursor: pointer; + align-items: flex-start; + width: 440px; + max-width: 100%; + height: auto; + padding: 24px 24px; } -.theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, -.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container { display: flex; - flex-direction: row; + flex-direction: column; justify-content: center; align-items: center; - width: 24px; - height: 24px; - margin-right: 4px; - flex-shrink: 0; - background-color: unset; + margin: auto; + padding-bottom: 24px; + z-index: 1; + user-select: none; } -.theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, -.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { - width: 18px; - height: 18px; - filter: invert(0.8); +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .year-text { + margin: auto; + font-weight: bold; + color: #a1a1a1; + text-align: center; + line-height: 24px; + margin-bottom: 12px; } -.theme-dark div[data-type='memos_view'] .section-header-container > .btns-container, -.theme-dark div[data-type='memos_view'] .memos-header-container > .btns-container { +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container { display: flex; - flex-direction: row; - justify-content: flex-end; + flex-direction: column; + justify-content: center; align-items: center; + margin: auto; + width: 96px; + height: 96px; + border-radius: 32px; + box-shadow: 0 0 8px 0 rgba(255, 255, 255, 0.2); + border: 1px solid rgba(255, 255, 255, 0.1); + background-color: #d2d1cd; + color: black; + text-align: center; + z-index: 1; } -@media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .section-header-container, - .theme-dark div[data-type='memos_view'] .memos-header-container { - height: auto; - margin-top: 4px; - margin-bottom: 0; - padding: 0 12px; - padding-bottom: 8px; - } - .theme-dark div[data-type='memos_view'] .section-header-container > .title-text, - .theme-dark div[data-type='memos_view'] .memos-header-container > .title-text { - color: #d2d1cd; - } - .theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, - .theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 60px; - height: 24px; - margin-right: -8px; - margin-left: -20px; - flex-shrink: 0; - background-color: unset; - } - .theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, - .theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { - width: 18px; - height: 18px; - filter: invert(0.8); - } -} -.theme-light div[data-type='memos_view'] .memo-trash-wrapper { +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .month-text, +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .day-text { display: flex; flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - height: 100%; - flex-grow: 1; - overflow-y: scroll; - scrollbar-width: none; -} -.theme-light div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; -} -.theme-light div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; -} -.theme-light div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar-thumb:hover { - background-color: #ccc; -} -.theme-light div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar { - display: none; -} -.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .section-header-container { + justify-content: center; + align-items: center; width: 100%; - height: 40px; - margin-bottom: 0; + height: 24px; + font-size: 14px; } -.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .section-header-container > .title-text { - font-weight: bold; - font-size: 15px; - color: #37352f; +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .month-text { + background-color: #2c395a; + color: white; + border-top-left-radius: 32px; + border-top-right-radius: 32px; + margin-top: -1px; } -.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .tip-text-container { - width: 100%; - height: 128px; +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .date-text { display: flex; flex-direction: column; justify-content: center; align-items: center; -} -.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - flex-grow: 1; width: 100%; - overflow-y: scroll; - padding-bottom: 64px; - scrollbar-width: none; + padding-top: 4px; + height: 48px; + font-size: 44px; + font-weight: bold; } -.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .day-text { + font-size: 12px; } -.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar-thumb { - width: 0; - height: 0; +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-picker { + margin: 0 auto; + border: 1px solid #333333; border-radius: 8px; - background-color: #d5d5d5; + margin-bottom: 24px; } -.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .tip-container { + margin: auto; + padding: 16px 0; } -.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar { - display: none; +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .tip-container > .tip-text { + font-style: italic; } -.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container > .memo-wrapper > .memo-content-text { - line-height: 16px; +.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .dailymemos-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + margin-top: 8px; + width: 100%; } @media only screen and (max-width: 875px) { - .theme-light div[data-type='memos_view'] .deleted-memos-container { - padding: 0 12px; - } - .theme-light div[data-type='memos_view'] .memo-trash-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - height: 100%; - flex-grow: 1; - overflow-y: scroll; + .theme-dark .dialog-wrapper.daily-memo-diary-dialog { + padding: 0; scrollbar-width: none; } - .theme-light div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar { + .theme-dark .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } - .theme-light div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar-thumb { + .theme-dark .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } - .theme-light div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar-thumb:hover { + .theme-dark .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar-thumb:hover { background-color: #ccc; } - .theme-light div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar { + .theme-dark .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar { display: none; } - .theme-light div[data-type='memos_view'] .memo-trash-wrapper > .section-header-container { + .theme-dark .dialog-wrapper.daily-memo-diary-dialog > .dialog-container { width: 100%; - height: 58px; - margin-bottom: 0; + height: 100%; + border-radius: 0; + overflow-y: auto; + overflow-x: hidden; + padding-bottom: 16px; } - .theme-light div[data-type='memos_view'] .memo-trash-wrapper > .section-header-container > .title-text { - font-weight: bold; - font-size: 15px; - color: #37352f; + .theme-dark .dialog-wrapper.daily-memo-diary-dialog > .dialog-container > .dialog-header-container { + padding-top: 32px; + } + .theme-dark .dialog-wrapper.daily-memo-diary-dialog > .dialog-container::-webkit-scrollbar { + display: none; } } -.theme-dark div[data-type='memos_view'] .memo-trash-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - height: 100%; - flex-grow: 1; - overflow-y: scroll; +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.hide-scroll-bar { scrollbar-width: none; } -.theme-dark div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar { +.hide-scroll-bar::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.theme-dark div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar-thumb { +.hide-scroll-bar::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.theme-dark div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar-thumb:hover { +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.theme-dark div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar { +.hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .section-header-container { +.theme-light div[data-type='memos_view'] .user-banner-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; width: 100%; - height: 40px; - margin-bottom: 0; - color: #d2d1cd; + height: 160px; } -.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .section-header-container > .title-text { +.theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; + padding: 0 24px; + flex-wrap: nowrap; + margin-bottom: 4px; +} +.theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .username-text { + max-width: calc(100% - 32px); font-weight: bold; font-size: 18px; - color: #d2d1cd; + line-height: 36px; + color: #37352f; + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer; + margin-right: auto; + flex-shrink: 0; } -.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .tip-text-container { - width: 100%; - height: 128px; +.theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn { + flex-shrink: 0; + user-select: none; + border: none; + background-color: unset; +} +.theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn.menu-popup-btn { display: flex; flex-direction: column; justify-content: center; align-items: center; + width: 36px; + height: 40px; + margin-right: -8px; + cursor: pointer; } -.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container { +.theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn.menu-popup-btn > .icon-img { + width: 20px; + height: auto; +} +.theme-light div[data-type='memos_view'] .user-banner-container > .status-text-container { display: flex; - flex-direction: column; - justify-content: flex-start; + flex-direction: row; + justify-content: space-between; align-items: flex-start; - flex-grow: 1; - font-size: 15px; + padding: 0 24px; width: 100%; - overflow-y: scroll; - padding-bottom: 64px; - color: #d2d1cd; - scrollbar-width: none; -} -.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; -} -.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; + user-select: none; } -.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-light div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; } -.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar { - display: none; +.theme-light div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .amount-text { + font-weight: bold; + font-size: 28px; + line-height: 1.8; + color: #37352f; + opacity: 0.8; } -.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container > .memo-wrapper > .memo-content-text { - line-height: 16px; +.theme-light div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .type-text { + color: gray; + font-size: 12px; + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } @media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .deleted-memos-container { - padding: 0 12px; - } - .theme-dark div[data-type='memos_view'] .memo-trash-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - height: 100%; - flex-grow: 1; - overflow-y: scroll; - scrollbar-width: none; + .theme-light div[data-type='memos_view'] .user-banner-container { + height: 170px; + z-index: 1; + padding-top: 16px !important; } - .theme-dark div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; + .theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container { + padding: 0 16px; } - .theme-dark div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; + .theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn { + width: 60px; } - .theme-dark div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar-thumb:hover { - background-color: #ccc; + .theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .username-text { + font-size: 22px; } - .theme-dark div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar { - display: none; + .theme-light div[data-type='memos_view'] .user-banner-container > .status-text-container { + padding: 0 16px; } - .theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .section-header-container { - width: 100%; - height: 58px; - margin-bottom: 0; + .theme-light div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .amount-text { + font-size: 32px; } - .theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .section-header-container > .title-text { - font-weight: bold; - font-size: 15px; - color: #d2d1cd; + .theme-light div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .type-text { + font-size: 14px; } } -.mono-font-family { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; -} -.hide-scroll-bar { - scrollbar-width: none; -} -.hide-scroll-bar::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; -} -.hide-scroll-bar::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; +.theme-light div[data-type='memos_view'].mobile-view .user-banner-container { + height: 170px; + z-index: 1; + padding-top: 16px !important; } -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-light div[data-type='memos_view'].mobile-view .user-banner-container > .userinfo-header-container { + padding: 0 16px; } -.hide-scroll-bar::-webkit-scrollbar { - display: none; +.theme-light div[data-type='memos_view'].mobile-view .user-banner-container > .userinfo-header-container > .action-btn { + width: 60px; } -.preferences-section-container > .demo-content-container { - padding: 16px; - border-radius: 8px; - border: 2px solid #e4e4e4; - margin: 12px 0; +.theme-light div[data-type='memos_view'].mobile-view .user-banner-container > .userinfo-header-container > .username-text { + font-size: 22px; } -.preferences-section-container > .form-label { - height: 28px; - cursor: pointer; +.theme-light div[data-type='memos_view'].mobile-view .user-banner-container > .status-text-container { + padding: 0 16px; } -.preferences-section-container > .form-label > .icon-img { - width: 16px; - height: 16px; - margin: 0 8px; +.theme-light div[data-type='memos_view'].mobile-view .user-banner-container > .status-text-container > .status-text > .amount-text { + font-size: 32px; } -.preferences-section-container > .form-label:hover { - opacity: 0.8; +.theme-light div[data-type='memos_view'].mobile-view .user-banner-container > .status-text-container > .status-text > .type-text { + font-size: 14px; } -.preferences-section-container > .btn-container { +.theme-dark div[data-type='memos_view'] .user-banner-container { display: flex; - flex-direction: row; + flex-direction: column; justify-content: flex-start; - align-items: center; + align-items: flex-start; width: 100%; - margin: 4px 0; -} -.preferences-section-container > .btn-container .btn { - height: 28px; - padding: 0 12px; - margin-right: 8px; - border: 1px solid gray; - border-radius: 8px; - cursor: pointer; -} -.preferences-section-container > .btn-container .btn:hover { - opacity: 0.8; -} -.mono-font-family { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; -} -.hide-scroll-bar { - scrollbar-width: none; -} -.hide-scroll-bar::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; -} -.hide-scroll-bar::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; -} -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { - background-color: #ccc; -} -.hide-scroll-bar::-webkit-scrollbar { - display: none; + height: 160px; } -div[data-type='memos_view'] .section-header-container, -div[data-type='memos_view'] .memos-header-container { +.theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container { display: flex; flex-direction: row; justify-content: space-between; align-items: center; width: 100%; - height: 40px; + padding: 0 24px; flex-wrap: nowrap; - margin-top: 16px; - flex-shrink: 0; + margin-bottom: 4px; } -div[data-type='memos_view'] .section-header-container > .title-text, -div[data-type='memos_view'] .memos-header-container > .title-text { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; +.theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .username-text { + max-width: calc(100% - 32px); font-weight: bold; font-size: 18px; - line-height: 40px; - color: #37352f; - margin-right: 8px; + line-height: 36px; + color: #d2d1cd; overflow: hidden; text-overflow: ellipsis; - flex-shrink: 0; cursor: pointer; + margin-right: auto; + flex-shrink: 0; } -div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, -div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 24px; - height: 24px; - margin-right: 4px; +.theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn { flex-shrink: 0; + user-select: none; + border: none; background-color: unset; } -div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, -div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { - width: 18px; - height: 18px; -} -div[data-type='memos_view'] .section-header-container > .btns-container, -div[data-type='memos_view'] .memos-header-container > .btns-container { +.theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn.menu-popup-btn { display: flex; - flex-direction: row; - justify-content: flex-end; + flex-direction: column; + justify-content: center; align-items: center; + width: 36px; + height: 40px; + margin-right: -8px; + cursor: pointer; } -@media only screen and (max-width: 875px) { - div[data-type='memos_view'] .section-header-container, - div[data-type='memos_view'] .memos-header-container { - height: auto; - margin-top: 4px; - margin-bottom: 0; - padding: 0 12px; - padding-bottom: 8px; - } - div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, - div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 60px; - height: 24px; - margin-right: -8px; - margin-left: -20px; - flex-shrink: 0; - background-color: unset; - } - div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, - div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { - width: 18px; - height: 18px; - } +.theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn.menu-popup-btn > .icon-img { + width: 20px; + height: auto; + fill: #cdcdcd; } -.theme-dark div[data-type='memos_view'] .section-header-container, -.theme-dark div[data-type='memos_view'] .memos-header-container { +.theme-dark div[data-type='memos_view'] .user-banner-container > .status-text-container { display: flex; flex-direction: row; justify-content: space-between; - align-items: center; + align-items: flex-start; + padding: 0 24px; width: 100%; - height: 40px; - flex-wrap: nowrap; - margin-top: 16px; - flex-shrink: 0; + user-select: none; } -.theme-dark div[data-type='memos_view'] .section-header-container > .title-text, -.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text { +.theme-dark div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text { display: flex; - flex-direction: row; + flex-direction: column; justify-content: flex-start; align-items: center; +} +.theme-dark div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .amount-text { font-weight: bold; - font-size: 18px; - line-height: 40px; + font-size: 28px; + line-height: 1.8; color: #d2d1cd; - margin-right: 8px; - overflow: hidden; - text-overflow: ellipsis; - flex-shrink: 0; - cursor: pointer; -} -.theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, -.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 24px; - height: 24px; - margin-right: 4px; - flex-shrink: 0; - background-color: unset; -} -.theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, -.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { - width: 18px; - height: 18px; - filter: invert(0.8); + opacity: 0.8; } -.theme-dark div[data-type='memos_view'] .section-header-container > .btns-container, -.theme-dark div[data-type='memos_view'] .memos-header-container > .btns-container { - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: center; +.theme-dark div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .type-text { + color: #ececec; + font-size: 12px; + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } @media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .section-header-container, - .theme-dark div[data-type='memos_view'] .memos-header-container { - height: auto; - margin-top: 4px; - margin-bottom: 0; - padding: 0 12px; - padding-bottom: 8px; + .theme-dark div[data-type='memos_view'] .user-banner-container { + height: 170px; + z-index: 1; + padding-top: 16px !important; } - .theme-dark div[data-type='memos_view'] .section-header-container > .title-text, - .theme-dark div[data-type='memos_view'] .memos-header-container > .title-text { - color: #d2d1cd; + .theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container { + padding: 0 16px; } - .theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, - .theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; + .theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn { width: 60px; - height: 24px; - margin-right: -8px; - margin-left: -20px; - flex-shrink: 0; - background-color: unset; } - .theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, - .theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { - width: 18px; - height: 18px; - filter: invert(0.8); + .theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .username-text { + font-size: 22px; + } + .theme-dark div[data-type='memos_view'] .user-banner-container > .status-text-container { + padding: 0 16px; + } + .theme-dark div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .amount-text { + font-size: 32px; + } + .theme-dark div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .type-text { + font-size: 14px; } } -div[data-type='memos_view'] .preference-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - height: 100%; - flex-grow: 1; - overflow-y: scroll; +.theme-dark div[data-type='memos_view'].mobile-view .user-banner-container { + height: 170px; + z-index: 1; + padding-top: 16px !important; +} +.theme-dark div[data-type='memos_view'].mobile-view .user-banner-container > .userinfo-header-container { + padding: 0 16px; +} +.theme-dark div[data-type='memos_view'].mobile-view .user-banner-container > .userinfo-header-container > .action-btn { + width: 60px; +} +.theme-dark div[data-type='memos_view'].mobile-view .user-banner-container > .userinfo-header-container > .username-text { + font-size: 22px; +} +.theme-dark div[data-type='memos_view'].mobile-view .user-banner-container > .status-text-container { + padding: 0 16px; +} +.theme-dark div[data-type='memos_view'].mobile-view .user-banner-container > .status-text-container > .status-text > .amount-text { + font-size: 32px; +} +.theme-dark div[data-type='memos_view'].mobile-view .user-banner-container > .status-text-container > .status-text > .type-text { + font-size: 14px; +} +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.hide-scroll-bar { scrollbar-width: none; } -div[data-type='memos_view'] .preference-wrapper::-webkit-scrollbar { +.hide-scroll-bar::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -div[data-type='memos_view'] .preference-wrapper::-webkit-scrollbar-thumb { +.hide-scroll-bar::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -div[data-type='memos_view'] .preference-wrapper::-webkit-scrollbar-thumb:hover { +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -div[data-type='memos_view'] .preference-wrapper::-webkit-scrollbar { +.hide-scroll-bar::-webkit-scrollbar { display: none; } -div[data-type='memos_view'] .preference-wrapper > .section-header-container { +.theme-light .selector-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + position: relative; + height: 28px; +} +.theme-light .selector-wrapper > .current-value-container { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; width: 100%; - height: 40px; - margin-bottom: 0; + height: 100%; + border: 1px solid #e4e4e4; + border-radius: 4px; + padding: 0 8px; + padding-right: 4px; + background-color: white; + cursor: pointer; + user-select: none; } -div[data-type='memos_view'] .preference-wrapper > .section-header-container > .title-text { - font-weight: bold; - font-size: 18px; - color: #37352f; +.theme-light .selector-wrapper > .current-value-container:hover, +.theme-light .selector-wrapper > .current-value-container.active { + background-color: #f8f8f8; } -div[data-type='memos_view'] .preference-wrapper > .tip-text-container { - width: 100%; - height: 128px; +.theme-light .selector-wrapper > .current-value-container > .value-text { + margin-right: 0px; + font-size: 13px; + line-height: 32px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: calc(100% - 20px); +} +.theme-light .selector-wrapper > .current-value-container > .arrow-text { display: flex; - flex-direction: column; + flex-direction: row; justify-content: center; align-items: center; + width: 16px; + flex-shrink: 0; } -div[data-type='memos_view'] .preference-wrapper > .sections-wrapper { +.theme-light .selector-wrapper > .current-value-container > .arrow-text > .icon-img { + width: 16px; + height: auto; + opacity: 0.6; + transform: rotate(90deg); +} +.theme-light .selector-wrapper > .items-wrapper { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - flex-grow: 1; - width: 100%; - overflow-y: scroll; - padding-bottom: 64px; + position: absolute; + top: 100%; + left: 0; + width: auto; + min-width: calc(100% + 16px); + max-height: 256px; + padding: 4px; + overflow: auto; + margin-top: 2px; + margin-left: -8px; + z-index: 1; + background-color: white; + border-radius: 8px; + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); scrollbar-width: none; } -div[data-type='memos_view'] .preference-wrapper > .sections-wrapper::-webkit-scrollbar { +.theme-light .selector-wrapper > .items-wrapper::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -div[data-type='memos_view'] .preference-wrapper > .sections-wrapper::-webkit-scrollbar-thumb { +.theme-light .selector-wrapper > .items-wrapper::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -div[data-type='memos_view'] .preference-wrapper > .sections-wrapper::-webkit-scrollbar-thumb:hover { +.theme-light .selector-wrapper > .items-wrapper::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -div[data-type='memos_view'] .preference-wrapper > .sections-wrapper::-webkit-scrollbar { +.theme-light .selector-wrapper > .items-wrapper::-webkit-scrollbar { display: none; } -div[data-type='memos_view'] .preference-wrapper > .sections-wrapper > .section-container { +.theme-light .selector-wrapper > .items-wrapper > .item-container { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; width: 100%; - background-color: white; - margin: 8px 0; - padding: 16px; - padding-bottom: 8px; - border-radius: 8px; + padding-left: 12px; + line-height: 30px; + white-space: nowrap; + font-size: 13px; + cursor: pointer; + border-radius: 4px; + user-select: none; } -div[data-type='memos_view'] .preference-wrapper > .sections-wrapper > .section-container > .title-text { - font-size: 15px; - color: #37352f; - font-weight: bold; - margin-bottom: 8px; +.theme-light .selector-wrapper > .items-wrapper > .item-container:hover { + background-color: #f8f8f8; } -div[data-type='memos_view'] .preference-wrapper > .sections-wrapper > .section-container > .form-label { +.theme-light .selector-wrapper > .items-wrapper > .item-container.selected { + color: #55bb8e; +} +.theme-dark .selector-wrapper { display: flex; - flex-direction: row; + flex-direction: column; justify-content: flex-start; + align-items: flex-start; + position: relative; + height: 28px; +} +.theme-dark .selector-wrapper > .current-value-container { + display: flex; + flex-direction: row; + justify-content: space-between; align-items: center; width: 100%; - font-size: 14px; - line-height: 20px; - margin-bottom: 8px; + height: 100%; + border: 1px solid #353535; + border-radius: 4px; + padding: 0 8px; + padding-right: 4px; + background-color: #000000; + cursor: pointer; + user-select: none; } -div[data-type='memos_view'] .preference-wrapper > .sections-wrapper > .section-container > .form-label > .normal-text { - flex-shrink: 0; +.theme-dark .selector-wrapper > .current-value-container:hover, +.theme-dark .selector-wrapper > .current-value-container.active { + background-color: #808080; } -@media only screen and (max-width: 875px) { - div[data-type='memos_view'] .sections-wrapper { - padding: 0 12px; - } +.theme-dark .selector-wrapper > .current-value-container > .value-text { + margin-right: 0px; + font-size: 13px; + line-height: 32px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: calc(100% - 20px); } -.mono-font-family { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-dark .selector-wrapper > .current-value-container > .arrow-text { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 16px; + flex-shrink: 0; } -.hide-scroll-bar { +.theme-dark .selector-wrapper > .current-value-container > .arrow-text > .icon-img { + width: 16px; + height: auto; + opacity: 0.6; + transform: rotate(90deg); + fill: #cdcdcd; +} +.theme-dark .selector-wrapper > .items-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + position: absolute; + top: 100%; + left: 0; + width: auto; + min-width: calc(100% + 16px); + max-height: 256px; + padding: 4px; + overflow: auto; + margin-top: 2px; + margin-left: -8px; + z-index: 1; + background-color: #000000; + border-radius: 8px; + box-shadow: 0 0 8px 0 rgba(255, 255, 255, 0.2); scrollbar-width: none; } -.hide-scroll-bar::-webkit-scrollbar { +.theme-dark .selector-wrapper > .items-wrapper::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.hide-scroll-bar::-webkit-scrollbar-thumb { +.theme-dark .selector-wrapper > .items-wrapper::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { +.theme-dark .selector-wrapper > .items-wrapper::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.hide-scroll-bar::-webkit-scrollbar { +.theme-dark .selector-wrapper > .items-wrapper::-webkit-scrollbar { display: none; } -.about-site-dialog > .dialog-container { - width: 420px; -} -.about-site-dialog > .dialog-container > .dialog-content-container { - line-height: 1.8; -} -.about-site-dialog > .dialog-container > .dialog-content-container > p { - margin: 2px 0; -} -.about-site-dialog > .dialog-container > .dialog-content-container > hr { - margin: 4px 0; - width: 100%; - height: 1px; - background-color: lightgray; - border: none; -} -.about-site-dialog > .dialog-container > .dialog-content-container .normal-text { +.theme-dark .selector-wrapper > .items-wrapper > .item-container { display: flex; - flex-direction: row; + flex-direction: column; justify-content: flex-start; - align-items: center; + align-items: flex-start; + width: 100%; + padding-left: 12px; + line-height: 30px; + white-space: nowrap; font-size: 13px; - color: gray; - white-space: pre-wrap; - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; + cursor: pointer; + border-radius: 4px; + user-select: none; } -.about-site-dialog > .dialog-container > .dialog-content-container .pre-text { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-dark .selector-wrapper > .items-wrapper > .item-container:hover { + background-color: #808080; } -@media only screen and (max-width: 875px) { - .dialog-wrapper.about-site-dialog { - padding: 24px 16px; - padding-top: 64px; - } +.theme-dark .selector-wrapper > .items-wrapper > .item-container.selected { + color: #d24c42; } .mono-font-family { font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; @@ -5004,301 +4800,318 @@ div[data-type='memos_view'] .preference-wrapper > .sections-wrapper > .section-c .hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-light div[data-type='memos_view'] .menu-btns-popup { +.theme-light .create-query-dialog > .dialog-container { + width: 420px; +} +.theme-light .create-query-dialog > .dialog-container > .dialog-content-container { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - position: absolute; - margin-top: 4px; - margin-left: 90px; - padding: 4px; - width: 180px; - border-radius: 8px; - z-index: 20; - box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); - background-color: white; -} -.theme-light div[data-type='memos_view'] .menu-btns-popup:hover { - display: flex; } -.theme-light div[data-type='memos_view'] .menu-btns-popup > .btn { +.theme-light .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container { display: flex; flex-direction: row; justify-content: flex-start; - align-items: center; + align-items: flex-start; width: 100%; - padding: 8px 4px; - font-size: 14px; - line-height: 1.6; - border-radius: 4px; - text-align: left; + margin-top: 8px; + padding: 4px 0; } -.theme-light div[data-type='memos_view'] .menu-btns-popup > .btn > .icon { +.theme-light .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .normal-text { display: block; - width: 28px; - text-align: center; - margin-right: 4px; - font-size: 14px; -} -.theme-light div[data-type='memos_view'] .menu-btns-popup > .btn:hover { - background-color: #f8f8f8; + flex-shrink: 0; + width: 40px; + margin-right: 12px; + text-align: right; + color: gray; + font-size: 13px; + line-height: 32px; } -@media only screen and (max-width: 875px) { - div[data-type='memos_view'] .menu-btns-popup { - margin-left: 64px; - } +.theme-light .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .title-input { + width: 100%; + padding: 0 8px; + font-size: 13px; + line-height: 32px; + border-radius: 4px; + border: 1px solid #e4e4e4; + resize: none; } -.theme-dark div[data-type='memos_view'] .menu-btns-popup { +.theme-light .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .filters-wrapper { + width: calc(100% - 56px); display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - position: absolute; - margin-top: 4px; - margin-left: 90px; - padding: 4px; - width: 180px; - border-radius: 8px; - z-index: 20; - background-color: #000000; } -.theme-dark div[data-type='memos_view'] .menu-btns-popup:hover { +.theme-light .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .filters-wrapper > .create-filter-btn { + color: #55bb8e; + font-size: 13px; + line-height: 32px; + cursor: pointer; +} +.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container { display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; + margin-top: 0; } -.theme-dark div[data-type='memos_view'] .menu-btns-popup > .btn { +.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container { display: flex; flex-direction: row; justify-content: flex-start; align-items: center; - width: 100%; - padding: 8px 4px; - font-size: 14px; - line-height: 1.6; - border-radius: 4px; - text-align: left; } -.theme-dark div[data-type='memos_view'] .menu-btns-popup > .btn > .icon { - display: block; - width: 28px; - text-align: center; - margin-right: 4px; - font-size: 14px; +.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .tip-text { + font-size: 13px; + color: gray; + margin-right: 8px; + white-space: nowrap; } -.theme-dark div[data-type='memos_view'] .menu-btns-popup > .btn:hover { - background-color: #808080; +.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn { + padding: 6px 16px; + font-size: 13px; + border-radius: 4px; } -@media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .menu-btns-popup { - margin-left: 64px; - } +.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn:hover { + opacity: 0.8; } -.mono-font-family { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn.disabled { + color: lightgray; + cursor: not-allowed; } -.hide-scroll-bar { - scrollbar-width: none; +.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn.save-btn { + background-color: #55bb8e; + color: white; } -.hide-scroll-bar::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; +.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn.save-btn.requesting { + cursor: wait; + opacity: 0.8; } -.hide-scroll-bar::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; -} -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { - background-color: #ccc; -} -.hide-scroll-bar::-webkit-scrollbar { - display: none; -} -.theme-light .daily-memo-wrapper { +.theme-light .memo-filter-input-wrapper { display: flex; flex-direction: row; justify-content: flex-start; - align-items: flex-start; - position: relative; - width: calc(100% - 24px); - margin-left: 24px; - padding: 0; - padding-bottom: 24px; - border: none; - border-left: 2px solid #f8f8f8; + align-items: center; + width: 100%; + margin-top: 8px; + flex-shrink: 0; } -.theme-light .daily-memo-wrapper:last-child { - border-left: none; - padding-bottom: 0; +.theme-light .memo-filter-input-wrapper:first-of-type { + margin-top: 0; } -.theme-light .daily-memo-wrapper > .time-wrapper { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - position: relative; - left: -24px; - margin-top: -2px; +.theme-light .memo-filter-input-wrapper > .selector-wrapper { + margin-right: 4px; + height: 34px; + flex-grow: 0; flex-shrink: 0; +} +.theme-light .memo-filter-input-wrapper > .selector-wrapper.relation-selector { width: 48px; - height: 28px; - border-radius: 6px; - background-color: #eaeaea; - color: #52504b; - border: 2px solid white; + margin-left: -52px; } -.theme-light .daily-memo-wrapper > .time-wrapper > .normal-text { - margin: 0 auto; - font-size: 11px; - line-height: 24px; +.theme-light .memo-filter-input-wrapper > .selector-wrapper.type-selector { + width: 62px; } -.theme-light .daily-memo-wrapper > .memo-content-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - margin-left: -12px; - padding: 0; - font-size: 16px; - margin-top: -3px; +.theme-light .memo-filter-input-wrapper > .selector-wrapper.operator-selector { + width: 62px; } -.theme-light .daily-memo-wrapper > .memo-content-container > .memo-content-text { - margin-top: -14px; +.theme-light .memo-filter-input-wrapper > .selector-wrapper.value-selector { + flex-grow: 1; + max-width: calc(100% - 152px); } -.theme-light .daily-memo-wrapper > .memo-content-container > .memo-content-text p > a { - width: 20em; - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 3; - overflow: hidden; +.theme-light .memo-filter-input-wrapper > input.value-inputer { + max-width: calc(100% - 152px); + height: 34px; + padding: 0 8px; + flex-shrink: 0; + flex-grow: 1; + margin-right: 4px; + border-radius: 4px; + border: 1px solid #e4e4e4; + background-color: transparent; } -.theme-light .daily-memo-wrapper > .memo-content-container > .memo-content-text .tag-span { - cursor: unset; - padding-left: 4px; - padding-right: 6px; - margin-left: 4px; +.theme-light .memo-filter-input-wrapper > input.value-inputer:hover { + background-color: #f8f8f8; } -.theme-light .daily-memo-wrapper > .memo-content-container > .memo-content-text .tag-span:hover { - color: #5783f7; - background-color: #eef3fe; +.theme-light .memo-filter-input-wrapper > .remove-btn { + width: 16px; + height: auto; + cursor: pointer; + opacity: 0.8; } -.theme-light .daily-memo-wrapper > .memo-content-container > .images-container { +.theme-light .memo-filter-input-wrapper > .remove-btn:hover { + opacity: 0.6; +} +@media only screen and (max-width: 875px) { + .theme-light .dialog-wrapper.create-query-dialog { + padding: 24px 16px; + padding-top: 64px; + justify-content: unset; + overflow-x: hidden; + } + .theme-light .dialog-wrapper.create-query-dialog::-webkit-scrollbar { + display: none; + } +} +.theme-dark .create-query-dialog > .dialog-container { + width: 420px; +} +.theme-dark .create-query-dialog > .dialog-container > .dialog-content-container { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - width: 100%; -} -.theme-light .daily-memo-wrapper > .memo-content-container > .images-container > img { - width: 100%; - height: auto; - border-radius: 4px; - margin-bottom: 8px; - margin-top: 16px; -} -.theme-light .daily-memo-wrapper > .memo-content-container > .images-container > img:last-child { - margin-bottom: 0; } -.theme-dark .daily-memo-wrapper { +.theme-dark .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container { display: flex; flex-direction: row; justify-content: flex-start; align-items: flex-start; - position: relative; - width: calc(100% - 24px); - margin-left: 24px; - padding: 0; - padding-bottom: 24px; - border: none; - border-left: 2px solid #808080; -} -.theme-dark .daily-memo-wrapper:last-child { - border-left: none; - padding-bottom: 0; + width: 100%; + margin-top: 8px; + padding: 4px 0; } -.theme-dark .daily-memo-wrapper > .time-wrapper { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - position: relative; - left: -24px; - margin-top: -2px; +.theme-dark .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .normal-text { + display: block; flex-shrink: 0; - width: 48px; - height: 28px; - border-radius: 6px; - background-color: #727171; - color: #c7c4bb; - border: 2px solid #727171; + width: 40px; + margin-right: 12px; + text-align: right; + color: #afafaf; + font-size: 13px; + line-height: 32px; } -.theme-dark .daily-memo-wrapper > .time-wrapper > .normal-text { - margin: 0 auto; - font-size: 11px; - line-height: 24px; +.theme-dark .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .title-input { + width: 100%; + padding: 0 8px; + font-size: 13px; + line-height: 32px; + border-radius: 4px; + border: 1px solid #353535; + resize: none; } -.theme-dark .daily-memo-wrapper > .memo-content-container { +.theme-dark .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .filters-wrapper { + width: calc(100% - 56px); display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - width: 100%; - margin-left: -12px; - padding: 0; - font-size: 16px; - margin-top: -3px; } -.theme-dark .daily-memo-wrapper > .memo-content-container > .memo-content-text { - margin-top: -14px; - text-overflow: clip; - -webkit-line-clamp: 2; - /*限制在一个块元素显示的文本的行数*/ - -webkit-box-orient: vertical; - overflow: hidden; - width: 80%; - text-overflow: ellipsis; - -o-text-overflow: ellipsis; - -webkit-text-overflow: ellipsis; - -moz-text-overflow: ellipsis; - white-space: nowrap; - /*规定段落中的文本不进行换行*/ -} -.theme-dark .daily-memo-wrapper > .memo-content-container > .memo-content-text p > a.link { - width: 20em; - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 3; - overflow: hidden; -} -.theme-dark .daily-memo-wrapper > .memo-content-container > .memo-content-text .tag-span { - cursor: unset; - padding-left: 4px; - padding-right: 6px; - margin-left: 4px; +.theme-dark .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .filters-wrapper > .create-filter-btn { + color: #d24c42; + font-size: 13px; + line-height: 32px; + cursor: pointer; } -.theme-dark .daily-memo-wrapper > .memo-content-container > .memo-content-text .tag-span:hover { - color: #bbbec7; - background-color: #616161; +.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; + margin-top: 0; } -.theme-dark .daily-memo-wrapper > .memo-content-container > .images-container { +.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container { display: flex; - flex-direction: column; + flex-direction: row; justify-content: flex-start; - align-items: flex-start; - width: 100%; + align-items: center; } -.theme-dark .daily-memo-wrapper > .memo-content-container > .images-container > img { - width: 100%; - height: auto; +.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .tip-text { + font-size: 13px; + color: #bbbbbb; + margin-right: 8px; + white-space: nowrap; +} +.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn { + padding: 6px 16px; + font-size: 13px; border-radius: 4px; - margin-bottom: 8px; - margin-top: 16px; } -.theme-dark .daily-memo-wrapper > .memo-content-container > .images-container > img:last-child { - margin-bottom: 0; +.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn:hover { + opacity: 0.8; +} +.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn.disabled { + color: #303030; + cursor: not-allowed; +} +.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn.save-btn { + background-color: #940b01; + color: #000000; +} +.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn.save-btn.requesting { + cursor: wait; + opacity: 0.8; +} +.theme-dark .memo-filter-input-wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + width: 100%; + margin-top: 8px; + flex-shrink: 0; +} +.theme-dark .memo-filter-input-wrapper:first-of-type { + margin-top: 0; +} +.theme-dark .memo-filter-input-wrapper > .selector-wrapper { + margin-right: 4px; + height: 34px; + flex-grow: 0; + flex-shrink: 0; +} +.theme-dark .memo-filter-input-wrapper > .selector-wrapper.relation-selector { + width: 48px; + margin-left: -52px; +} +.theme-dark .memo-filter-input-wrapper > .selector-wrapper.type-selector { + width: 62px; +} +.theme-dark .memo-filter-input-wrapper > .selector-wrapper.operator-selector { + width: 62px; +} +.theme-dark .memo-filter-input-wrapper > .selector-wrapper.value-selector { + flex-grow: 1; + max-width: calc(100% - 152px); +} +.theme-dark .memo-filter-input-wrapper > input.value-inputer { + max-width: calc(100% - 152px); + height: 34px; + padding: 0 8px; + flex-shrink: 0; + flex-grow: 1; + margin-right: 4px; + border-radius: 4px; + border: 1px solid #353535; + background-color: transparent; +} +.theme-dark .memo-filter-input-wrapper > input.value-inputer:hover { + background-color: #808080; +} +.theme-dark .memo-filter-input-wrapper > .remove-btn { + width: 16px; + height: auto; + cursor: pointer; + opacity: 0.8; + filter: invert(0.8); +} +.theme-dark .memo-filter-input-wrapper > .remove-btn:hover { + opacity: 0.6; +} +@media only screen and (max-width: 875px) { + .theme-dark .dialog-wrapper.create-query-dialog { + padding: 24px 16px; + padding-top: 64px; + justify-content: unset; + overflow-x: hidden; + } + .theme-dark .dialog-wrapper.create-query-dialog::-webkit-scrollbar { + display: none; + } } .mono-font-family { font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; @@ -5323,1030 +5136,2158 @@ div[data-type='memos_view'] .preference-wrapper > .sections-wrapper > .section-c .hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-light .date-picker-wrapper { +.theme-light div[data-type='memos_view'] .queries-wrapper { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - padding: 16px; -} -.theme-light .date-picker-wrapper > .date-picker-header { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; width: 100%; + padding: 0 8px; + height: auto; + flex-wrap: nowrap; + scrollbar-width: none; } -.theme-light .date-picker-wrapper > .date-picker-header > .btn-text { - width: 24px; - height: 24px; - border-radius: 4px; +.theme-light div[data-type='memos_view'] .queries-wrapper::-webkit-scrollbar { + width: 0; + height: 0; cursor: pointer; - user-select: none; -} -.theme-light .date-picker-wrapper > .date-picker-header > .btn-text > .icon-img { - width: 100%; - height: auto; } -.theme-light .date-picker-wrapper > .date-picker-header > .btn-text:hover { - background-color: #f8f8f8; +.theme-light div[data-type='memos_view'] .queries-wrapper::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-light .date-picker-wrapper > .date-picker-header > .normal-text { - margin: 0 4px; - line-height: 24px; +.theme-light div[data-type='memos_view'] .queries-wrapper::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-light .date-picker-wrapper > .date-picker-day-container { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: flex-start; - width: 280px; - flex-wrap: wrap; +.theme-light div[data-type='memos_view'] .queries-wrapper::-webkit-scrollbar { + display: none; } -.theme-light .date-picker-wrapper > .date-picker-day-container > .date-picker-day-header { +.theme-light div[data-type='memos_view'] .queries-wrapper > .title-text { display: flex; flex-direction: row; - justify-content: space-around; + justify-content: space-between; align-items: center; width: 100%; + padding: 4px 16px; + margin-bottom: 4px; } -.theme-light .date-picker-wrapper > .date-picker-day-container > .date-picker-day-header > .day-item { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - width: 36px; - height: 36px; - user-select: none; - color: gray; - font-size: 13px; - margin: 2px 0; +.theme-light div[data-type='memos_view'] .queries-wrapper > .title-text > * { + font-size: 12px; + line-height: 24px; + color: #37352f; + opacity: 0.5; + font-weight: bold; } -.theme-light .date-picker-wrapper > .date-picker-day-container > .day-item { +.theme-light div[data-type='memos_view'] .queries-wrapper > .title-text > .btn { + display: none; + padding: 0 4px; + font-size: 18px; +} +.theme-light div[data-type='memos_view'] .queries-wrapper > .title-text:hover > .btn, +.theme-light div[data-type='memos_view'] .queries-wrapper > .title-text:active > .btn { + display: block; +} +.theme-light div[data-type='memos_view'] .queries-wrapper > .create-query-btn-container { display: flex; - flex-direction: column; + flex-direction: row; justify-content: center; align-items: center; - width: 36px; - height: 36px; - border-radius: 50%; - font-size: 14px; - user-select: none; - cursor: pointer; - margin: 2px; -} -.theme-light .date-picker-wrapper > .date-picker-day-container > .day-item:hover { - background-color: #f8f8f8; + width: 100%; + margin-top: 8px; + margin-bottom: 12px; } -.theme-light .date-picker-wrapper > .date-picker-day-container > .day-item.current { - background-color: #eef3fe; - font-size: 16px; - color: #5783f7; - font-weight: bold; +.theme-light div[data-type='memos_view'] .queries-wrapper > .create-query-btn-container > .btn { + display: flex; + padding: 4px 8px; + border: 1px dashed #1337a3; + border-radius: 8px; + font-size: 13px; } -.theme-light .date-picker-wrapper > .date-picker-day-container > .day-item.null { - background-color: unset; - cursor: unset; +.theme-light div[data-type='memos_view'] .queries-wrapper > .create-query-btn-container > .btn:hover { + background-color: #1337a3; + color: white; } -.theme-dark .date-picker-wrapper { +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - padding: 16px; + position: relative; + width: 100%; + height: auto; + flex-wrap: nowrap; + margin-bottom: 8px; } -.theme-dark .date-picker-wrapper > .date-picker-header { +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container { display: flex; flex-direction: row; - justify-content: center; + justify-content: space-between; align-items: center; width: 100%; -} -.theme-dark .date-picker-wrapper > .date-picker-header > .btn-text { - width: 24px; - height: 24px; - border-radius: 4px; + height: 40px; + padding: 0 16px; + margin-top: 4px; + border-radius: 8px; + font-size: 14px; cursor: pointer; + flex-shrink: 0; user-select: none; } -.theme-dark .date-picker-wrapper > .date-picker-header > .btn-text > .icon-img { - width: 100%; - height: auto; - filter: invert(0.8); +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container:hover { + background-color: #e4e4e4; } -.theme-dark .date-picker-wrapper > .date-picker-header > .btn-text:hover { - background-color: #808080; +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container:hover > .btns-container { + display: flex; } -.theme-dark .date-picker-wrapper > .date-picker-header > .normal-text { - margin: 0 4px; - line-height: 24px; +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container.active { + background-color: #55bb8e !important; } -.theme-dark .date-picker-wrapper > .date-picker-day-container { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: flex-start; - width: 280px; - flex-wrap: wrap; +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container.active > .query-text-container { + font-weight: bold; } -.theme-dark .date-picker-wrapper > .date-picker-day-container > .date-picker-day-header { +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container.active > .query-text-container > * { + color: white; +} +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .query-text-container { display: flex; flex-direction: row; - justify-content: space-around; + justify-content: flex-start; align-items: center; - width: 100%; + max-width: calc(100% - 24px); + color: #37352f; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 0; + line-height: 20px; } -.theme-dark .date-picker-wrapper > .date-picker-day-container > .date-picker-day-header > .day-item { +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .query-text-container > .icon-text { + display: block; + width: 16px; + flex-shrink: 0; +} +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .query-text-container > .query-text { + flex-shrink: 0; +} +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container { display: flex; - flex-direction: column; - justify-content: center; + flex-direction: row; + justify-content: flex-end; align-items: center; - width: 36px; - height: 36px; - user-select: none; - color: #b8b8b8; - font-size: 13px; - margin: 2px 0; + display: none; } -.theme-dark .date-picker-wrapper > .date-picker-day-container > .day-item { +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btn { display: flex; - flex-direction: column; + flex-direction: row; justify-content: center; align-items: center; - width: 36px; - height: 36px; - border-radius: 50%; - font-size: 14px; - user-select: none; - cursor: pointer; - margin: 2px; + width: 24px; + height: 24px; + flex-shrink: 0; } -.theme-dark .date-picker-wrapper > .date-picker-day-container > .day-item:hover { - background-color: #808080; +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btn > .icon-img { + width: 18px; + height: auto; } -.theme-dark .date-picker-wrapper > .date-picker-day-container > .day-item.current { - background-color: #616161; - font-size: 16px; - color: #5783f7; +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + position: absolute; + right: 0; + width: auto; + height: auto; + padding: 8px; + transform: translateY(60px); + z-index: 1; +} +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 86px; + height: auto; + white-space: nowrap; + border-radius: 6px; + padding: 4px; + background-color: white; + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); +} +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn { + width: 100%; + padding: 6px 0; + padding-left: 12px; + border-radius: 4px; + font-size: 13px; + height: unset; + line-height: unset; + text-align: left; +} +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn:hover { + background-color: #f8f8f8; +} +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn.delete-btn { + color: #d28653; +} +.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn.delete-btn.final-confirm { font-weight: bold; } -.theme-dark .date-picker-wrapper > .date-picker-day-container > .day-item.null { - background-color: unset; - cursor: unset; +.theme-light div[data-type='memos_view'].mobile-view .queries-container { + height: auto; } -.mono-font-family { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-light div[data-type='memos_view'].mobile-view .queries-container:last-child { + flex-grow: 1; } -.hide-scroll-bar { +.theme-light div[data-type='memos_view'].mobile-view .queries-container > .title-text { + font-size: 13px; + margin-bottom: 4px; +} +.theme-light div[data-type='memos_view'].mobile-view .queries-container > .query-item-container { + font-size: 15px; +} +.theme-dark [data-type='memos_view'] .queries-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 100%; + padding: 0 8px; + height: auto; + flex-wrap: nowrap; scrollbar-width: none; } -.hide-scroll-bar::-webkit-scrollbar { +.theme-dark [data-type='memos_view'] .queries-wrapper::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.hide-scroll-bar::-webkit-scrollbar-thumb { +.theme-dark [data-type='memos_view'] .queries-wrapper::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { +.theme-dark [data-type='memos_view'] .queries-wrapper::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.hide-scroll-bar::-webkit-scrollbar { +.theme-dark [data-type='memos_view'] .queries-wrapper::-webkit-scrollbar { display: none; } -.theme-light .daily-memo-diary-dialog > .dialog-container { - width: 440px; - max-width: 100%; - padding: 0; -} -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - position: relative; - width: 100%; - padding: 24px; - margin-bottom: 0; - padding-bottom: 0; -} -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper { +.theme-dark [data-type='memos_view'] .queries-wrapper > .title-text { display: flex; flex-direction: row; justify-content: space-between; align-items: center; width: 100%; + padding: 4px 16px; + margin-bottom: 4px; } -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; +.theme-dark [data-type='memos_view'] .queries-wrapper > .title-text > * { + font-size: 12px; + line-height: 24px; + color: #d2d1cd; + opacity: 0.5; + font-weight: bold; } -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text { - width: 24px; - height: 24px; - margin-right: 8px; - border-radius: 4px; - cursor: pointer; - user-select: none; +.theme-dark [data-type='memos_view'] .queries-wrapper > .title-text > .btn { + display: none; + padding: 0 4px; + font-size: 18px; } -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text:last-child { - margin-right: 0; +.theme-dark [data-type='memos_view'] .queries-wrapper > .title-text:hover > .btn, +.theme-dark [data-type='memos_view'] .queries-wrapper > .title-text:active > .btn { + display: block; } -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text > .icon-img { +.theme-dark [data-type='memos_view'] .queries-wrapper > .create-query-btn-container { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; width: 100%; - height: auto; + margin-top: 8px; + margin-bottom: 12px; } -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text:hover { - background-color: lightgray; +.theme-dark [data-type='memos_view'] .queries-wrapper > .create-query-btn-container > .btn { + display: flex; + padding: 4px 8px; + border: 1px dashed #2c395a; + border-radius: 8px; + font-size: 13px; } -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text.share-btn { - padding: 2px; +.theme-dark [data-type='memos_view'] .queries-wrapper > .create-query-btn-container > .btn:hover { + background-color: #2c395a; + color: white; } -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container { +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - width: 440px; - max-width: 100%; + position: relative; + width: 100%; height: auto; - padding: 24px 24px; + flex-wrap: nowrap; + margin-bottom: 8px; } -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container { +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container { display: flex; - flex-direction: column; - justify-content: center; + flex-direction: row; + justify-content: space-between; align-items: center; - margin: auto; - padding-bottom: 24px; - z-index: 1; + width: 100%; + height: 40px; + padding: 0 16px; + margin-top: 4px; + border-radius: 8px; + font-size: 14px; + cursor: pointer; + flex-shrink: 0; user-select: none; } -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .year-text { - margin: auto; - font-weight: bold; - color: gray; - text-align: center; - line-height: 24px; - margin-bottom: 12px; +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container:hover { + background-color: #353535; } -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container { +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container:hover > .btns-container { display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - margin: auto; - width: 96px; - height: 96px; - border-radius: 32px; - box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); - border: 1px solid rgba(0, 0, 0, 0.1); - text-align: center; - z-index: 1; } -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .month-text, -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .day-text { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - height: 24px; - font-size: 14px; +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container.active { + background-color: #940b01 !important; } -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .month-text { - background-color: #1337a3; - color: white; - border-top-left-radius: 32px; - border-top-right-radius: 32px; +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container.active > .query-text-container { + font-weight: bold; } -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .date-text { +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container.active > .query-text-container > * { + color: #727272; +} +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .query-text-container { display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - padding-top: 4px; - height: 48px; - font-size: 44px; - font-weight: bold; -} -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .day-text { - font-size: 12px; -} -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-picker { - margin: 0 auto; - border: 1px solid lightgray; - border-radius: 8px; - margin-bottom: 24px; -} -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .tip-container { - margin: auto; - padding: 16px 0; -} -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .tip-container > .tip-text { - font-style: italic; -} -.theme-light .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .dailymemos-wrapper { - display: flex; - flex-direction: column; + flex-direction: row; justify-content: flex-start; - align-items: flex-start; - margin-top: 8px; - width: 100%; -} -@media only screen and (max-width: 875px) { - .theme-light .dialog-wrapper.daily-memo-diary-dialog { - padding: 0; - scrollbar-width: none; - } - .theme-light .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; - } - .theme-light .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; - } - .theme-light .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar-thumb:hover { - background-color: #ccc; - } - .theme-light .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar { - display: none; - } - .theme-light .dialog-wrapper.daily-memo-diary-dialog > .dialog-container { - width: 100%; - height: 100%; - border-radius: 0; - overflow-y: auto; - overflow-x: hidden; - padding-bottom: 16px; - } - .theme-light .dialog-wrapper.daily-memo-diary-dialog > .dialog-container > .dialog-header-container { - padding-top: 32px; - } - .theme-light .dialog-wrapper.daily-memo-diary-dialog > .dialog-container::-webkit-scrollbar { - display: none; - } + align-items: center; + max-width: calc(100% - 24px); + color: #37352f; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 0; + line-height: 20px; } -.theme-dark .daily-memo-diary-dialog > .dialog-container { - width: 440px; - max-width: 100%; - padding: 0; +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .query-text-container > .icon-text { + display: block; + width: 16px; + flex-shrink: 0; + color: #d2d1cd; } -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - position: relative; - width: 100%; - padding: 24px; - margin-bottom: 0; - padding-bottom: 0; +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .query-text-container > .query-text { + flex-shrink: 0; + color: #d2d1cd; } -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper { +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container { display: flex; flex-direction: row; - justify-content: space-between; + justify-content: flex-end; align-items: center; - width: 100%; + display: none; } -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container { +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btn { display: flex; flex-direction: row; - justify-content: flex-start; + justify-content: center; align-items: center; -} -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text { width: 24px; height: 24px; - margin-right: 8px; - border-radius: 4px; - cursor: pointer; - user-select: none; -} -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text:last-child { - margin-right: 0; + flex-shrink: 0; } -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text > .icon-img { - width: 100%; +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btn > .icon-img { + width: 18px; height: auto; - filter: invert(0.8); -} -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text:hover { - background-color: #383838; -} -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-header-container > .header-wrapper > .btns-container > .btn-text.share-btn { - padding: 2px; } -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container { +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - width: 440px; - max-width: 100%; + position: absolute; + right: 0; + width: auto; height: auto; - padding: 24px 24px; -} -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - margin: auto; - padding-bottom: 24px; + padding: 8px; + transform: translateY(60px); z-index: 1; - user-select: none; -} -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .year-text { - margin: auto; - font-weight: bold; - color: #a1a1a1; - text-align: center; - line-height: 24px; - margin-bottom: 12px; } -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container { +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container { display: flex; flex-direction: column; - justify-content: center; - align-items: center; - margin: auto; - width: 96px; - height: 96px; - border-radius: 32px; - box-shadow: 0 0 8px 0 rgba(255, 255, 255, 0.2); - border: 1px solid rgba(255, 255, 255, 0.1); - background-color: #d2d1cd; - color: black; - text-align: center; - z-index: 1; + justify-content: flex-start; + align-items: flex-start; + width: 86px; + height: auto; + white-space: nowrap; + border-radius: 6px; + padding: 4px; + background-color: #646464; + box-shadow: 0 0 8px 0 rgba(187, 187, 187, 0.2); } -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .month-text, -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .day-text { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn { width: 100%; - height: 24px; - font-size: 14px; + padding: 6px 0; + padding-left: 12px; + border-radius: 4px; + font-size: 13px; + height: unset; + line-height: unset; + text-align: left; } -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .month-text { - background-color: #2c395a; - color: white; - border-top-left-radius: 32px; - border-top-right-radius: 32px; - margin-top: -1px; +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn:hover { + background-color: #808080; } -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .date-text { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - width: 100%; - padding-top: 4px; - height: 48px; - font-size: 44px; +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn.delete-btn { + color: #940b01; +} +.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn.delete-btn.final-confirm { font-weight: bold; } -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-card-container > .date-container > .day-text { - font-size: 12px; +.theme-dark div[data-type='memos_view'].mobile-view .queries-container { + height: auto; } -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .date-picker { - margin: 0 auto; - border: 1px solid #333333; +.theme-dark div[data-type='memos_view'].mobile-view .queries-container:last-child { + flex-grow: 1; +} +.theme-dark div[data-type='memos_view'].mobile-view .queries-container > .title-text { + font-size: 13px; + margin-bottom: 4px; +} +.theme-dark div[data-type='memos_view'].mobile-view .queries-container > .query-item-container { + font-size: 15px; +} +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.hide-scroll-bar { + scrollbar-width: none; +} +.hide-scroll-bar::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; +} +.hide-scroll-bar::-webkit-scrollbar-thumb { + width: 0; + height: 0; border-radius: 8px; - margin-bottom: 24px; + background-color: #d5d5d5; } -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .tip-container { - margin: auto; - padding: 16px 0; +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .tip-container > .tip-text { - font-style: italic; +.hide-scroll-bar::-webkit-scrollbar { + display: none; } -.theme-dark .daily-memo-diary-dialog > .dialog-container > .dialog-content-container > .dailymemos-wrapper { +.theme-light div[data-type='memos_view'] .tags-wrapper { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - margin-top: 8px; width: 100%; -} -@media only screen and (max-width: 875px) { - .theme-dark .dialog-wrapper.daily-memo-diary-dialog { - padding: 0; - scrollbar-width: none; - } - .theme-dark .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; - } - .theme-dark .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; - } - .theme-dark .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar-thumb:hover { - background-color: #ccc; - } - .theme-dark .dialog-wrapper.daily-memo-diary-dialog::-webkit-scrollbar { - display: none; - } - .theme-dark .dialog-wrapper.daily-memo-diary-dialog > .dialog-container { - width: 100%; - height: 100%; - border-radius: 0; - overflow-y: auto; - overflow-x: hidden; - padding-bottom: 16px; - } - .theme-dark .dialog-wrapper.daily-memo-diary-dialog > .dialog-container > .dialog-header-container { - padding-top: 32px; - } - .theme-dark .dialog-wrapper.daily-memo-diary-dialog > .dialog-container::-webkit-scrollbar { - display: none; - } -} -.mono-font-family { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; -} -.hide-scroll-bar { + padding: 0 8px; + height: auto; + flex-wrap: nowrap; + padding-bottom: 16px; + flex-grow: 1; scrollbar-width: none; } -.hide-scroll-bar::-webkit-scrollbar { +.theme-light div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.hide-scroll-bar::-webkit-scrollbar-thumb { +.theme-light div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { +.theme-light div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.hide-scroll-bar::-webkit-scrollbar { +.theme-light div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar { display: none; } -.theme-light div[data-type='memos_view'] .user-banner-container { +.theme-light div[data-type='memos_view'] .tags-wrapper > .title-text { + width: 100%; + padding: 4px 16px; + font-size: 12px; + line-height: 24px; + color: #37352f; + opacity: 0.5; + margin-bottom: 4px; +} +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; + position: relative; width: 100%; - height: 160px; + height: auto; + flex-wrap: nowrap; + margin-bottom: 8px; } -.theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container { +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .subtags-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: calc(100% - 18px); + min-width: 80px; + height: auto; + margin-top: 4px; + margin-left: 18px; + border-left: 2px solid #e4e4e4; + padding-left: 6px; +} +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .subtags-container > .tag-item-container:first-child { + margin-top: 0; +} +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container { display: flex; flex-direction: row; justify-content: space-between; align-items: center; width: 100%; - padding: 0 24px; - flex-wrap: nowrap; - margin-bottom: 4px; + height: 40px; + padding: 0 16px; + margin-top: 4px; + border-radius: 8px; + font-size: 14px; + cursor: pointer; + flex-shrink: 0; + user-select: none; } -.theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .username-text { - max-width: calc(100% - 32px); +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container:hover { + background-color: #e4e4e4; +} +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container.active > .tag-text-container > * { + color: #55bb8e; font-weight: bold; - font-size: 18px; - line-height: 36px; +} +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .tag-text-container { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + max-width: calc(100% - 24px); color: #37352f; overflow: hidden; text-overflow: ellipsis; - cursor: pointer; - margin-right: auto; flex-shrink: 0; + line-height: 20px; } -.theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn { +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .tag-text-container > .icon-text { + display: block; + width: 16px; flex-shrink: 0; - user-select: none; - border: none; - background-color: unset; } -.theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn.menu-popup-btn { +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .tag-text-container > .tag-text { + flex-shrink: 0; +} +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container { display: flex; - flex-direction: column; + flex-direction: row; + justify-content: flex-end; + align-items: center; +} +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container > .action-btn { + display: flex; + flex-direction: row; justify-content: center; align-items: center; - width: 36px; - height: 40px; + width: 24px; + height: 24px; + flex-shrink: 0; + transition: all 0.1s linear; + transform: rotate(0); margin-right: -8px; - cursor: pointer; } -.theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn.menu-popup-btn > .icon-img { - width: 20px; - height: auto; +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container > .action-btn > .icon-img { + width: 18px; + height: 18px; + opacity: 0.8; } -.theme-light div[data-type='memos_view'] .user-banner-container > .status-text-container { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: flex-start; - padding: 0 24px; +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container > .action-btn.shown { + transform: rotate(90deg); +} +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container > .tag-tip-container { width: 100%; - user-select: none; + margin-top: 8px; + padding-left: 16px; + font-size: 12px; + line-height: 1.6; + color: gray; } -.theme-light div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text { +.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container > .tag-tip-container > .code-text { + color: #5783f7; + padding: 4px; + margin: 0 2px; + white-space: pre-line; + background-color: #eef3fe; + border-radius: 4px; +} +.theme-light .rename-tag-dialog > .dialog-container { + width: 320px; +} +.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container { display: flex; flex-direction: column; justify-content: flex-start; + align-items: flex-start; +} +.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container > .tag-text { + margin-bottom: 8px; + font-size: 14px; +} +.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container > .text-input { + width: 100%; + padding: 8px 12px; + border: 1px solid lightgray; + border-radius: 4px; + font-size: 14px; + margin-bottom: 12px; +} +.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container { + display: flex; + flex-direction: row; + justify-content: flex-end; align-items: center; + width: 100%; } -.theme-light div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .amount-text { - font-weight: bold; - font-size: 28px; - line-height: 1.8; - color: #37352f; +.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text { + font-size: 14px; + margin-left: 12px; + cursor: pointer; +} +.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text:hover { opacity: 0.8; } -.theme-light div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .type-text { - color: gray; - font-size: 12px; - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text.cancel-btn { + color: #52504b; } -@media only screen and (max-width: 875px) { - .theme-light div[data-type='memos_view'] .user-banner-container { - height: 170px; - z-index: 1; - padding-top: 16px !important; - } - .theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container { - padding: 0 16px; - } - .theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn { - width: 60px; - } - .theme-light div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .username-text { - font-size: 22px; - } - .theme-light div[data-type='memos_view'] .user-banner-container > .status-text-container { - padding: 0 16px; - } - .theme-light div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .amount-text { - font-size: 32px; - } - .theme-light div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .type-text { - font-size: 14px; - } +.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text.confirm-btn { + background-color: #55bb8e; + color: white; + padding: 4px 12px; + border-radius: 4px; +} +.theme-light div[data-type='memos_view'].mobile-view .tags-wrapper, +.theme-light div[data-type='memos_view'].mobile-view .tags-wrapper-mobile-emulate { + background-color: white; +} +.theme-light div[data-type='memos_view'].mobile-view .tags-wrapper > .tags-container, +.theme-light div[data-type='memos_view'].mobile-view .tags-wrapper-mobile-emulate > .tags-container { + height: auto; +} +.theme-light div[data-type='memos_view'].mobile-view .tags-wrapper > .tags-container:last-child, +.theme-light div[data-type='memos_view'].mobile-view .tags-wrapper-mobile-emulate > .tags-container:last-child { + flex-grow: 1; +} +.theme-light .mobile-view .rename-tag-dialog, +.theme-light .mobile-view .rename-tag-dialog-mobile-emulate { + padding-top: 64px; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 100%; + padding: 0 8px; + height: auto; + flex-wrap: nowrap; + padding-bottom: 16px; + flex-grow: 1; + scrollbar-width: none; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar-thumb:hover { + background-color: #ccc; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar { + display: none; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .title-text { + width: 100%; + padding: 4px 16px; + font-size: 12px; + line-height: 24px; + color: #d2d1cd; + opacity: 0.5; + margin-bottom: 4px; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + position: relative; + width: 100%; + height: auto; + flex-wrap: nowrap; + margin-bottom: 8px; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .subtags-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: calc(100% - 18px); + min-width: 80px; + height: auto; + margin-top: 4px; + margin-left: 18px; + border-left: 2px solid #353535; + padding-left: 6px; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .subtags-container > .tag-item-container:first-child { + margin-top: 0; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; + height: 40px; + padding: 0 16px; + margin-top: 4px; + border-radius: 8px; + font-size: 14px; + cursor: pointer; + flex-shrink: 0; + user-select: none; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container:hover { + background-color: #353535; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container.active > .tag-text-container > * { + color: #457560; + font-weight: bold; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .tag-text-container { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + max-width: calc(100% - 24px); + color: #d2d1cd; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 0; + line-height: 20px; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .tag-text-container > .icon-text { + display: block; + width: 16px; + flex-shrink: 0; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .tag-text-container > .tag-text { + flex-shrink: 0; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container > .action-btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 24px; + height: 24px; + flex-shrink: 0; + transition: all 0.1s linear; + transform: rotate(0); + margin-right: -8px; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container > .action-btn > .icon-img { + width: 18px; + height: 18px; + opacity: 0.8; + color: #d2d1cd; + fill: #cdcdcd; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container > .action-btn.shown { + transform: rotate(90deg); +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container > .tag-tip-container { + width: 100%; + margin-top: 8px; + padding-left: 16px; + font-size: 12px; + line-height: 1.6; + color: #bbbbbb; +} +.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container > .tag-tip-container > .code-text { + color: #bbbec7; + padding: 4px; + margin: 0 2px; + white-space: pre-line; + background-color: #616161; + border-radius: 4px; +} +.theme-dark .rename-tag-dialog > .dialog-container { + width: 320px; +} +.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; +} +.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container > .tag-text { + margin-bottom: 8px; + font-size: 14px; +} +.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container > .text-input { + width: 100%; + padding: 8px 12px; + border: 1px solid #505050; + border-radius: 4px; + font-size: 14px; + margin-bottom: 12px; +} +.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + width: 100%; +} +.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text { + font-size: 14px; + margin-left: 12px; + cursor: pointer; +} +.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text:hover { + opacity: 0.8; +} +.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text.cancel-btn { + color: #c7c4bb; +} +.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text.confirm-btn { + background-color: #457560; + color: #000000; + padding: 4px 12px; + border-radius: 4px; +} +.theme-dark div[data-type='memos_view'].mobile-view .tags-wrapper, +.theme-dark div[data-type='memos_view'].mobile-view .tags-wrapper-mobile-emulate { + background-color: #000000; +} +.theme-dark div[data-type='memos_view'].mobile-view .tags-wrapper > .tags-container, +.theme-dark div[data-type='memos_view'].mobile-view .tags-wrapper-mobile-emulate > .tags-container { + height: auto; +} +.theme-dark div[data-type='memos_view'].mobile-view .tags-wrapper > .tags-container:last-child, +.theme-dark div[data-type='memos_view'].mobile-view .tags-wrapper-mobile-emulate > .tags-container:last-child { + flex-grow: 1; +} +.theme-dark .mobile-view .rename-tag-dialog, +.theme-dark .mobile-view .rename-tag-dialog-mobile-emulate { + padding-top: 64px; +} +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.hide-scroll-bar { + scrollbar-width: none; +} +.hide-scroll-bar::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; +} +.hide-scroll-bar::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; +} +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { + background-color: #ccc; +} +.hide-scroll-bar::-webkit-scrollbar { + display: none; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + width: 100%; + height: 122px; + flex-wrap: wrap; + padding-right: 24px; + padding-bottom: 12px; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper:hover > .day-tip-text-container { + visibility: visible; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + width: 24px; + height: 100%; + padding-bottom: 2px; + flex-wrap: wrap; + visibility: hidden; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container > .tip-text { + font-size: 10px; + line-height: 16px; + padding-right: 2px; + width: 100%; + text-align: right; + color: gray; + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map { + width: 192px; + height: 100%; + flex-wrap: wrap; + display: grid; + grid-template-rows: repeat(7, 1fr); + grid-template-columns: repeat(12, 1fr); + grid-auto-flow: column; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container { + display: block; + width: 13px; + height: 13px; + background-color: #eaeaea; + border-radius: 2px; + margin-bottom: 2px; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.null { + background-color: transparent; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L1-bg { + background-color: #9be9a8; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L2-bg { + background-color: #40c463; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L3-bg { + background-color: #30a14e; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L4-bg { + background-color: #216e39; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.today { + border: 1px solid black; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container { + position: absolute; + left: 0; + top: 0; + margin-left: 9px; + transform: translateX(-50%); + margin-top: -36px; + background-color: rgba(0, 0, 0, 0.8); + color: white; + padding: 6px 8px; + border-radius: 4px; + font-size: 12px; + line-height: 1.6; + z-index: 2; + user-select: none; + white-space: nowrap; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container > .date-text { + color: lightgray; +} +.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container::before { + content: ''; + position: absolute; + bottom: -4px; + left: calc(50% - 6px); + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid rgba(0, 0, 0, 0.8); +} +@media only screen and (max-width: 875px) { + .theme-light div[data-type='memos_view'] .usage-heat-map-wrapper { + height: 160px; + padding: 8px 0 !important; + padding-top: 12px !important; + } + .theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container { + visibility: visible; + width: 48px; + padding-bottom: 4px; + } + .theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container > .tip-text { + padding-right: 6px; + font-size: 12px; + line-height: unset !important; + } + .theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map { + width: 240px; + } + .theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container { + width: 16px; + height: 16px; + margin-bottom: 4px; + } + .theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container { + margin-top: -32px; + margin-left: 16px; + font-size: 10px; + } + .theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container::before { + left: calc(50% - 4px); + } +} +.theme-light div[data-type='memos_view'].mobile-view .usage-heat-map-wrapper { + height: 160px; + padding: 8px 0 !important; + padding-top: 12px !important; +} +.theme-light div[data-type='memos_view'].mobile-view .usage-heat-map-wrapper > .day-tip-text-container { + visibility: visible; + width: 48px; + padding-bottom: 4px; +} +.theme-light div[data-type='memos_view'].mobile-view .usage-heat-map-wrapper > .day-tip-text-container > .tip-text { + padding-right: 6px; + font-size: 12px; + line-height: unset !important; +} +.theme-light div[data-type='memos_view'].mobile-view .usage-heat-map-wrapper > .usage-heat-map { + width: 240px; +} +.theme-light div[data-type='memos_view'].mobile-view .usage-heat-map-wrapper > .usage-heat-map > .stat-container { + width: 16px; + height: 16px; + margin-bottom: 4px; +} +.theme-light div[data-type='memos_view'].mobile-view .usage-heat-map-wrapper > .usage-detail-container { + margin-top: -32px; + margin-left: 16px; + font-size: 10px; +} +.theme-light div[data-type='memos_view'].mobile-view .usage-heat-map-wrapper > .usage-detail-container::before { + left: calc(50% - 4px); +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + width: 100%; + height: 122px; + flex-wrap: wrap; + padding-right: 24px; + padding-bottom: 12px; +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper:hover > .day-tip-text-container { + visibility: visible; +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + width: 24px; + height: 100%; + padding-bottom: 2px; + flex-wrap: wrap; + visibility: hidden; +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container > .tip-text { + font-size: 10px; + line-height: 16px; + padding-right: 2px; + width: 100%; + text-align: right; + color: gray; + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map { + width: 192px; + height: 100%; + flex-wrap: wrap; + display: grid; + grid-template-rows: repeat(7, 1fr); + grid-template-columns: repeat(12, 1fr); + grid-auto-flow: column; +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container { + display: block; + width: 13px; + height: 13px; + background-color: #d8d8d8; + border-radius: 2px; + margin-bottom: 2px; +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.null { + background-color: transparent; +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L1-bg { + background-color: #f75205; +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L2-bg { + background-color: #e03a07; +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L3-bg { + background-color: #bf2104; +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L4-bg { + background-color: #940b01; +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.today { + border: 1px solid #ffffff; +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container { + position: absolute; + left: 0; + top: 0; + margin-left: 9px; + transform: translateX(-50%); + margin-top: -36px; + background-color: rgba(0, 0, 0, 0.8); + color: white; + padding: 6px 8px; + border-radius: 4px; + font-size: 12px; + line-height: 1.6; + z-index: 2; + user-select: none; + white-space: nowrap; +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container > .date-text { + color: lightgray; +} +.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container::before { + content: ''; + position: absolute; + bottom: -4px; + left: calc(50% - 6px); + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid rgba(0, 0, 0, 0.8); +} +@media only screen and (max-width: 875px) { + .theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper { + height: 160px; + padding: 8px 0 !important; + padding-top: 12px !important; + } + .theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container { + visibility: visible; + width: 48px; + padding-bottom: 4px; + } + .theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container > .tip-text { + padding-right: 6px; + font-size: 12px; + line-height: unset !important; + } + .theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map { + width: 240px; + } + .theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container { + width: 16px; + height: 16px; + margin-bottom: 4px; + } + .theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container { + margin-top: -32px; + margin-left: 16px; + font-size: 10px; + } + .theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container::before { + left: calc(50% - 4px); + } +} +.theme-dark div[data-type='memos_view'].mobile-view .usage-heat-map-wrapper { + height: 160px; + padding: 8px 0 !important; + padding-top: 12px !important; +} +.theme-dark div[data-type='memos_view'].mobile-view .usage-heat-map-wrapper > .day-tip-text-container { + visibility: visible; + width: 48px; + padding-bottom: 4px; +} +.theme-dark div[data-type='memos_view'].mobile-view .usage-heat-map-wrapper > .day-tip-text-container > .tip-text { + padding-right: 6px; + font-size: 12px; + line-height: unset !important; +} +.theme-dark div[data-type='memos_view'].mobile-view .usage-heat-map-wrapper > .usage-heat-map { + width: 240px; +} +.theme-dark div[data-type='memos_view'].mobile-view .usage-heat-map-wrapper > .usage-heat-map > .stat-container { + width: 16px; + height: 16px; + margin-bottom: 4px; +} +.theme-dark div[data-type='memos_view'].mobile-view .usage-heat-map-wrapper > .usage-detail-container { + margin-top: -32px; + margin-left: 16px; + font-size: 10px; +} +.theme-dark div[data-type='memos_view'].mobile-view .usage-heat-map-wrapper > .usage-detail-container::before { + left: calc(50% - 4px); +} +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.hide-scroll-bar { + scrollbar-width: none; +} +.hide-scroll-bar::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; +} +.hide-scroll-bar::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; +} +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { + background-color: #ccc; +} +.hide-scroll-bar::-webkit-scrollbar { + display: none; +} +.theme-light .memos-sidebar-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 240px; + height: 100%; + padding: 16px 0; + overflow-x: hidden; + overflow-y: auto; + flex-shrink: 0; + scrollbar-width: none; +} +.theme-light .memos-sidebar-wrapper::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; +} +.theme-light .memos-sidebar-wrapper::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; +} +.theme-light .memos-sidebar-wrapper::-webkit-scrollbar-thumb:hover { + background-color: #ccc; +} +.theme-light .memos-sidebar-wrapper::-webkit-scrollbar { + display: none; +} +.theme-light .memos-sidebar-wrapper > * { + flex-shrink: 0; +} +.theme-light .memos-sidebar-wrapper-display, +.theme-dark .memos-sidebar-wrapper-display { + display: none; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 240px; + height: 100%; + padding: 16px 0; + overflow-x: hidden; + overflow-y: auto; + flex-shrink: 0; +} +.mobile-show-sidebar .mobile-view #page-wrapper > .memos-sidebar-wrapper { + transform: translateX(0); + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); +} +.theme-light .mobile-view .memos-sidebar-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + z-index: 99; + position: absolute; + top: 0; + left: 0; + width: 320px; + height: 100%; + padding: 0; + background-color: white; + transition: all 0.4s ease; + transform: translateX(-320px); +} +.theme-light .mobile-view .memos-sidebar-wrapper > * { + width: 320px; + max-width: 95%; + flex-shrink: 0; + padding-left: 32px; +} +.theme-dark .memos-sidebar-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 240px; + height: 100%; + padding: 16px 0; + overflow-x: hidden; + overflow-y: auto; + flex-shrink: 0; + scrollbar-width: none; +} +.theme-dark .memos-sidebar-wrapper::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; +} +.theme-dark .memos-sidebar-wrapper::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; +} +.theme-dark .memos-sidebar-wrapper::-webkit-scrollbar-thumb:hover { + background-color: #ccc; +} +.theme-dark .memos-sidebar-wrapper::-webkit-scrollbar { + display: none; +} +.theme-dark .memos-sidebar-wrapper > * { + flex-shrink: 0; +} +.theme-dark .mobile-view .memos-sidebar-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + z-index: 99; + position: absolute; + top: 0; + left: 0; + width: 320px; + height: 100%; + padding: 0; + background-color: #000000; + transition: all 0.4s ease; + transform: translateX(-320px); +} +.theme-dark .mobile-view .memos-sidebar-wrapper > * { + width: 320px; + max-width: 95%; + flex-shrink: 0; + padding-left: 32px; +} +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.hide-scroll-bar { + scrollbar-width: none; +} +.hide-scroll-bar::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; +} +.hide-scroll-bar::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; +} +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { + background-color: #ccc; +} +.hide-scroll-bar::-webkit-scrollbar { + display: none; +} +div[data-type='memos_view'] #root { + background-color: #f6f5f4; +} +div[data-type='memos_view'] .view-content { + overflow-y: hidden; +} +div[data-type='memos_view'] #page-wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + width: 848px; + max-width: 100%; + height: 100%; + margin: auto; + transform: translateX(-16px); + margin-top: -15px; +} +div[data-type='memos_view'] #page-wrapper > .content-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + position: relative; + margin-top: 15px; + padding-left: 10px; + width: 600px; + height: 100%; + gap: 8px; +} +div[data-type='memos_view'] #page-wrapper > .content-wrapper-padding-fix { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + position: relative; + margin-top: 0px; + width: 600px; + height: 100%; + overflow-y: hidden; + padding-left: 34px; + gap: 8px; +} +div[data-type='memos_view'].mobile-view body.mobile-show-sidebar #page-wrapper > .content-wrapper { + transform: translateX(320px); +} +div[data-type='memos_view'].mobile-view #page-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 100%; + height: 100%; + padding: 0; + transform: translateX(0); + margin-top: -10px; +} +div[data-type='memos_view'].mobile-view #page-wrapper > .content-wrapper { + width: 100%; + height: 100%; + margin-left: 0; + padding-top: 0; + transition: all 0.4s ease; + transform: translateX(0); +} +.workspace-leaf-content[data-type="memos_view"] .react-transform-wrapper { + overflow: unset; +} +.Control-box { + position: absolute; + display: flex; + justify-content: center; + left: 50%; + margin-bottom: 10px; + height: 40px; + z-index: 20; +} +.Control-box .button { + margin-left: 10px; + width: 2em; +} +.controlPanel { + position: absolute; + z-index: 2; + transform: translate(10px, 10px); + max-width: calc(100% - 20px); +} +.controlBtn { + padding: 6px 12px; + background: white; + border: 1px solid grey; + border-radius: 5px; + margin-right: 10px; + font-size: 12px; + text-transform: uppercase; + font-weight: 600; + cursor: pointer; +} +.controlBtn:focus { + filter: brightness(90%); +} +.controlBtn:hover { + filter: brightness(120%); +} +.controlBtn:active { + opacity: 0.9; +} +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.hide-scroll-bar { + scrollbar-width: none; +} +.hide-scroll-bar::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; +} +.hide-scroll-bar::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; +} +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { + background-color: #ccc; +} +.hide-scroll-bar::-webkit-scrollbar { + display: none; +} +.theme-light div[data-type='memos_view'] .memo-editor-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + position: relative; + width: 100%; + height: auto; + background-color: white; + padding: 16px; + border-radius: 8px; + border: 2px solid #e4e4e4; +} +.theme-light div[data-type='memos_view'] .memo-editor-wrapper.edit-ing { + border-color: #5783f7; +} +.theme-light div[data-type='memos_view'] .memo-editor-wrapper > .tip-text { + font-size: 12px; + line-height: 20px; + margin-top: 0px; + color: #cac8c4; +} +.theme-light div[data-type='memos_view'] .memo-editor-wrapper > .memo-editor { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + position: relative; + width: 100%; + height: auto; + background-color: white; +} +.theme-light div[data-type='memos_view'] .memo-editor-wrapper > .date-picker { + position: absolute; + z-index: 20; +} +.theme-light div[data-type='memos_view'].mobile-view .memo-editor-wrapper { + width: calc(100% - 24px); + margin: auto; +} +.theme-light .mobile-view img.memo-show-editor-button { + position: fixed; + z-index: 10; + filter: opacity(30%); +} +.theme-dark div[data-type='memos_view'] .memo-editor-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + position: relative; + width: 100%; + height: auto; + background-color: #3b3b3b; + padding: 16px; + border-radius: 8px; + border: 2px solid #353535; +} +.theme-dark div[data-type='memos_view'] .memo-editor-wrapper.edit-ing { + border-color: #3c3c3c; +} +.theme-dark div[data-type='memos_view'] .memo-editor-wrapper > .tip-text { + font-size: 12px; + line-height: 20px; + margin-top: 0px; + color: #5e5b56; +} +.theme-dark div[data-type='memos_view'] .memo-editor-wrapper > .memo-editor { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + position: relative; + width: 100%; + height: auto; + background-color: #383838; +} +.theme-dark div[data-type='memos_view'] .memo-editor-wrapper > .date-picker { + position: absolute; + z-index: 20; +} +.theme-dark div[data-type='memos_view'].mobile-view .memo-editor-wrapper { + width: calc(100% - 24px); + margin: auto; +} +.theme-dark .mobile-view img.memo-show-editor-button { + position: fixed; + z-index: 10; + transition: visibility 0s linear 0.5s, opacity 0.5s linear; + filter: invert(0.8) opacity(65%); +} +:root { + --rdp-cell-size: 40px; + --rdp-accent-color: #0000ff; + --rdp-background-color: #e7edff; + /* Switch to dark colors for dark themes */ + --rdp-accent-color-dark: #3003e1; + --rdp-background-color-dark: #180270; + /* Outline border for focused elements */ + --rdp-outline: 2px solid var(--rdp-accent-color); + /* Outline border for focused and selected elements */ + --rdp-outline-selected: 2px solid rgba(0, 0, 0, 0.75); + --rdp-dark-cell-size: 40px; + --rdp-dark-accent-color: #494949; + --rdp-dark-background-color: #838383; + /* Switch to dark colors for dark themes */ + --rdp-dark-accent-color-dark: #050505; + --rdp-dark-background-color-dark: #7e7e7e; + /* Outline border for focused elements */ + --rdp-dark-outline: 2px solid var(--rdp-accent-color); + /* Outline border for focused and selected elements */ + --rdp-dark-outline-selected: 2px solid rgba(255, 255, 255, 0.75); +} +.theme-light .rdp { + margin: 1em; + border-style: solid; + border-width: 1px; + border-color: #9b9b9b; + overflow: auto; +} +/* Hide elements for devices that are not screen readers */ +.rdp-vhidden { + box-sizing: border-box; + padding: 0; + margin: 0; + background: transparent; + border: 0; + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + position: absolute !important; + top: 0; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + overflow: hidden !important; + clip: rect(1px, 1px, 1px, 1px) !important; + border: 0 !important; +} +/* Buttons */ +.rdp-button_reset { + appearance: none; + position: relative; + margin: 0; + padding: 0; + cursor: default; + color: inherit; + outline: none; + background: none; + font: inherit; + -moz-appearance: none; + -webkit-appearance: none; +} +.rdp-button { + border: 2px solid transparent; +} +.rdp-button[disabled] { + opacity: 0.25; +} +.rdp-button:not([disabled]) { + cursor: pointer; +} +.rdp-button:focus:not([disabled]), +.rdp-button:active:not([disabled]) { + color: inherit; + border: var(--rdp-outline); + background-color: var(--rdp-background-color); +} +.rdp-button:hover:not([disabled]) { + background-color: var(--rdp-background-color); +} +.rdp-months { + display: flex; + background: white; + padding: 4px; +} +.rdp-month { + margin: 0 1em; +} +.rdp-month:first-child { + margin-left: 0; +} +.rdp-month:last-child { + margin-right: 0; +} +.rdp-table { + margin: 0; + max-width: calc(var(--rdp-cell-size) * 7); + border-collapse: collapse; +} +.rdp-with_weeknumber .rdp-table { + max-width: calc(var(--rdp-cell-size) * 8); + border-collapse: collapse; +} +.rdp-caption { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0; + text-align: left; +} +.rdp-multiple_months .rdp-caption { + position: relative; + display: block; + text-align: center; +} +.rdp-caption_dropdowns { + position: relative; + display: inline-flex; +} +.rdp-caption_label { + position: relative; + z-index: 1; + display: inline-flex; + align-items: center; + margin: 0; + padding: 0 0.25em; + white-space: nowrap; + color: currentColor; + border: 0; + border: 2px solid transparent; + font-family: inherit; + font-size: 140%; + font-weight: bold; +} +.rdp-nav { + white-space: nowrap; +} +.rdp-multiple_months .rdp-caption_start .rdp-nav { + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); +} +.rdp-multiple_months .rdp-caption_end .rdp-nav { + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); +} +.rdp-nav_button { + display: inline-flex; + align-items: center; + justify-content: center; + width: var(--rdp-cell-size); + height: var(--rdp-cell-size); + padding: 0.25em; + border-radius: 100%; +} +/* ---------- */ +/* Dropdowns */ +/* ---------- */ +.rdp-dropdown_year, +.rdp-dropdown_month { + position: relative; + display: inline-flex; + align-items: center; +} +.rdp-dropdown { + appearance: none; + position: absolute; + z-index: 2; + top: 0; + bottom: 0; + left: 0; + width: 100%; + margin: 0; + padding: 0; + cursor: inherit; + opacity: 0; + border: none; + background-color: transparent; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +.rdp-dropdown[disabled] { + opacity: unset; + color: unset; +} +.rdp-dropdown:focus:not([disabled]) + .rdp-caption_label, +.rdp-dropdown:active:not([disabled]) + .rdp-caption_label { + border: var(--rdp-outline); + border-radius: 6px; + background-color: var(--rdp-background-color); +} +.rdp-dropdown_icon { + margin: 0 0 0 5px; +} +.rdp-head { + border: 0; +} +.rdp-head_row, +.rdp-row { + height: 100%; +} +.rdp-head_cell { + vertical-align: middle; + text-transform: uppercase; + font-size: 0.75em; + font-weight: 700; + text-align: center; + height: 100%; + height: var(--rdp-cell-size); + padding: 0; +} +.rdp-tbody { + border: 0; } -.theme-dark div[data-type='memos_view'] .user-banner-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - height: 160px; +.rdp-foot { + margin: 0.5em; } -.theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container { +.rdp-cell { + width: var(--rdp-cell-size); + height: 100%; + height: var(--rdp-cell-size); + padding: 0; + text-align: center; +} +.rdp-weeknumber { + font-size: 0.75em; +} +.rdp-weeknumber, +.rdp-day { display: flex; - flex-direction: row; - justify-content: space-between; + overflow: hidden; align-items: center; - width: 100%; - padding: 0 24px; - flex-wrap: nowrap; - margin-bottom: 4px; + justify-content: center; + box-sizing: border-box; + width: var(--rdp-cell-size); + max-width: var(--rdp-cell-size); + height: var(--rdp-cell-size); + margin: 0; + border: 2px solid transparent; + border-radius: 100%; } -.theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .username-text { - max-width: calc(100% - 32px); +.rdp-day_today:not(.rdp-day_outside) { font-weight: bold; - font-size: 18px; - line-height: 36px; - color: #d2d1cd; - overflow: hidden; - text-overflow: ellipsis; - cursor: pointer; - margin-right: auto; - flex-shrink: 0; } -.theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn { - flex-shrink: 0; - user-select: none; - border: none; - background-color: unset; +.rdp-day_selected:not([disabled]), +.rdp-day_selected:focus:not([disabled]), +.rdp-day_selected:active:not([disabled]), +.rdp-day_selected:hover:not([disabled]) { + color: white; + background-color: var(--rdp-accent-color); } -.theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn.menu-popup-btn { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - width: 36px; - height: 40px; - margin-right: -8px; - cursor: pointer; +.rdp-day_selected:focus:not([disabled]) { + border: var(--rdp-outline-selected); } -.theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn.menu-popup-btn > .icon-img { - width: 20px; - height: auto; - filter: invert(1); +.rdp:not([dir='rtl']) .rdp-day_range_start:not(.rdp-day_range_end) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } -.theme-dark div[data-type='memos_view'] .user-banner-container > .status-text-container { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: flex-start; - padding: 0 24px; - width: 100%; - user-select: none; +.rdp:not([dir='rtl']) .rdp-day_range_end:not(.rdp-day_range_start) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } -.theme-dark div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; +.rdp[dir='rtl'] .rdp-day_range_start:not(.rdp-day_range_end) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } -.theme-dark div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .amount-text { - font-weight: bold; - font-size: 28px; - line-height: 1.8; - color: #d2d1cd; - opacity: 0.8; +.rdp[dir='rtl'] .rdp-day_range_end:not(.rdp-day_range_start) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } -.theme-dark div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .type-text { - color: #ececec; - font-size: 12px; - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.rdp-day_range_end.rdp-day_range_start { + border-radius: 100%; } -@media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .user-banner-container { - height: 170px; - z-index: 1; - padding-top: 16px !important; - } - .theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container { - padding: 0 16px; - } - .theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .action-btn { - width: 60px; - } - .theme-dark div[data-type='memos_view'] .user-banner-container > .userinfo-header-container > .username-text { - font-size: 22px; - } - .theme-dark div[data-type='memos_view'] .user-banner-container > .status-text-container { - padding: 0 16px; - } - .theme-dark div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .amount-text { - font-size: 32px; - } - .theme-dark div[data-type='memos_view'] .user-banner-container > .status-text-container > .status-text > .type-text { - font-size: 14px; - } +.rdp-day_range_middle { + border-radius: 0; } -.mono-font-family { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-dark .rdp { + margin: 1em; + border-style: solid; + border-width: 1px; + border-color: #9b9b9b; + overflow: auto; + color: #dddddd; + /* Hide elements for devices that are not screen readers */ + /* Buttons */ + /* ---------- */ + /* Dropdowns */ + /* ---------- */ } -.hide-scroll-bar { - scrollbar-width: none; +.theme-dark .rdp .rdp-vhidden { + box-sizing: border-box; + padding: 0; + margin: 0; + background: transparent; + border: 0; + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + position: absolute !important; + top: 0; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + overflow: hidden !important; + clip: rect(1px, 1px, 1px, 1px) !important; + border: 0 !important; } -.hide-scroll-bar::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; +.theme-dark .rdp .rdp-button_reset { + appearance: none; + position: relative; + margin: 0; + padding: 0; + cursor: default; + color: inherit; + outline: none; + background: none; + font: inherit; + -moz-appearance: none; + -webkit-appearance: none; } -.hide-scroll-bar::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; +.theme-dark .rdp .rdp-button { + border: 2px solid transparent; } -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-dark .rdp .rdp-button[disabled] { + opacity: 0.25; } -.hide-scroll-bar::-webkit-scrollbar { - display: none; +.theme-dark .rdp .rdp-button:not([disabled]) { + cursor: pointer; } -.theme-light .selector-wrapper { +.theme-dark .rdp .rdp-button:focus:not([disabled]), +.theme-dark .rdp .rdp-button:active:not([disabled]) { + color: inherit; + border: var(--rdp-dark-outline); + background-color: var(--rdp-dark-background-color); +} +.theme-dark .rdp .rdp-button:hover:not([disabled]) { + background-color: var(--rdp-dark-background-color); +} +.theme-dark .rdp .rdp-months { display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - position: relative; - height: 28px; + background: #252525; + padding: 4px; } -.theme-light .selector-wrapper > .current-value-container { +.theme-dark .rdp .rdp-month { + margin: 0 1em; +} +.theme-dark .rdp .rdp-month:first-child { + margin-left: 0; +} +.theme-dark .rdp .rdp-month:last-child { + margin-right: 0; +} +.theme-dark .rdp .rdp-table { + margin: 0; + max-width: calc(var(--rdp-dark-cell-size) * 7); + border-collapse: collapse; +} +.theme-dark .rdp .rdp-with_weeknumber .rdp-table { + max-width: calc(var(--rdp-dark-cell-size) * 8); + border-collapse: collapse; +} +.theme-dark .rdp .rdp-caption { display: flex; - flex-direction: row; - justify-content: space-between; align-items: center; - width: 100%; - height: 100%; - border: 1px solid #e4e4e4; - border-radius: 4px; - padding: 0 8px; - padding-right: 4px; - background-color: white; - cursor: pointer; - user-select: none; + justify-content: space-between; + padding: 0; + text-align: left; +} +.theme-dark .rdp .rdp-multiple_months .rdp-caption { + position: relative; + display: block; + text-align: center; } -.theme-light .selector-wrapper > .current-value-container:hover, -.theme-light .selector-wrapper > .current-value-container.active { - background-color: #f8f8f8; +.theme-dark .rdp .rdp-caption_dropdowns { + position: relative; + display: inline-flex; } -.theme-light .selector-wrapper > .current-value-container > .value-text { - margin-right: 0px; - font-size: 13px; - line-height: 32px; +.theme-dark .rdp .rdp-caption_label { + position: relative; + z-index: 1; + display: inline-flex; + align-items: center; + margin: 0; + padding: 0 0.25em; white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - width: calc(100% - 20px); + color: currentColor; + border: 0; + border: 2px solid transparent; + font-family: inherit; + font-size: 140%; + font-weight: bold; } -.theme-light .selector-wrapper > .current-value-container > .arrow-text { - display: flex; - flex-direction: row; - justify-content: center; +.theme-dark .rdp .rdp-nav { + white-space: nowrap; +} +.theme-dark .rdp .rdp-multiple_months .rdp-caption_start .rdp-nav { + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); +} +.theme-dark .rdp .rdp-multiple_months .rdp-caption_end .rdp-nav { + position: absolute; + top: 50%; + right: 0; + transform: translateY(-50%); +} +.theme-dark .rdp .rdp-nav_button { + display: inline-flex; align-items: center; - width: 16px; - flex-shrink: 0; + justify-content: center; + width: var(--rdp-dark-cell-size); + height: var(--rdp-dark-cell-size); + padding: 0.25em; + border-radius: 100%; } -.theme-light .selector-wrapper > .current-value-container > .arrow-text > .icon-img { - width: 16px; - height: auto; - opacity: 0.6; - transform: rotate(90deg); +.theme-dark .rdp .rdp-dropdown_year, +.theme-dark .rdp .rdp-dropdown_month { + position: relative; + display: inline-flex; + align-items: center; } -.theme-light .selector-wrapper > .items-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; +.theme-dark .rdp .rdp-dropdown { + appearance: none; position: absolute; - top: 100%; + z-index: 2; + top: 0; + bottom: 0; left: 0; - width: auto; - min-width: calc(100% + 16px); - max-height: 256px; - padding: 4px; - overflow: auto; - margin-top: 2px; - margin-left: -8px; - z-index: 1; - background-color: white; - border-radius: 8px; - box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); - scrollbar-width: none; + width: 100%; + margin: 0; + padding: 0; + cursor: inherit; + opacity: 0; + border: none; + background-color: transparent; + font-family: inherit; + font-size: inherit; + line-height: inherit; } -.theme-light .selector-wrapper > .items-wrapper::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; +.theme-dark .rdp .rdp-dropdown[disabled] { + opacity: unset; + color: unset; } -.theme-light .selector-wrapper > .items-wrapper::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; +.theme-dark .rdp .rdp-dropdown:focus:not([disabled]) + .rdp-caption_label, +.theme-dark .rdp .rdp-dropdown:active:not([disabled]) + .rdp-caption_label { + border: var(--rdp-dark-outline); + border-radius: 6px; + background-color: var(--rdp-dark-background-color); } -.theme-light .selector-wrapper > .items-wrapper::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-dark .rdp .rdp-dropdown_icon { + margin: 0 0 0 5px; } -.theme-light .selector-wrapper > .items-wrapper::-webkit-scrollbar { - display: none; +.theme-dark .rdp .rdp-head { + border: 0; } -.theme-light .selector-wrapper > .items-wrapper > .item-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - padding-left: 12px; - line-height: 30px; - white-space: nowrap; - font-size: 13px; - cursor: pointer; - border-radius: 4px; - user-select: none; +.theme-dark .rdp .rdp-head_row, +.theme-dark .rdp .rdp-row { + height: 100%; } -.theme-light .selector-wrapper > .items-wrapper > .item-container:hover { - background-color: #f8f8f8; +.theme-dark .rdp .rdp-head_cell { + vertical-align: middle; + text-transform: uppercase; + font-size: 0.75em; + font-weight: 700; + text-align: center; + height: 100%; + height: var(--rdp-dark-cell-size); + padding: 0; } -.theme-light .selector-wrapper > .items-wrapper > .item-container.selected { - color: #55bb8e; +.theme-dark .rdp .rdp-tbody { + border: 0; } -.theme-dark .selector-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - position: relative; - height: 28px; +.theme-dark .rdp .rdp-foot { + margin: 0.5em; } -.theme-dark .selector-wrapper > .current-value-container { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - width: 100%; +.theme-dark .rdp .rdp-cell { + width: var(--rdp-dark-cell-size); height: 100%; - border: 1px solid #353535; - border-radius: 4px; - padding: 0 8px; - padding-right: 4px; - background-color: #000000; - cursor: pointer; - user-select: none; -} -.theme-dark .selector-wrapper > .current-value-container:hover, -.theme-dark .selector-wrapper > .current-value-container.active { - background-color: #808080; + height: var(--rdp-dark-cell-size); + padding: 0; + text-align: center; } -.theme-dark .selector-wrapper > .current-value-container > .value-text { - margin-right: 0px; - font-size: 13px; - line-height: 32px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - width: calc(100% - 20px); +.theme-dark .rdp .rdp-weeknumber { + font-size: 0.75em; } -.theme-dark .selector-wrapper > .current-value-container > .arrow-text { +.theme-dark .rdp .rdp-weeknumber, +.theme-dark .rdp .rdp-day { display: flex; - flex-direction: row; - justify-content: center; + overflow: hidden; align-items: center; - width: 16px; - flex-shrink: 0; -} -.theme-dark .selector-wrapper > .current-value-container > .arrow-text > .icon-img { - width: 16px; - height: auto; - opacity: 0.6; - transform: rotate(90deg); + justify-content: center; + box-sizing: border-box; + width: var(--rdp-dark-cell-size); + max-width: var(--rdp-dark-cell-size); + height: var(--rdp-dark-cell-size); + margin: 0; + border: 2px solid transparent; + border-radius: 100%; } -.theme-dark .selector-wrapper > .items-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - position: absolute; - top: 100%; - left: 0; - width: auto; - min-width: calc(100% + 16px); - max-height: 256px; - padding: 4px; - overflow: auto; - margin-top: 2px; - margin-left: -8px; - z-index: 1; - background-color: #000000; - border-radius: 8px; - box-shadow: 0 0 8px 0 rgba(255, 255, 255, 0.2); - scrollbar-width: none; +.theme-dark .rdp .rdp-day_today:not(.rdp-day_outside) { + font-weight: bold; } -.theme-dark .selector-wrapper > .items-wrapper::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; +.theme-dark .rdp .rdp-day_selected:not([disabled]), +.theme-dark .rdp .rdp-day_selected:focus:not([disabled]), +.theme-dark .rdp .rdp-day_selected:active:not([disabled]), +.theme-dark .rdp .rdp-day_selected:hover:not([disabled]) { + color: white; + background-color: var(--rdp-dark-accent-color); } -.theme-dark .selector-wrapper > .items-wrapper::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; +.theme-dark .rdp .rdp-day_selected:focus:not([disabled]) { + border: var(--rdp-dark-outline-selected); } -.theme-dark .selector-wrapper > .items-wrapper::-webkit-scrollbar-thumb:hover { - background-color: #ccc; +.theme-dark .rdp .rdp:not([dir='rtl']) .rdp-day_range_start:not(.rdp-day_range_end) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } -.theme-dark .selector-wrapper > .items-wrapper::-webkit-scrollbar { - display: none; +.theme-dark .rdp .rdp:not([dir='rtl']) .rdp-day_range_end:not(.rdp-day_range_start) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } -.theme-dark .selector-wrapper > .items-wrapper > .item-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - padding-left: 12px; - line-height: 30px; - white-space: nowrap; - font-size: 13px; - cursor: pointer; - border-radius: 4px; - user-select: none; +.theme-dark .rdp .rdp[dir='rtl'] .rdp-day_range_start:not(.rdp-day_range_end) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } -.theme-dark .selector-wrapper > .items-wrapper > .item-container:hover { - background-color: #808080; +.theme-dark .rdp .rdp[dir='rtl'] .rdp-day_range_end:not(.rdp-day_range_start) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } -.theme-dark .selector-wrapper > .items-wrapper > .item-container.selected { - color: #d24c42; +.theme-dark .rdp .rdp-day_range_end.rdp-day_range_start { + border-radius: 100%; +} +.theme-dark .rdp .rdp-day_range_middle { + border-radius: 0; } .mono-font-family { font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; @@ -6371,318 +7312,454 @@ div[data-type='memos_view'] .preference-wrapper > .sections-wrapper > .section-c .hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-light .create-query-dialog > .dialog-container { - width: 420px; -} -.theme-light .create-query-dialog > .dialog-container > .dialog-content-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; +.theme-light div[data-type='memos_view'] .search-bar-container { + width: 160px; } -.theme-light .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container { +.theme-light div[data-type='memos_view'] .search-bar-container > .search-bar-inputer { display: flex; flex-direction: row; justify-content: flex-start; - align-items: flex-start; + align-items: center; + background-color: #fcfcfc; width: 100%; - margin-top: 8px; - padding: 4px 0; + height: 40px; + padding: 4px 16px; + border-radius: 8px; } -.theme-light .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .normal-text { - display: block; - flex-shrink: 0; - width: 40px; - margin-right: 12px; - text-align: right; - color: gray; - font-size: 13px; - line-height: 32px; +.theme-light div[data-type='memos_view'] .search-bar-container > .search-bar-inputer > .icon-img { + margin-right: 8px; + width: 14px; + height: auto; + opacity: 0.6; } -.theme-light .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .title-input { +.theme-light div[data-type='memos_view'] .search-bar-container > .search-bar-inputer > .text-input { width: 100%; - padding: 0 8px; - font-size: 13px; - line-height: 32px; - border-radius: 4px; - border: 1px solid #e4e4e4; - resize: none; + font-size: 15px; } -.theme-light .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .filters-wrapper { - width: calc(100% - 56px); +.theme-light div[data-type='memos_view'] .search-bar-container > .search-bar-inputer > .text-input:hover { + box-shadow: 0 0 0 1px var(--background-modifier-border-hover); +} +.theme-light div[data-type='memos_view'] .search-bar-container > .search-bar-inputer:hover + .quickly-action-wrapper { + display: flex; +} +.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper { + display: none; + position: absolute; + top: 52px; + right: -7px; + z-index: 12; + padding: 8px; + width: 320px; +} +.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; + width: 100%; + background-color: white; + padding: 8px 16px; + border-radius: 8px; + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); } -.theme-light .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .filters-wrapper > .create-filter-btn { - color: #55bb8e; - font-size: 13px; - line-height: 32px; - cursor: pointer; +.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .title-text { + color: gray; + font-size: 12px; } -.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container { +.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container { display: flex; flex-direction: row; - justify-content: space-between; - align-items: center; + justify-content: flex-start; + align-items: flex-start; width: 100%; - margin-top: 0; + font-size: 13px; + margin-top: 8px; } -.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container { +.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .section-text { + color: gray; + margin-right: 4px; + flex-shrink: 0; + line-height: 26px; +} +.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + flex-wrap: wrap; + user-select: none; +} +.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div { display: flex; flex-direction: row; justify-content: flex-start; align-items: center; + line-height: 26px; } -.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .tip-text { - font-size: 13px; - color: gray; - margin-right: 8px; - white-space: nowrap; +.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .type-item { + cursor: pointer; + padding: 0 4px; + border-radius: 6px; } -.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn { - padding: 6px 16px; - font-size: 13px; - border-radius: 4px; +.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .type-item:hover { + background-color: #f8f8f8; } -.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn:hover { - opacity: 0.8; +.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .type-item.selected { + background-color: #55bb8e; + color: white; } -.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn.disabled { +.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .split-text { color: lightgray; - cursor: not-allowed; + margin: 0 2px; } -.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn.save-btn { - background-color: #55bb8e; - color: white; +.theme-light div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper:hover { + display: flex; } -.theme-light .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn.save-btn.requesting { - cursor: wait; - opacity: 0.8; +.theme-light div[data-type='memos_view'].mobile-view .search-bar-container { + width: 120px; } -.theme-light .memo-filter-input-wrapper { +.theme-light div[data-type='memos_view'].mobile-view .search-bar-container > .search-bar-inputer { display: flex; flex-direction: row; justify-content: flex-start; align-items: center; - width: 100%; - margin-top: 8px; - flex-shrink: 0; -} -.theme-light .memo-filter-input-wrapper:first-of-type { - margin-top: 0; -} -.theme-light .memo-filter-input-wrapper > .selector-wrapper { - margin-right: 4px; - height: 34px; - flex-grow: 0; - flex-shrink: 0; -} -.theme-light .memo-filter-input-wrapper > .selector-wrapper.relation-selector { - width: 48px; - margin-left: -52px; -} -.theme-light .memo-filter-input-wrapper > .selector-wrapper.type-selector { - width: 62px; -} -.theme-light .memo-filter-input-wrapper > .selector-wrapper.operator-selector { - width: 62px; + background-color: #fcfcfc; + height: 40px; + padding: 4px 16px; + border-radius: 8px; + width: 120%; + margin-left: -35px; } -.theme-light .memo-filter-input-wrapper > .selector-wrapper.value-selector { - flex-grow: 1; - max-width: calc(100% - 152px); +.theme-light div[data-type='memos_view'].mobile-view .search-bar-container > .quickly-action-wrapper { + display: none; + position: absolute; + top: 42px; + right: -2px; + z-index: 12; + padding-right: 20px; + padding-left: 8px; + padding-top: 8px; + padding-bottom: 8px; + width: 320px; } -.theme-light .memo-filter-input-wrapper > input.value-inputer { - max-width: calc(100% - 152px); - height: 34px; - padding: 0 8px; - flex-shrink: 0; - flex-grow: 1; - margin-right: 4px; - border-radius: 4px; - border: 1px solid #e4e4e4; - background-color: transparent; +.theme-dark div[data-type='memos_view'] .search-bar-container { + width: 160px; } -.theme-light .memo-filter-input-wrapper > input.value-inputer:hover { - background-color: #f8f8f8; +.theme-dark div[data-type='memos_view'] .search-bar-container > .search-bar-inputer { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + background-color: #302e2e; + width: 100%; + height: 40px; + padding: 8px 16px; + border-radius: 8px; } -.theme-light .memo-filter-input-wrapper > .remove-btn { - width: 16px; +.theme-dark div[data-type='memos_view'] .search-bar-container > .search-bar-inputer > .icon-img { + margin-right: 8px; + width: 14px; height: auto; - cursor: pointer; opacity: 0.8; + fill: #cdcdcd; } -.theme-light .memo-filter-input-wrapper > .remove-btn:hover { - opacity: 0.6; +.theme-dark div[data-type='memos_view'] .search-bar-container > .search-bar-inputer > .text-input { + width: 100%; + font-size: 15px; + color: #d2d1cd; } -@media only screen and (max-width: 875px) { - .theme-light .dialog-wrapper.create-query-dialog { - padding: 24px 16px; - padding-top: 64px; - justify-content: unset; - overflow-x: hidden; - } - .theme-light .dialog-wrapper.create-query-dialog::-webkit-scrollbar { - display: none; - } +.theme-dark div[data-type='memos_view'] .search-bar-container > .search-bar-inputer:hover + .quickly-action-wrapper { + display: flex; } -.theme-dark .create-query-dialog > .dialog-container { - width: 420px; +.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper { + display: none; + position: absolute; + top: 52px; + right: -7px; + z-index: 12; + padding: 8px; + width: 320px; } -.theme-dark .create-query-dialog > .dialog-container > .dialog-content-container { +.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; + width: 100%; + background-color: #000000; + padding: 8px 16px; + border-radius: 8px; + margin-top: -8px; } -.theme-dark .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container { +.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .title-text { + color: #cccccc; + font-size: 12px; +} +.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container { display: flex; flex-direction: row; justify-content: flex-start; align-items: flex-start; width: 100%; + font-size: 13px; margin-top: 8px; - padding: 4px 0; } -.theme-dark .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .normal-text { - display: block; +.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .section-text { + color: #dfdfdf; + margin-right: 4px; flex-shrink: 0; - width: 40px; - margin-right: 12px; - text-align: right; - color: #afafaf; - font-size: 13px; - line-height: 32px; -} -.theme-dark .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .title-input { - width: 100%; - padding: 0 8px; - font-size: 13px; - line-height: 32px; - border-radius: 4px; - border: 1px solid #353535; - resize: none; + line-height: 26px; } -.theme-dark .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .filters-wrapper { - width: calc(100% - 56px); +.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container { display: flex; - flex-direction: column; + flex-direction: row; justify-content: flex-start; align-items: flex-start; + flex-wrap: wrap; + user-select: none; } -.theme-dark .create-query-dialog > .dialog-container > .dialog-content-container > .form-item-container > .filters-wrapper > .create-filter-btn { - color: #d24c42; - font-size: 13px; - line-height: 32px; - cursor: pointer; -} -.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container { +.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div { display: flex; flex-direction: row; - justify-content: space-between; + justify-content: flex-start; align-items: center; - width: 100%; - margin-top: 0; + line-height: 26px; } -.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container { +.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .type-item { + cursor: pointer; + padding: 0 4px; + border-radius: 6px; + color: #d2d1cd; +} +.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .type-item:hover { + background-color: #808080; +} +.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .type-item.selected { + background-color: #457560; + color: #000000; +} +.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper > .quickly-action-container > .types-container > .values-container > div .split-text { + color: #686868; + margin: 0 2px; +} +.theme-dark div[data-type='memos_view'] .search-bar-container > .quickly-action-wrapper:hover { + display: flex; +} +.theme-dark div[data-type='memos_view'].mobile-view .search-bar-container { + width: 120px; +} +.theme-dark div[data-type='memos_view'].mobile-view .search-bar-container > .search-bar-inputer { display: flex; flex-direction: row; justify-content: flex-start; align-items: center; + background-color: #302e2e; + height: 40px; + padding: 8px 16px; + border-radius: 8px; + width: 120%; + margin-left: -35px; } -.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .tip-text { - font-size: 13px; - color: #bbbbbb; +.theme-dark div[data-type='memos_view'].mobile-view .search-bar-container > .search-bar-inputer > .icon-img { margin-right: 8px; - white-space: nowrap; + width: 14px; + height: auto; + opacity: 0.8; + fill: #cdcdcd; } -.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn { - padding: 6px 16px; - font-size: 13px; - border-radius: 4px; +.theme-dark div[data-type='memos_view'].mobile-view .search-bar-container > .quickly-action-wrapper { + display: none; + position: absolute; + top: 42px; + right: -2px; + z-index: 2; + padding: 8px; + width: 320px; } -.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn:hover { - opacity: 0.8; +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; } -.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn.disabled { - color: #303030; - cursor: not-allowed; +.hide-scroll-bar { + scrollbar-width: none; } -.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn.save-btn { - background-color: #940b01; - color: #000000; +.hide-scroll-bar::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; } -.theme-dark .create-query-dialog > .dialog-container > .dialog-footer-container > .btns-container > .btn.save-btn.requesting { - cursor: wait; - opacity: 0.8; +.hide-scroll-bar::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-dark .memo-filter-input-wrapper { +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { + background-color: #ccc; +} +.hide-scroll-bar::-webkit-scrollbar { + display: none; +} +div[data-type='memos_view'] .section-header-container, +div[data-type='memos_view'] .memos-header-container { display: flex; flex-direction: row; - justify-content: flex-start; + justify-content: space-between; align-items: center; width: 100%; - margin-top: 8px; + height: 40px; + flex-wrap: nowrap; + margin-top: 16px; flex-shrink: 0; } -.theme-dark .memo-filter-input-wrapper:first-of-type { - margin-top: 0; +div[data-type='memos_view'] .section-header-container > .title-text, +div[data-type='memos_view'] .memos-header-container > .title-text { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + font-weight: bold; + font-size: 18px; + line-height: 40px; + color: #37352f; + margin-right: 8px; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 0; + cursor: pointer; } -.theme-dark .memo-filter-input-wrapper > .selector-wrapper { +div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, +div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 24px; + height: 24px; margin-right: 4px; - height: 34px; - flex-grow: 0; flex-shrink: 0; + background-color: unset; } -.theme-dark .memo-filter-input-wrapper > .selector-wrapper.relation-selector { - width: 48px; - margin-left: -52px; +div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, +div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { + width: 18px; + height: 18px; } -.theme-dark .memo-filter-input-wrapper > .selector-wrapper.type-selector { - width: 62px; +div[data-type='memos_view'] .section-header-container > .btns-container, +div[data-type='memos_view'] .memos-header-container > .btns-container { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; } -.theme-dark .memo-filter-input-wrapper > .selector-wrapper.operator-selector { - width: 62px; +div[data-type='memos_view'].mobile-view .section-header-container, +div[data-type='memos_view'].mobile-view .memos-header-container { + height: auto; + margin-top: 4px; + margin-bottom: 0; + padding: 0 12px; + padding-bottom: 8px; } -.theme-dark .memo-filter-input-wrapper > .selector-wrapper.value-selector { - flex-grow: 1; - max-width: calc(100% - 152px); +div[data-type='memos_view'].mobile-view .section-header-container > .title-text > .action-btn, +div[data-type='memos_view'].mobile-view .memos-header-container > .title-text > .action-btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 60px; + height: 24px; + margin-right: -8px; + margin-left: -20px; + flex-shrink: 0; + background-color: unset; } -.theme-dark .memo-filter-input-wrapper > input.value-inputer { - max-width: calc(100% - 152px); - height: 34px; - padding: 0 8px; +div[data-type='memos_view'].mobile-view .section-header-container > .title-text > .action-btn > .icon-img, +div[data-type='memos_view'].mobile-view .memos-header-container > .title-text > .action-btn > .icon-img { + width: 18px; + height: 18px; +} +.theme-dark div[data-type='memos_view'] .section-header-container, +.theme-dark div[data-type='memos_view'] .memos-header-container { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; + height: 40px; + flex-wrap: nowrap; + margin-top: 16px; flex-shrink: 0; - flex-grow: 1; - margin-right: 4px; - border-radius: 4px; - border: 1px solid #353535; - background-color: transparent; } -.theme-dark .memo-filter-input-wrapper > input.value-inputer:hover { - background-color: #808080; +.theme-dark div[data-type='memos_view'] .section-header-container > .title-text, +.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + font-weight: bold; + font-size: 18px; + line-height: 40px; + color: #d2d1cd; + margin-right: 8px; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 0; + cursor: pointer; +} +.theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, +.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 24px; + height: 24px; + margin-right: 4px; + flex-shrink: 0; + background-color: unset; +} +.theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, +.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { + width: 18px; + height: 18px; + fill: #cdcdcd; } -.theme-dark .memo-filter-input-wrapper > .remove-btn { - width: 16px; +.theme-dark div[data-type='memos_view'] .section-header-container > .btns-container, +.theme-dark div[data-type='memos_view'] .memos-header-container > .btns-container { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; +} +.theme-dark div[data-type='memos_view'].mobile-view .section-header-container, +.theme-dark div[data-type='memos_view'].mobile-view .memos-header-container { height: auto; - cursor: pointer; - opacity: 0.8; - filter: invert(0.8); + margin-top: 4px; + margin-bottom: 0; + padding: 0 12px; + padding-bottom: 8px; } -.theme-dark .memo-filter-input-wrapper > .remove-btn:hover { - opacity: 0.6; +.theme-dark div[data-type='memos_view'].mobile-view .section-header-container > .title-text, +.theme-dark div[data-type='memos_view'].mobile-view .memos-header-container > .title-text { + color: #d2d1cd; } -@media only screen and (max-width: 875px) { - .theme-dark .dialog-wrapper.create-query-dialog { - padding: 24px 16px; - padding-top: 64px; - justify-content: unset; - overflow-x: hidden; - } - .theme-dark .dialog-wrapper.create-query-dialog::-webkit-scrollbar { - display: none; - } +.theme-dark div[data-type='memos_view'].mobile-view .section-header-container > .title-text > .action-btn, +.theme-dark div[data-type='memos_view'].mobile-view .memos-header-container > .title-text > .action-btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 60px; + height: 24px; + margin-right: -8px; + margin-left: -20px; + flex-shrink: 0; + background-color: unset; +} +.theme-dark div[data-type='memos_view'].mobile-view .section-header-container > .title-text > .action-btn > .icon-img, +.theme-dark div[data-type='memos_view'].mobile-view .memos-header-container > .title-text > .action-btn > .icon-img { + width: 18px; + height: 18px; + fill: #cdcdcd; } .mono-font-family { font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; @@ -6707,1322 +7784,1028 @@ div[data-type='memos_view'] .preference-wrapper > .sections-wrapper > .section-c .hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-light div[data-type='memos_view'] .queries-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - padding: 0 8px; - height: auto; - flex-wrap: nowrap; - scrollbar-width: none; -} -.theme-light div[data-type='memos_view'] .queries-wrapper::-webkit-scrollbar { - width: 0; - height: 0; - cursor: pointer; -} -.theme-light div[data-type='memos_view'] .queries-wrapper::-webkit-scrollbar-thumb { - width: 0; - height: 0; - border-radius: 8px; - background-color: #d5d5d5; -} -.theme-light div[data-type='memos_view'] .queries-wrapper::-webkit-scrollbar-thumb:hover { - background-color: #ccc; -} -.theme-light div[data-type='memos_view'] .queries-wrapper::-webkit-scrollbar { - display: none; -} -.theme-light div[data-type='memos_view'] .queries-wrapper > .title-text { +.theme-light div[data-type='memos_view'] .filter-query-container { display: flex; flex-direction: row; justify-content: space-between; align-items: center; width: 100%; - padding: 4px 16px; - margin-bottom: 4px; -} -.theme-light div[data-type='memos_view'] .queries-wrapper > .title-text > * { - font-size: 12px; - line-height: 24px; - color: #37352f; - opacity: 0.5; - font-weight: bold; -} -.theme-light div[data-type='memos_view'] .queries-wrapper > .title-text > .btn { - display: none; - padding: 0 4px; - font-size: 18px; -} -.theme-light div[data-type='memos_view'] .queries-wrapper > .title-text:hover > .btn, -.theme-light div[data-type='memos_view'] .queries-wrapper > .title-text:active > .btn { - display: block; -} -.theme-light div[data-type='memos_view'] .queries-wrapper > .create-query-btn-container { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 100%; - margin-top: 8px; - margin-bottom: 12px; -} -.theme-light div[data-type='memos_view'] .queries-wrapper > .create-query-btn-container > .btn { - display: flex; - padding: 4px 8px; - border: 1px dashed #1337a3; - border-radius: 8px; + flex-wrap: wrap; + padding: 4px 12px; + padding-bottom: 4px; font-size: 13px; + line-height: 1.8; } -.theme-light div[data-type='memos_view'] .queries-wrapper > .create-query-btn-container > .btn:hover { - background-color: #1337a3; - color: white; -} -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container { +.theme-light div[data-type='memos_view'] .filter-query-container > .filter-query { display: flex; - flex-direction: column; + flex-direction: row; justify-content: flex-start; align-items: flex-start; - position: relative; - width: 100%; - height: auto; - flex-wrap: nowrap; - margin-bottom: 8px; } -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - width: 100%; - height: 40px; - padding: 0 16px; - margin-top: 4px; - border-radius: 8px; - font-size: 14px; - cursor: pointer; - flex-shrink: 0; - user-select: none; +.theme-light div[data-type='memos_view'] .filter-query-container > .filter-query > .tip-text { + padding: 2px 0; + margin-left: -6px; + margin-right: 3px; } -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container:hover { +.theme-light div[data-type='memos_view'] .filter-query-container > .filter-query > .filter-item-container { + padding: 2px 8px; + padding-left: 4px; + margin-right: 6px; + cursor: pointer; background-color: #e4e4e4; + border-radius: 4px; + max-width: 200px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container:hover > .btns-container { - display: flex; -} -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container.active { - background-color: #55bb8e !important; +.theme-light div[data-type='memos_view'] .filter-query-container > .filter-query > .filter-item-container > .icon-text { + letter-spacing: 2px; } -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container.active > .query-text-container { - font-weight: bold; +.theme-light div[data-type='memos_view'] .filter-query-container > .filter-query > .filter-item-container:hover { + text-decoration: line-through; } -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container.active > .query-text-container > * { - color: white; +.theme-light div[data-type='memos_view'] .filter-query-container > .copy-memo { + padding-right: 6px; } -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .query-text-container { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - max-width: calc(100% - 24px); - color: #37352f; - overflow: hidden; - text-overflow: ellipsis; - flex-shrink: 0; - line-height: 20px; +.theme-light div[data-type='memos_view'] .filter-query-container > .copy-memo > .icon-img { + width: 20px; + height: auto; } -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .query-text-container > .icon-text { - display: block; - width: 16px; - flex-shrink: 0; +.theme-light div[data-type='memos_view'] .filter-query-container > .copy-memo:hover { + opacity: 0.8; + filter: contrast(1) brightness(1) invert(0.5); } -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .query-text-container > .query-text { - flex-shrink: 0; +.theme-light div[data-type='memos_view'].mobile-view .filter-query-container { + padding-left: 20px; } -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container { +.theme-dark div[data-type='memos_view'] .filter-query-container { display: flex; flex-direction: row; - justify-content: flex-end; + justify-content: space-between; align-items: center; - display: none; + width: 100%; + flex-wrap: wrap; + padding: 4px 12px; + padding-bottom: 4px; + font-size: 13px; + line-height: 1.8; } -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btn { +.theme-dark div[data-type='memos_view'] .filter-query-container > .filter-query { display: flex; flex-direction: row; - justify-content: center; - align-items: center; - width: 24px; - height: 24px; - flex-shrink: 0; -} -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btn > .icon-img { - width: 18px; - height: auto; -} -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - position: absolute; - right: 0; - width: auto; - height: auto; - padding: 8px; - transform: translateY(60px); - z-index: 1; -} -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container { - display: flex; - flex-direction: column; justify-content: flex-start; align-items: flex-start; - width: 86px; - height: auto; - white-space: nowrap; - border-radius: 6px; - padding: 4px; - background-color: white; - box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); } -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn { - width: 100%; - padding: 6px 0; - padding-left: 12px; - border-radius: 4px; - font-size: 13px; - height: unset; - line-height: unset; - text-align: left; +.theme-dark div[data-type='memos_view'] .filter-query-container > .filter-query > .tip-text { + padding: 2px 0; + margin-left: -6px; + margin-right: 3px; + color: #d2d1cd; } -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn:hover { - background-color: #f8f8f8; +.theme-dark div[data-type='memos_view'] .filter-query-container > .filter-query > .filter-item-container { + padding: 2px 8px; + padding-left: 4px; + margin-right: 6px; + cursor: pointer; + background-color: #cacdcf; + border-radius: 4px; + max-width: 200px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn.delete-btn { - color: #d28653; +.theme-dark div[data-type='memos_view'] .filter-query-container > .filter-query > .filter-item-container > .icon-text { + letter-spacing: 2px; } -.theme-light div[data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn.delete-btn.final-confirm { - font-weight: bold; +.theme-dark div[data-type='memos_view'] .filter-query-container > .filter-query > .filter-item-container:hover { + text-decoration: line-through; } -@media only screen and (max-width: 875px) { - .theme-light div[data-type='memos_view'] .queries-container { - height: auto; - } - .theme-light div[data-type='memos_view'] .queries-container:last-child { - flex-grow: 1; - } - .theme-light div[data-type='memos_view'] .queries-container > .title-text { - font-size: 13px; - margin-bottom: 4px; - } - .theme-light div[data-type='memos_view'] .queries-container > .query-item-container { - font-size: 15px; - } +.theme-dark div[data-type='memos_view'] .filter-query-container > .copy-memo { + padding-right: 6px; } -.theme-dark [data-type='memos_view'] .queries-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - padding: 0 8px; +.theme-dark div[data-type='memos_view'] .filter-query-container > .copy-memo > .icon-img { + width: 20px; height: auto; - flex-wrap: nowrap; + opacity: 0.8; + fill: #cdcdcd; +} +.theme-dark div[data-type='memos_view'] .filter-query-container > .copy-memo:hover { + opacity: 0.8; + filter: contrast(1) brightness(1) invert(0.9); +} +.theme-dark div[data-type='memos_view'].mobile-view .filter-query-container { + padding-left: 20px; +} +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.hide-scroll-bar { scrollbar-width: none; } -.theme-dark [data-type='memos_view'] .queries-wrapper::-webkit-scrollbar { +.hide-scroll-bar::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.theme-dark [data-type='memos_view'] .queries-wrapper::-webkit-scrollbar-thumb { +.hide-scroll-bar::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.theme-dark [data-type='memos_view'] .queries-wrapper::-webkit-scrollbar-thumb:hover { +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.theme-dark [data-type='memos_view'] .queries-wrapper::-webkit-scrollbar { - display: none; -} -.theme-dark [data-type='memos_view'] .queries-wrapper > .title-text { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - width: 100%; - padding: 4px 16px; - margin-bottom: 4px; -} -.theme-dark [data-type='memos_view'] .queries-wrapper > .title-text > * { - font-size: 12px; - line-height: 24px; - color: #d2d1cd; - opacity: 0.5; - font-weight: bold; -} -.theme-dark [data-type='memos_view'] .queries-wrapper > .title-text > .btn { +.hide-scroll-bar::-webkit-scrollbar { display: none; - padding: 0 4px; - font-size: 18px; -} -.theme-dark [data-type='memos_view'] .queries-wrapper > .title-text:hover > .btn, -.theme-dark [data-type='memos_view'] .queries-wrapper > .title-text:active > .btn { - display: block; -} -.theme-dark [data-type='memos_view'] .queries-wrapper > .create-query-btn-container { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 100%; - margin-top: 8px; - margin-bottom: 12px; -} -.theme-dark [data-type='memos_view'] .queries-wrapper > .create-query-btn-container > .btn { - display: flex; - padding: 4px 8px; - border: 1px dashed #2c395a; - border-radius: 8px; - font-size: 13px; -} -.theme-dark [data-type='memos_view'] .queries-wrapper > .create-query-btn-container > .btn:hover { - background-color: #2c395a; - color: white; } -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container { +.theme-light div[data-type='memos_view'] .memolist-wrapper { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - position: relative; + flex-grow: 1; width: 100%; - height: auto; - flex-wrap: nowrap; - margin-bottom: 8px; + overflow-y: scroll; + gap: 8px; + scrollbar-width: none; } -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - width: 100%; - height: 40px; - padding: 0 16px; - margin-top: 4px; - border-radius: 8px; - font-size: 14px; +.theme-light div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar { + width: 0; + height: 0; cursor: pointer; - flex-shrink: 0; - user-select: none; -} -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container:hover { - background-color: #353535; -} -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container:hover > .btns-container { - display: flex; } -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container.active { - background-color: #940b01 !important; +.theme-light div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container.active > .query-text-container { - font-weight: bold; +.theme-light div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container.active > .query-text-container > * { - color: #727272; +.theme-light div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar { + display: none; } -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .query-text-container { +.theme-light div[data-type='memos_view'] .memolist-wrapper > .status-text-container { display: flex; - flex-direction: row; + flex-direction: column; justify-content: flex-start; align-items: center; - max-width: calc(100% - 24px); - color: #37352f; - overflow: hidden; - text-overflow: ellipsis; - flex-shrink: 0; - line-height: 20px; -} -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .query-text-container > .icon-text { - display: block; - width: 16px; - flex-shrink: 0; - color: #d2d1cd; + width: 100%; + margin-top: 16px; + margin-bottom: 16px; } -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .query-text-container > .query-text { - flex-shrink: 0; - color: #d2d1cd; +.theme-light div[data-type='memos_view'] .memolist-wrapper > .status-text-container.completed { + margin-bottom: 64px; } -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container { - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: center; - display: none; +.theme-light div[data-type='memos_view'] .memolist-wrapper > .status-text-container.invisible { + visibility: hidden; } -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 24px; - height: 24px; - flex-shrink: 0; +.theme-light div[data-type='memos_view'] .memolist-wrapper > .status-text-container > .status-text { + font-size: 13px; + color: gray; } -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btn > .icon-img { - width: 18px; - height: auto; +.theme-light div[data-type='memos_view'] .memolist-wrapper.completed { + padding-bottom: 80px; } -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - position: absolute; - right: 0; - width: auto; - height: auto; - padding: 8px; - transform: translateY(60px); - z-index: 1; +div[data-type='memos_view'].mobile-view .memolist-wrapper { + padding: 0 12px; } -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container { +.theme-dark div[data-type='memos_view'] .memolist-wrapper { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - width: 86px; - height: auto; - white-space: nowrap; - border-radius: 6px; - padding: 4px; - background-color: #646464; - box-shadow: 0 0 8px 0 rgba(187, 187, 187, 0.2); -} -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn { + flex-grow: 1; width: 100%; - padding: 6px 0; - padding-left: 12px; - border-radius: 4px; - font-size: 13px; - height: unset; - line-height: unset; - text-align: left; -} -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn:hover { - background-color: #808080; -} -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn.delete-btn { - color: #940b01; -} -.theme-dark [data-type='memos_view'] .queries-wrapper > .queries-container > .query-item-container > .btns-container > .action-btns-wrapper > .action-btns-container > .btn.delete-btn.final-confirm { - font-weight: bold; -} -@media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .queries-container { - height: auto; - } - .theme-dark div[data-type='memos_view'] .queries-container:last-child { - flex-grow: 1; - } - .theme-dark div[data-type='memos_view'] .queries-container > .title-text { - font-size: 13px; - margin-bottom: 4px; - } - .theme-dark div[data-type='memos_view'] .queries-container > .query-item-container { - font-size: 15px; - } -} -.mono-font-family { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; -} -.hide-scroll-bar { + overflow-y: scroll; + gap: 8px; scrollbar-width: none; } -.hide-scroll-bar::-webkit-scrollbar { +.theme-dark div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.hide-scroll-bar::-webkit-scrollbar-thumb { +.theme-dark div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { +.theme-dark div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.hide-scroll-bar::-webkit-scrollbar { +.theme-dark div[data-type='memos_view'] .memolist-wrapper::-webkit-scrollbar { display: none; } -.theme-light div[data-type='memos_view'] .tags-wrapper { +.theme-dark div[data-type='memos_view'] .memolist-wrapper > .status-text-container { display: flex; flex-direction: column; justify-content: flex-start; - align-items: flex-start; + align-items: center; width: 100%; - padding: 0 8px; - height: auto; - flex-wrap: nowrap; - padding-bottom: 16px; - flex-grow: 1; + margin-top: 16px; + margin-bottom: 16px; +} +.theme-dark div[data-type='memos_view'] .memolist-wrapper > .status-text-container.completed { + margin-bottom: 64px; +} +.theme-dark div[data-type='memos_view'] .memolist-wrapper > .status-text-container.invisible { + visibility: hidden; +} +.theme-dark div[data-type='memos_view'] .memolist-wrapper > .status-text-container > .status-text { + font-size: 13px; + color: #ffffff; +} +.theme-dark div[data-type='memos_view'] .memolist-wrapper.completed { + padding-bottom: 80px; +} +.theme-dark div[data-type='memos_view'].mobile-view .memolist-wrapper { + padding: 0 12px; +} +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.hide-scroll-bar { scrollbar-width: none; } -.theme-light div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar { +.hide-scroll-bar::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.theme-light div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar-thumb { +.hide-scroll-bar::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.theme-light div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar-thumb:hover { +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.theme-light div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar { +.hide-scroll-bar::-webkit-scrollbar { display: none; } -.theme-light div[data-type='memos_view'] .tags-wrapper > .title-text { - width: 100%; - padding: 4px 16px; - font-size: 12px; - line-height: 24px; - color: #37352f; - opacity: 0.5; - margin-bottom: 4px; -} -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - position: relative; - width: 100%; - height: auto; - flex-wrap: nowrap; - margin-bottom: 8px; -} -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .subtags-container { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: calc(100% - 18px); - min-width: 80px; - height: auto; - margin-top: 4px; - margin-left: 18px; - border-left: 2px solid #e4e4e4; - padding-left: 6px; -} -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .subtags-container > .tag-item-container:first-child { - margin-top: 0; -} -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container { +div[data-type='memos_view'] .section-header-container, +div[data-type='memos_view'] .memos-header-container { display: flex; flex-direction: row; justify-content: space-between; align-items: center; width: 100%; height: 40px; - padding: 0 16px; - margin-top: 4px; - border-radius: 8px; - font-size: 14px; - cursor: pointer; + flex-wrap: nowrap; + margin-top: 16px; flex-shrink: 0; - user-select: none; -} -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container:hover { - background-color: #e4e4e4; -} -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container.active > .tag-text-container > * { - color: #55bb8e; - font-weight: bold; } -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .tag-text-container { +div[data-type='memos_view'] .section-header-container > .title-text, +div[data-type='memos_view'] .memos-header-container > .title-text { display: flex; flex-direction: row; justify-content: flex-start; align-items: center; - max-width: calc(100% - 24px); + font-weight: bold; + font-size: 18px; + line-height: 40px; color: #37352f; + margin-right: 8px; overflow: hidden; text-overflow: ellipsis; flex-shrink: 0; - line-height: 20px; + cursor: pointer; } -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .tag-text-container > .icon-text { - display: block; - width: 16px; +div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, +div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 24px; + height: 24px; + margin-right: 4px; flex-shrink: 0; + background-color: unset; } -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .tag-text-container > .tag-text { - flex-shrink: 0; +div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, +div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { + width: 18px; + height: 18px; } -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container { +div[data-type='memos_view'] .section-header-container > .btns-container, +div[data-type='memos_view'] .memos-header-container > .btns-container { display: flex; flex-direction: row; justify-content: flex-end; align-items: center; } -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container > .action-btn { +div[data-type='memos_view'].mobile-view .section-header-container, +div[data-type='memos_view'].mobile-view .memos-header-container { + height: auto; + margin-top: 4px; + margin-bottom: 0; + padding: 0 12px; + padding-bottom: 8px; +} +div[data-type='memos_view'].mobile-view .section-header-container > .title-text > .action-btn, +div[data-type='memos_view'].mobile-view .memos-header-container > .title-text > .action-btn { display: flex; flex-direction: row; justify-content: center; align-items: center; - width: 24px; + width: 60px; height: 24px; + margin-right: -8px; + margin-left: -20px; flex-shrink: 0; - transition: all 0.1s linear; - transform: rotate(0); + background-color: unset; } -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container > .action-btn > .icon-img { +div[data-type='memos_view'].mobile-view .section-header-container > .title-text > .action-btn > .icon-img, +div[data-type='memos_view'].mobile-view .memos-header-container > .title-text > .action-btn > .icon-img { width: 18px; height: 18px; - opacity: 0.8; } -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container > .action-btn.shown { - transform: rotate(90deg); -} -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container > .tag-tip-container { +.theme-dark div[data-type='memos_view'] .section-header-container, +.theme-dark div[data-type='memos_view'] .memos-header-container { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; width: 100%; - margin-top: 8px; - padding-left: 16px; - font-size: 12px; - line-height: 1.6; - color: gray; -} -.theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container > .tag-tip-container > .code-text { - color: #5783f7; - padding: 4px; - margin: 0 2px; - white-space: pre-line; - background-color: #eef3fe; - border-radius: 4px; -} -.theme-light .rename-tag-dialog > .dialog-container { - width: 320px; + height: 40px; + flex-wrap: nowrap; + margin-top: 16px; + flex-shrink: 0; } -.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container { +.theme-dark div[data-type='memos_view'] .section-header-container > .title-text, +.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text { display: flex; - flex-direction: column; + flex-direction: row; justify-content: flex-start; - align-items: flex-start; + align-items: center; + font-weight: bold; + font-size: 18px; + line-height: 40px; + color: #d2d1cd; + margin-right: 8px; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 0; + cursor: pointer; } -.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container > .tag-text { - margin-bottom: 8px; - font-size: 14px; +.theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, +.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 24px; + height: 24px; + margin-right: 4px; + flex-shrink: 0; + background-color: unset; } -.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container > .text-input { - width: 100%; - padding: 8px 12px; - border: 1px solid lightgray; - border-radius: 4px; - font-size: 14px; - margin-bottom: 12px; +.theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, +.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { + width: 18px; + height: 18px; + fill: #cdcdcd; } -.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container { +.theme-dark div[data-type='memos_view'] .section-header-container > .btns-container, +.theme-dark div[data-type='memos_view'] .memos-header-container > .btns-container { display: flex; flex-direction: row; justify-content: flex-end; align-items: center; - width: 100%; -} -.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text { - font-size: 14px; - margin-left: 12px; - cursor: pointer; } -.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text:hover { - opacity: 0.8; -} -.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text.cancel-btn { - color: #52504b; +.theme-dark div[data-type='memos_view'].mobile-view .section-header-container, +.theme-dark div[data-type='memos_view'].mobile-view .memos-header-container { + height: auto; + margin-top: 4px; + margin-bottom: 0; + padding: 0 12px; + padding-bottom: 8px; } -.theme-light .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text.confirm-btn { - background-color: #55bb8e; - color: white; - padding: 4px 12px; - border-radius: 4px; +.theme-dark div[data-type='memos_view'].mobile-view .section-header-container > .title-text, +.theme-dark div[data-type='memos_view'].mobile-view .memos-header-container > .title-text { + color: #d2d1cd; } -@media only screen and (max-width: 875px) { - .theme-light div[data-type='memos_view'] .tags-wrapper, - .theme-light div[data-type='memos_view'] .tags-wrapper-mobile-emulate { - background-color: white; - } - .theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container, - .theme-light div[data-type='memos_view'] .tags-wrapper-mobile-emulate > .tags-container { - height: auto; - } - .theme-light div[data-type='memos_view'] .tags-wrapper > .tags-container:last-child, - .theme-light div[data-type='memos_view'] .tags-wrapper-mobile-emulate > .tags-container:last-child { - flex-grow: 1; - } - .theme-light .rename-tag-dialog, - .theme-light .rename-tag-dialog-mobile-emulate { - padding-top: 64px; - } +.theme-dark div[data-type='memos_view'].mobile-view .section-header-container > .title-text > .action-btn, +.theme-dark div[data-type='memos_view'].mobile-view .memos-header-container > .title-text > .action-btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 60px; + height: 24px; + margin-right: -8px; + margin-left: -20px; + flex-shrink: 0; + background-color: unset; } -.theme-dark div[data-type='memos_view'] .tags-wrapper { +.theme-dark div[data-type='memos_view'].mobile-view .section-header-container > .title-text > .action-btn > .icon-img, +.theme-dark div[data-type='memos_view'].mobile-view .memos-header-container > .title-text > .action-btn > .icon-img { + width: 18px; + height: 18px; + fill: #cdcdcd; +} +.theme-light div[data-type='memos_view'] .memo-trash-wrapper { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; width: 100%; - padding: 0 8px; - height: auto; - flex-wrap: nowrap; - padding-bottom: 16px; + height: 100%; flex-grow: 1; + overflow-y: scroll; scrollbar-width: none; } -.theme-dark div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar { +.theme-light div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.theme-dark div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar-thumb { +.theme-light div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.theme-dark div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar-thumb:hover { +.theme-light div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.theme-dark div[data-type='memos_view'] .tags-wrapper::-webkit-scrollbar { +.theme-light div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar { display: none; } -.theme-dark div[data-type='memos_view'] .tags-wrapper > .title-text { +.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .section-header-container { width: 100%; - padding: 4px 16px; - font-size: 12px; - line-height: 24px; - color: #d2d1cd; - opacity: 0.5; - margin-bottom: 4px; + height: 40px; + margin-bottom: 0; } -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container { +.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .section-header-container > .title-text { + font-weight: bold; + font-size: 15px; + color: #37352f; +} +.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .tip-text-container { + width: 100%; + height: 128px; display: flex; flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - position: relative; - width: 100%; - height: auto; - flex-wrap: nowrap; - margin-bottom: 8px; + justify-content: center; + align-items: center; } -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .subtags-container { +.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - width: calc(100% - 18px); - min-width: 80px; - height: auto; - margin-top: 4px; - margin-left: 18px; - border-left: 2px solid #353535; - padding-left: 6px; -} -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .subtags-container > .tag-item-container:first-child { - margin-top: 0; -} -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; + flex-grow: 1; width: 100%; - height: 40px; - padding: 0 16px; - margin-top: 4px; - border-radius: 8px; - font-size: 14px; + overflow-y: scroll; + padding-bottom: 64px; + scrollbar-width: none; +} +.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar { + width: 0; + height: 0; cursor: pointer; - flex-shrink: 0; - user-select: none; } -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container:hover { - background-color: #353535; +.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container.active > .tag-text-container > * { - color: #457560; - font-weight: bold; +.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .tag-text-container { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - max-width: calc(100% - 24px); - color: #d2d1cd; - overflow: hidden; - text-overflow: ellipsis; - flex-shrink: 0; - line-height: 20px; +.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar { + display: none; } -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .tag-text-container > .icon-text { - display: block; - width: 16px; - flex-shrink: 0; +.theme-light div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container > .memo-wrapper > .memo-content-text { + font-size: 15px; + line-height: 24px; } -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .tag-text-container > .tag-text { - flex-shrink: 0; +.theme-light div[data-type='memos_view'].mobile-view .deleted-memos-container { + padding: 0 12px; } -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container { +.theme-light div[data-type='memos_view'].mobile-view .memo-trash-wrapper { display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: center; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 100%; + height: 100%; + flex-grow: 1; + overflow-y: scroll; + scrollbar-width: none; } -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container > .action-btn { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - width: 24px; - height: 24px; - flex-shrink: 0; - transition: all 0.1s linear; - transform: rotate(0); +.theme-light div[data-type='memos_view'].mobile-view .memo-trash-wrapper::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; } -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container > .action-btn > .icon-img { - width: 18px; - height: 18px; - opacity: 0.8; - color: #d2d1cd; - filter: invert(0.8); +.theme-light div[data-type='memos_view'].mobile-view .memo-trash-wrapper::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container .tag-item-container > .btns-container > .action-btn.shown { - transform: rotate(90deg); +.theme-light div[data-type='memos_view'].mobile-view .memo-trash-wrapper::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container > .tag-tip-container { - width: 100%; - margin-top: 8px; - padding-left: 16px; - font-size: 12px; - line-height: 1.6; - color: #bbbbbb; +.theme-light div[data-type='memos_view'].mobile-view .memo-trash-wrapper::-webkit-scrollbar { + display: none; } -.theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container > .tag-tip-container > .code-text { - color: #bbbec7; - padding: 4px; - margin: 0 2px; - white-space: pre-line; - background-color: #616161; - border-radius: 4px; +.theme-light div[data-type='memos_view'].mobile-view .memo-trash-wrapper > .section-header-container { + width: 100%; + height: 58px; + margin-bottom: 0; } -.theme-dark .rename-tag-dialog > .dialog-container { - width: 320px; +.theme-light div[data-type='memos_view'].mobile-view .memo-trash-wrapper > .section-header-container > .title-text { + font-weight: bold; + font-size: 15px; + color: #37352f; } -.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container { +.theme-dark div[data-type='memos_view'] .memo-trash-wrapper { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; -} -.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container > .tag-text { - margin-bottom: 8px; - font-size: 14px; -} -.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container > .text-input { - width: 100%; - padding: 8px 12px; - border: 1px solid #505050; - border-radius: 4px; - font-size: 14px; - margin-bottom: 12px; -} -.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container { - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: center; width: 100%; + height: 100%; + flex-grow: 1; + overflow-y: scroll; + scrollbar-width: none; } -.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text { - font-size: 14px; - margin-left: 12px; +.theme-dark div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar { + width: 0; + height: 0; cursor: pointer; } -.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text:hover { - opacity: 0.8; +.theme-dark div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text.cancel-btn { - color: #c7c4bb; +.theme-dark div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-dark .rename-tag-dialog > .dialog-container > .dialog-content-container > .btns-container > .btn-text.confirm-btn { - background-color: #457560; - color: #000000; - padding: 4px 12px; - border-radius: 4px; +.theme-dark div[data-type='memos_view'] .memo-trash-wrapper::-webkit-scrollbar { + display: none; } -@media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .tags-wrapper, - .theme-dark div[data-type='memos_view'] .tags-wrapper-mobile-emulate { - background-color: #000000; - } - .theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container, - .theme-dark div[data-type='memos_view'] .tags-wrapper-mobile-emulate > .tags-container { - height: auto; - } - .theme-dark div[data-type='memos_view'] .tags-wrapper > .tags-container:last-child, - .theme-dark div[data-type='memos_view'] .tags-wrapper-mobile-emulate > .tags-container:last-child { - flex-grow: 1; - } - .theme-dark .rename-tag-dialog, - .theme-dark .rename-tag-dialog-mobile-emulate { - padding-top: 64px; - } +.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .section-header-container { + width: 100%; + height: 40px; + margin-bottom: 0; + color: #d2d1cd; } -.mono-font-family { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .section-header-container > .title-text { + font-weight: bold; + font-size: 18px; + color: #d2d1cd; } -.hide-scroll-bar { +.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .tip-text-container { + width: 100%; + height: 128px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} +.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + flex-grow: 1; + font-size: 15px; + width: 100%; + overflow-y: scroll; + padding-bottom: 64px; + color: #d2d1cd; scrollbar-width: none; } -.hide-scroll-bar::-webkit-scrollbar { +.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.hide-scroll-bar::-webkit-scrollbar-thumb { +.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { +.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.hide-scroll-bar::-webkit-scrollbar { +.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container::-webkit-scrollbar { display: none; } -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - width: 100%; - height: 122px; - flex-wrap: wrap; - padding-right: 24px; - padding-bottom: 12px; +.theme-dark div[data-type='memos_view'] .memo-trash-wrapper > .deleted-memos-container > .memo-wrapper > .memo-content-text { + font-size: 15px; + line-height: 24px; } -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper:hover > .day-tip-text-container { - visibility: visible; +.theme-dark div[data-type='memos_view'].mobile-view .deleted-memos-container { + padding: 0 12px; } -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container { +.theme-dark div[data-type='memos_view'].mobile-view .memo-trash-wrapper { display: flex; flex-direction: column; - justify-content: space-between; - align-items: center; - width: 24px; - height: 100%; - padding-bottom: 2px; - flex-wrap: wrap; - visibility: hidden; -} -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container > .tip-text { - font-size: 10px; - line-height: 16px; - padding-right: 2px; + justify-content: flex-start; + align-items: flex-start; width: 100%; - text-align: right; - color: gray; - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; -} -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map { - width: 192px; height: 100%; - flex-wrap: wrap; - display: grid; - grid-template-rows: repeat(7, 1fr); - grid-template-columns: repeat(12, 1fr); - grid-auto-flow: column; -} -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container { - display: block; - width: 13px; - height: 13px; - background-color: #eaeaea; - border-radius: 2px; - margin-bottom: 2px; -} -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.null { - background-color: transparent; -} -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L1-bg { - background-color: #9be9a8; -} -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L2-bg { - background-color: #40c463; -} -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L3-bg { - background-color: #30a14e; + flex-grow: 1; + overflow-y: scroll; + scrollbar-width: none; } -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L4-bg { - background-color: #216e39; +.theme-dark div[data-type='memos_view'].mobile-view .memo-trash-wrapper::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; } -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.today { - border: 1px solid black; +.theme-dark div[data-type='memos_view'].mobile-view .memo-trash-wrapper::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; } -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container { - position: absolute; - left: 0; - top: 0; - margin-left: 9px; - transform: translateX(-50%); - margin-top: -36px; - background-color: rgba(0, 0, 0, 0.8); - color: white; - padding: 6px 8px; - border-radius: 4px; - font-size: 12px; - line-height: 1.6; - z-index: 2; - user-select: none; - white-space: nowrap; +.theme-dark div[data-type='memos_view'].mobile-view .memo-trash-wrapper::-webkit-scrollbar-thumb:hover { + background-color: #ccc; } -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container > .date-text { - color: lightgray; +.theme-dark div[data-type='memos_view'].mobile-view .memo-trash-wrapper::-webkit-scrollbar { + display: none; } -.theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container::before { - content: ''; - position: absolute; - bottom: -4px; - left: calc(50% - 6px); - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 4px solid rgba(0, 0, 0, 0.8); +.theme-dark div[data-type='memos_view'].mobile-view .memo-trash-wrapper > .section-header-container { + width: 100%; + height: 58px; + margin-bottom: 0; } -@media only screen and (max-width: 875px) { - .theme-light div[data-type='memos_view'] .usage-heat-map-wrapper { - height: 160px; - padding: 8px 0 !important; - padding-top: 12px !important; - } - .theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container { - visibility: visible; - width: 48px; - padding-bottom: 4px; - } - .theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container > .tip-text { - padding-right: 6px; - font-size: 12px; - line-height: unset !important; - } - .theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map { - width: 240px; - } - .theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container { - width: 16px; - height: 16px; - margin-bottom: 4px; - } - .theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container { - margin-top: -32px; - margin-left: 16px; - font-size: 10px; - } - .theme-light div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container::before { - left: calc(50% - 4px); - } +.theme-dark div[data-type='memos_view'].mobile-view .memo-trash-wrapper > .section-header-container > .title-text { + font-weight: bold; + font-size: 15px; + color: #d2d1cd; } -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper { +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper { display: flex; - flex-direction: row; + flex-direction: column; justify-content: flex-start; - align-items: center; + align-items: flex-start; width: 100%; - height: 122px; - flex-wrap: wrap; - padding-right: 24px; - padding-bottom: 12px; + padding: 12px 18px; + background-color: #ffffff; + border-radius: 8px; + border: 1px solid transparent; } -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper:hover > .day-tip-text-container { - visibility: visible; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper:hover { + border-color: #e4e4e4; } -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container { +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper { display: flex; - flex-direction: column; + flex-direction: row; justify-content: space-between; align-items: center; - width: 24px; - height: 100%; - padding-bottom: 2px; - flex-wrap: wrap; - visibility: hidden; -} -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container > .tip-text { - font-size: 10px; - line-height: 16px; - padding-right: 2px; width: 100%; - text-align: right; - color: gray; - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; + height: 24px; + margin-bottom: 0; } -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map { - width: 192px; - height: 100%; - flex-wrap: wrap; - display: grid; - grid-template-rows: repeat(7, 1fr); - grid-template-columns: repeat(12, 1fr); - grid-auto-flow: column; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .time-text { + font-size: 12px; + line-height: 24px; + color: #a8a8a8; + flex-shrink: 0; + cursor: pointer; } -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container { - display: block; - width: 13px; - height: 13px; - background-color: #d8d8d8; - border-radius: 2px; - margin-bottom: 2px; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + position: relative; + flex-shrink: 0; } -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.null { - background-color: transparent; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + position: absolute; + flex-wrap: nowrap; + top: calc(100% - 14px); + right: -16px; + width: auto; + height: auto; + padding: 12px; + z-index: 1; + display: none; } -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L1-bg { - background-color: #f75205; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper:hover { + display: flex; } -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L2-bg { - background-color: #e03a07; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container { + width: 112px; + height: auto; + line-height: 18px; + padding: 4px; + white-space: nowrap; + border-radius: 8px; + background-color: white; + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); + z-index: 1; } -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L3-bg { - background-color: #bf2104; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn { + width: 100%; + padding: 8px 0; + padding-left: 24px; + border-radius: 4px; + height: unset; + line-height: unset; + justify-content: flex-start; } -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.stat-day-L4-bg { - background-color: #940b01; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn.delete-btn { + color: #d28653; } -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container.today { - border: 1px solid #ffffff; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn.delete-btn.final-confirm { + font-weight: bold; } -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container { - position: absolute; - left: 0; - top: 0; - margin-left: 9px; - transform: translateX(-50%); - margin-top: -36px; - background-color: rgba(0, 0, 0, 0.8); - color: white; - padding: 6px 8px; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container .btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 100%; + height: 28px; + font-size: 13px; border-radius: 4px; - font-size: 12px; - line-height: 1.6; - z-index: 2; - user-select: none; - white-space: nowrap; } -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container > .date-text { - color: lightgray; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container .btn:hover { + background-color: #f8f8f8; } -.theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container::before { - content: ''; - position: absolute; - bottom: -4px; - left: calc(50% - 6px); - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 4px solid rgba(0, 0, 0, 0.8); +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn { + width: 28px; + cursor: unset; + margin-right: -6px; + opacity: 0.8; } -@media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper { - height: 160px; - padding: 8px 0 !important; - padding-top: 12px !important; - } - .theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container { - visibility: visible; - width: 48px; - padding-bottom: 4px; - } - .theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .day-tip-text-container > .tip-text { - padding-right: 6px; - font-size: 12px; - line-height: unset !important; - } - .theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map { - width: 240px; - } - .theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-heat-map > .stat-container { - width: 16px; - height: 16px; - margin-bottom: 4px; - } - .theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container { - margin-top: -32px; - margin-left: 16px; - font-size: 10px; - } - .theme-dark div[data-type='memos_view'] .usage-heat-map-wrapper > .usage-detail-container::before { - left: calc(50% - 4px); - } +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn > .icon-img { + width: 16px; + height: 16px; } -.mono-font-family { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn:hover { + background-color: unset; } -.hide-scroll-bar { +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn:hover + .more-action-btns-wrapper { + display: flex; +} +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-content-text { + width: 100%; +} +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + margin-top: 8px; + width: 100%; + overflow-x: auto; + overflow-y: hidden; + padding-bottom: 4px; scrollbar-width: none; } -.hide-scroll-bar::-webkit-scrollbar { +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper::-webkit-scrollbar { width: 0; - height: 0; + height: 2px; cursor: pointer; } -.hide-scroll-bar::-webkit-scrollbar-thumb { +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper::-webkit-scrollbar-thumb { width: 0; - height: 0; + height: 2px; border-radius: 8px; background-color: #d5d5d5; } -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.hide-scroll-bar::-webkit-scrollbar { - display: none; -} -.memos-sidebar-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 240px; - height: 100%; - padding: 16px 0; - overflow-x: hidden; - overflow-y: auto; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img { + margin-right: 8px; + width: auto; + height: 128px; flex-shrink: 0; + flex-grow: 0; + overflow-y: hidden; scrollbar-width: none; } -.memos-sidebar-wrapper::-webkit-scrollbar { +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.memos-sidebar-wrapper::-webkit-scrollbar-thumb { +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.memos-sidebar-wrapper::-webkit-scrollbar-thumb:hover { +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.memos-sidebar-wrapper::-webkit-scrollbar { +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar { display: none; } -.memos-sidebar-wrapper > * { - flex-shrink: 0; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img:hover { + border-color: lightgray; } -.memos-sidebar-wrapper-display { - display: none; +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img:last-child { + margin-right: 0; +} +.theme-light div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img > img { + width: auto; + max-height: 128px; + border-radius: 8px; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper { + display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; - width: 240px; - height: 100%; - padding: 16px 0; - overflow-x: hidden; - overflow-y: auto; + width: 100%; + padding: 12px 18px; + background-color: #303030; + border-radius: 8px; + border: 1px solid transparent; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper:hover { + border-color: #353535; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; + height: 24px; + margin-bottom: 0; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .time-text { + font-size: 12px; + line-height: 24px; + color: #d6d6d6; flex-shrink: 0; + cursor: pointer; } -@media only screen and (max-width: 875px) { - body.mobile-show-sidebar #page-wrapper > .memos-sidebar-wrapper { - transform: translateX(0); - box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.2); - } - .memos-sidebar-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - z-index: 99; - position: absolute; - top: 0; - left: 0; - width: 320px; - height: 100%; - padding: 0; - background-color: white; - transition: all 0.4s ease; - transform: translateX(-320px); - } - .memos-sidebar-wrapper > * { - width: 320px; - max-width: 95%; - flex-shrink: 0; - padding-left: 32px; - } +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + position: relative; + flex-shrink: 0; } -.theme-dark .memos-sidebar-wrapper { +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper { display: flex; flex-direction: column; justify-content: flex-start; + align-items: center; + position: absolute; + flex-wrap: nowrap; + top: calc(100% - 14px); + right: -16px; + width: auto; + height: auto; + padding: 12px; + z-index: 1; + display: none; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper:hover { + display: flex; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container { + width: 112px; + height: auto; + line-height: 18px; + padding: 4px; + white-space: nowrap; + border-radius: 8px; + background-color: #181818; + z-index: 1; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn { + width: 100%; + padding: 8px 0; + padding-left: 24px; + border-radius: 4px; + height: unset; + line-height: unset; + justify-content: flex-start; + color: #d2d1cd; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn.delete-btn { + color: #940b01; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container > .more-action-btns-wrapper > .more-action-btns-container > .btn.delete-btn.final-confirm { + font-weight: bold; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container .btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 100%; + height: 28px; + font-size: 13px; + border-radius: 4px; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container .btn:hover { + background-color: #808080; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn { + width: 28px; + cursor: unset; + margin-right: -6px; + opacity: 0.8; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn > .icon-img { + width: 16px; + height: 16px; + fill: #cdcdcd; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn:hover { + background-color: unset; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-top-wrapper > .btns-container .btn.more-action-btn:hover + .more-action-btns-wrapper { + display: flex; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .memo-content-text { + width: 100%; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; align-items: flex-start; - width: 240px; - height: 100%; - padding: 16px 0; - overflow-x: hidden; - overflow-y: auto; + margin-top: 8px; + width: 100%; + overflow-x: auto; + overflow-y: hidden; + padding-bottom: 4px; + scrollbar-width: none; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper::-webkit-scrollbar { + width: 0; + height: 2px; + cursor: pointer; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper::-webkit-scrollbar-thumb { + width: 0; + height: 2px; + border-radius: 8px; + background-color: #d5d5d5; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper::-webkit-scrollbar-thumb:hover { + background-color: #ccc; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img { + margin-right: 8px; + width: auto; + height: 128px; flex-shrink: 0; + flex-grow: 0; + overflow-y: hidden; scrollbar-width: none; } -.theme-dark .memos-sidebar-wrapper::-webkit-scrollbar { +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.theme-dark .memos-sidebar-wrapper::-webkit-scrollbar-thumb { +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.theme-dark .memos-sidebar-wrapper::-webkit-scrollbar-thumb:hover { +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.theme-dark .memos-sidebar-wrapper::-webkit-scrollbar { +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img::-webkit-scrollbar { display: none; } -.theme-dark .memos-sidebar-wrapper > * { - flex-shrink: 0; +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img:hover { + border-color: #444444; } -@media only screen and (max-width: 875px) { - .theme-dark .memos-sidebar-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: center; - z-index: 99; - position: absolute; - top: 0; - left: 0; - width: 320px; - height: 100%; - padding: 0; - background-color: #000000; - transition: all 0.4s ease; - transform: translateX(-320px); - } - .theme-dark .memos-sidebar-wrapper > * { - width: 320px; - max-width: 95%; - flex-shrink: 0; - padding-left: 32px; - } +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img:last-child { + margin-right: 0; +} +.theme-dark div[data-type="memos_view"] .memo-trash-wrapper .memo-wrapper > .images-wrapper > .memo-img > img { + width: auto; + max-height: 128px; + border-radius: 8px; } .mono-font-family { font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; @@ -8047,315 +8830,335 @@ div[data-type='memos_view'] .preference-wrapper > .sections-wrapper > .section-c .hide-scroll-bar::-webkit-scrollbar { display: none; } -div[data-type='memos_view'] #root { - background-color: #f6f5f4; +.preferences-section-container > .demo-content-container { + padding: 16px; + border-radius: 8px; + border: 2px solid #e4e4e4; + margin: 12px 0; } -div[data-type='memos_view'] .view-content { - overflow-y: hidden; +.preferences-section-container > .form-label { + height: 28px; + cursor: pointer; } -div[data-type='memos_view'] #page-wrapper { +.preferences-section-container > .form-label > .icon-img { + width: 16px; + height: 16px; + margin: 0 8px; +} +.preferences-section-container > .form-label:hover { + opacity: 0.8; +} +.preferences-section-container > .btn-container { display: flex; flex-direction: row; justify-content: flex-start; - align-items: flex-start; - width: 848px; - max-width: 100%; - height: 100%; - margin: auto; - transform: translateX(-16px); - margin-top: -15px; + align-items: center; + width: 100%; + margin: 4px 0; } -div[data-type='memos_view'] #page-wrapper > .content-wrapper { +.preferences-section-container > .btn-container .btn { + height: 28px; + padding: 0 12px; + margin-right: 8px; + border: 1px solid gray; + border-radius: 8px; + cursor: pointer; +} +.preferences-section-container > .btn-container .btn:hover { + opacity: 0.8; +} +.mono-font-family { + font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +} +.hide-scroll-bar { + scrollbar-width: none; +} +.hide-scroll-bar::-webkit-scrollbar { + width: 0; + height: 0; + cursor: pointer; +} +.hide-scroll-bar::-webkit-scrollbar-thumb { + width: 0; + height: 0; + border-radius: 8px; + background-color: #d5d5d5; +} +.hide-scroll-bar::-webkit-scrollbar-thumb:hover { + background-color: #ccc; +} +.hide-scroll-bar::-webkit-scrollbar { + display: none; +} +div[data-type='memos_view'] .section-header-container, +div[data-type='memos_view'] .memos-header-container { display: flex; - flex-direction: column; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; + height: 40px; + flex-wrap: nowrap; + margin-top: 16px; + flex-shrink: 0; +} +div[data-type='memos_view'] .section-header-container > .title-text, +div[data-type='memos_view'] .memos-header-container > .title-text { + display: flex; + flex-direction: row; justify-content: flex-start; - align-items: flex-start; - position: relative; - margin-top: 15px; - padding-left: 10px; - width: 600px; - height: 100%; - gap: 8px; + align-items: center; + font-weight: bold; + font-size: 18px; + line-height: 40px; + color: #37352f; + margin-right: 8px; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 0; + cursor: pointer; } -div[data-type='memos_view'] #page-wrapper > .content-wrapper-padding-fix { +div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, +div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { display: flex; - flex-direction: column; + flex-direction: row; + justify-content: center; + align-items: center; + width: 24px; + height: 24px; + margin-right: 4px; + flex-shrink: 0; + background-color: unset; +} +div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, +div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { + width: 18px; + height: 18px; +} +div[data-type='memos_view'] .section-header-container > .btns-container, +div[data-type='memos_view'] .memos-header-container > .btns-container { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; +} +div[data-type='memos_view'].mobile-view .section-header-container, +div[data-type='memos_view'].mobile-view .memos-header-container { + height: auto; + margin-top: 4px; + margin-bottom: 0; + padding: 0 12px; + padding-bottom: 8px; +} +div[data-type='memos_view'].mobile-view .section-header-container > .title-text > .action-btn, +div[data-type='memos_view'].mobile-view .memos-header-container > .title-text > .action-btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 60px; + height: 24px; + margin-right: -8px; + margin-left: -20px; + flex-shrink: 0; + background-color: unset; +} +div[data-type='memos_view'].mobile-view .section-header-container > .title-text > .action-btn > .icon-img, +div[data-type='memos_view'].mobile-view .memos-header-container > .title-text > .action-btn > .icon-img { + width: 18px; + height: 18px; +} +.theme-dark div[data-type='memos_view'] .section-header-container, +.theme-dark div[data-type='memos_view'] .memos-header-container { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; + height: 40px; + flex-wrap: nowrap; + margin-top: 16px; + flex-shrink: 0; +} +.theme-dark div[data-type='memos_view'] .section-header-container > .title-text, +.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text { + display: flex; + flex-direction: row; justify-content: flex-start; - align-items: flex-start; - position: relative; - margin-top: 0px; - width: 600px; - height: 100%; - overflow-y: hidden; - padding-left: 34px; - gap: 8px; + align-items: center; + font-weight: bold; + font-size: 18px; + line-height: 40px; + color: #d2d1cd; + margin-right: 8px; + overflow: hidden; + text-overflow: ellipsis; + flex-shrink: 0; + cursor: pointer; } -@media only screen and (max-width: 875px) { - div[data-type='memos_view'] body.mobile-show-sidebar #page-wrapper > .content-wrapper { - transform: translateX(320px); - } - div[data-type='memos_view'] #page-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - width: 100%; - height: 100%; - padding: 0; - transform: translateX(0); - margin-top: -10px; - } - div[data-type='memos_view'] #page-wrapper > .content-wrapper { - width: 100%; - height: 100%; - margin-left: 0; - padding-top: 0; - transition: all 0.4s ease; - transform: translateX(0); - } +.theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn, +.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 24px; + height: 24px; + margin-right: 4px; + flex-shrink: 0; + background-color: unset; } -.mono-font-family { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; +.theme-dark div[data-type='memos_view'] .section-header-container > .title-text > .action-btn > .icon-img, +.theme-dark div[data-type='memos_view'] .memos-header-container > .title-text > .action-btn > .icon-img { + width: 18px; + height: 18px; + fill: #cdcdcd; } -.hide-scroll-bar { +.theme-dark div[data-type='memos_view'] .section-header-container > .btns-container, +.theme-dark div[data-type='memos_view'] .memos-header-container > .btns-container { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; +} +.theme-dark div[data-type='memos_view'].mobile-view .section-header-container, +.theme-dark div[data-type='memos_view'].mobile-view .memos-header-container { + height: auto; + margin-top: 4px; + margin-bottom: 0; + padding: 0 12px; + padding-bottom: 8px; +} +.theme-dark div[data-type='memos_view'].mobile-view .section-header-container > .title-text, +.theme-dark div[data-type='memos_view'].mobile-view .memos-header-container > .title-text { + color: #d2d1cd; +} +.theme-dark div[data-type='memos_view'].mobile-view .section-header-container > .title-text > .action-btn, +.theme-dark div[data-type='memos_view'].mobile-view .memos-header-container > .title-text > .action-btn { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 60px; + height: 24px; + margin-right: -8px; + margin-left: -20px; + flex-shrink: 0; + background-color: unset; +} +.theme-dark div[data-type='memos_view'].mobile-view .section-header-container > .title-text > .action-btn > .icon-img, +.theme-dark div[data-type='memos_view'].mobile-view .memos-header-container > .title-text > .action-btn > .icon-img { + width: 18px; + height: 18px; + fill: #cdcdcd; +} +div[data-type='memos_view'] .preference-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 100%; + height: 100%; + flex-grow: 1; + overflow-y: scroll; scrollbar-width: none; } -.hide-scroll-bar::-webkit-scrollbar { +div[data-type='memos_view'] .preference-wrapper::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.hide-scroll-bar::-webkit-scrollbar-thumb { +div[data-type='memos_view'] .preference-wrapper::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { +div[data-type='memos_view'] .preference-wrapper::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.hide-scroll-bar::-webkit-scrollbar { +div[data-type='memos_view'] .preference-wrapper::-webkit-scrollbar { display: none; } -div[data-type='memos_view'] #root { +div[data-type='memos_view'] .preference-wrapper > .section-header-container { + width: 100%; + height: 40px; + margin-bottom: 0; +} +div[data-type='memos_view'] .preference-wrapper > .section-header-container > .title-text { + font-weight: bold; + font-size: 18px; + color: #37352f; +} +div[data-type='memos_view'] .preference-wrapper > .tip-text-container { + width: 100%; + height: 128px; display: flex; - flex-direction: row; + flex-direction: column; + justify-content: center; + align-items: center; +} +div[data-type='memos_view'] .preference-wrapper > .sections-wrapper { + display: flex; + flex-direction: column; justify-content: flex-start; align-items: flex-start; + flex-grow: 1; width: 100%; - height: 100%; -} -.mono-font-family { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; -} -.hide-scroll-bar { + overflow-y: scroll; + padding-bottom: 64px; scrollbar-width: none; } -.hide-scroll-bar::-webkit-scrollbar { +div[data-type='memos_view'] .preference-wrapper > .sections-wrapper::-webkit-scrollbar { width: 0; height: 0; cursor: pointer; } -.hide-scroll-bar::-webkit-scrollbar-thumb { +div[data-type='memos_view'] .preference-wrapper > .sections-wrapper::-webkit-scrollbar-thumb { width: 0; height: 0; border-radius: 8px; background-color: #d5d5d5; } -.hide-scroll-bar::-webkit-scrollbar-thumb:hover { +div[data-type='memos_view'] .preference-wrapper > .sections-wrapper::-webkit-scrollbar-thumb:hover { background-color: #ccc; } -.hide-scroll-bar::-webkit-scrollbar { +div[data-type='memos_view'] .preference-wrapper > .sections-wrapper::-webkit-scrollbar { display: none; } -@font-face { - font-family: 'DINPro'; - src: ''; - font-weight: normal; -} -@font-face { - font-family: 'DINPro'; - src: ''; - font-weight: bold; -} -@font-face { - font-family: 'ubuntu-mono'; - src: ''; - font-style: normal; -} -div[data-type='memos_view'] .view-content:not(.images-wrapper) img { - max-width: 100%; - cursor: default; -} -.theme-light div[data-type='memos_view'] { - margin: 0; - padding: 0; - box-sizing: border-box; - color: #37352f; - -webkit-tap-highlight-color: transparent; - font-family: 'DINPro', ui-sans-serif, -apple-system, 'system-ui', 'Segoe UI', Helvetica, 'Apple Color Emoji', Arial, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; -} -.theme-light div[data-type='memos_view'] body, -.theme-light div[data-type='memos_view'] html { +div[data-type='memos_view'] .preference-wrapper > .sections-wrapper > .section-container { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; width: 100%; - height: 100%; - overflow: hidden; - font-size: 15px; -} -.theme-light div[data-type='memos_view'] code { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; - background-color: pink; - padding: 2px 4px; - border-radius: 4px; -} -.theme-light div[data-type='memos_view'] pre { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; -} -.theme-light div[data-type='memos_view'] pre * { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; -} -.theme-light div[data-type='memos_view'] label, -.theme-light div[data-type='memos_view'] input, -.theme-light div[data-type='memos_view'] button:not(.rdp), -.theme-light div[data-type='memos_view'] textarea, -.theme-light div[data-type='memos_view'] img { - background-color: transparent; - user-select: none; - -webkit-tap-highlight-color: transparent; - border: none; - outline: none; -} -.theme-light div[data-type='memos_view'] input:-webkit-autofill, -.theme-light div[data-type='memos_view'] input:-webkit-autofill:hover, -.theme-light div[data-type='memos_view'] input:-webkit-autofill:focus, -.theme-light div[data-type='memos_view'] input:-webkit-autofill:active { - box-shadow: 0 0 0 30px white inset !important; -} -.theme-light div[data-type='memos_view'] li:not(.rta__item) { - list-style-type: none; -} -.theme-light div[data-type='memos_view'] li:not(.rta__item)::before { - content: '•'; - font-weight: bold; - margin-right: 4px; -} -.theme-light div[data-type='memos_view'] a { - cursor: pointer; - color: #5783f7; - text-underline-offset: 2px; -} -.theme-light div[data-type='memos_view'] a:hover { - background-color: #e4e4e4; -} -.theme-light div[data-type='memos_view'] a.is-unresolved { - cursor: pointer; - color: #8fa2d6; - text-underline-offset: 2px; -} -.theme-light div[data-type='memos_view'] a.is-unresolved:hover { - background-color: #e4e4e4; -} -.theme-light div[data-type='memos_view'] .btn { - border: unset; - background-color: unset; - text-align: unset; - font-size: unset; - user-select: none; - cursor: pointer; - text-align: center; -} -.theme-light .hidden { - display: none !important; -} -@media only screen and (max-width: 875px) { - .theme-light div[data-type='memos_view'] body, - .theme-light div[data-type='memos_view'] html { - -webkit-overflow-scrolling: touch; - } -} -.theme-dark div[data-type='memos_view'] { - margin: 0; - padding: 0; - box-sizing: border-box; - color: #37352f; - -webkit-tap-highlight-color: transparent; - font-family: 'DINPro', ui-sans-serif, -apple-system, 'system-ui', 'Segoe UI', Helvetica, 'Apple Color Emoji', Arial, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; + background-color: white; + margin: 8px 0; + padding: 16px; + padding-bottom: 8px; + border-radius: 8px; } -.theme-dark div[data-type='memos_view'] body, -.theme-dark div[data-type='memos_view'] html { - width: 100%; - height: 100%; - overflow: hidden; +div[data-type='memos_view'] .preference-wrapper > .sections-wrapper > .section-container > .title-text { font-size: 15px; -} -.theme-dark div[data-type='memos_view'] code { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; - background-color: #a8a8a8; - padding: 2px 4px; - border-radius: 4px; -} -.theme-dark div[data-type='memos_view'] pre { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; -} -.theme-dark div[data-type='memos_view'] pre * { - font-family: 'ubuntu-mono', SFMono-Regular, Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; -} -.theme-dark div[data-type='memos_view'] label, -.theme-dark div[data-type='memos_view'] input, -.theme-dark div[data-type='memos_view'] button, -.theme-dark div[data-type='memos_view'] textarea, -.theme-dark div[data-type='memos_view'] img { - background-color: transparent; - user-select: none; - -webkit-tap-highlight-color: transparent; - border: none; - outline: none; -} -.theme-dark div[data-type='memos_view'] input:-webkit-autofill, -.theme-dark div[data-type='memos_view'] input:-webkit-autofill:hover, -.theme-dark div[data-type='memos_view'] input:-webkit-autofill:focus, -.theme-dark div[data-type='memos_view'] input:-webkit-autofill:active { - box-shadow: 0 0 0 30px #000000 inset !important; -} -.theme-dark div[data-type='memos_view'] li:not(.rta__item) { - list-style-type: none; -} -.theme-dark div[data-type='memos_view'] li:not(.rta__item)::before { - content: '•'; + color: #37352f; font-weight: bold; - margin-right: 4px; -} -.theme-dark div[data-type='memos_view'] a { - cursor: pointer; - color: #5783f7; - text-underline-offset: 2px; -} -.theme-dark div[data-type='memos_view'] a:hover { - background-color: #2c395a; -} -.theme-dark div[data-type='memos_view'] a.is-unresolved { - cursor: pointer; - color: #8fa2d6; - text-underline-offset: 2px; -} -.theme-dark div[data-type='memos_view'] a.is-unresolved:hover { - background-color: #353535; + margin-bottom: 8px; } -.theme-dark div[data-type='memos_view'] .btn { - border: unset; - background-color: unset; - text-align: unset; - font-size: unset; - user-select: none; - cursor: pointer; - text-align: center; +div[data-type='memos_view'] .preference-wrapper > .sections-wrapper > .section-container > .form-label { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + width: 100%; + font-size: 14px; + line-height: 20px; + margin-bottom: 8px; } -.theme-dark .hidden { - display: none !important; +div[data-type='memos_view'] .preference-wrapper > .sections-wrapper > .section-container > .form-label > .normal-text { + flex-shrink: 0; } @media only screen and (max-width: 875px) { - .theme-dark div[data-type='memos_view'] body, - .theme-dark div[data-type='memos_view'] html { - -webkit-overflow-scrolling: touch; + div[data-type='memos_view'] .sections-wrapper { + padding: 0 12px; } } diff --git a/.obsidian/plugins/obsidian-reminder-plugin/data.json b/.obsidian/plugins/obsidian-reminder-plugin/data.json index b13ccbdc..b9d3ab2b 100644 --- a/.obsidian/plugins/obsidian-reminder-plugin/data.json +++ b/.obsidian/plugins/obsidian-reminder-plugin/data.json @@ -453,34 +453,34 @@ "06.02 Investments/VC Tasks.md": [ { "title": "[[VC Tasks#internet alerts|monitor VC news and publications]]", - "time": "2022-04-22", + "time": "2022-04-29", "rowNumber": 74 } ], "06.02 Investments/Crypto Tasks.md": [ { "title": "[[Crypto Tasks#internet alerts|monitor Crypto news and publications]]", - "time": "2022-04-22", + "time": "2022-04-29", "rowNumber": 74 } ], "06.02 Investments/Equity Tasks.md": [ { "title": "[[Equity Tasks#internet alerts|monitor Equity news and publications]]", - "time": "2022-04-22", + "time": "2022-04-29", "rowNumber": 74 } ], "05.02 Networks/Configuring UFW.md": [ { "title": "[[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix", - "time": "2022-04-23", + "time": "2022-04-30", "rowNumber": 239 }, { "title": "[[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list", - "time": "2022-04-23", - "rowNumber": 245 + "time": "2022-04-30", + "rowNumber": 246 } ], "00.01 Admin/Calendars/2022-03-18.md": [ @@ -526,25 +526,10 @@ } ], "00.01 Admin/Calendars/2022-04-18.md": [ - { - "title": "12:49 [[2022-04-18|Memo]], [[@Lifestyle]]: check the Tennis Club at the top of the mountain", - "time": "2022-04-23", - "rowNumber": 91 - }, - { - "title": "14:30 [[2022-04-18|Memo]], [[Selfhosting]], [[Server Alias]], [[Configuring Fail2ban]]: check (imported) nginx filters", - "time": "2022-04-23", - "rowNumber": 93 - }, { "title": "14:12 [[2022-04-18|Memo]], [[@Lifestyle]]: Find a cleaner", "time": "2022-04-24", "rowNumber": 92 - }, - { - "title": "17:54 [[2022-04-18|Memo]], [[@Lifestyle]]: Look up the afrench sailing circle", - "time": "2022-04-25", - "rowNumber": 94 } ] }, diff --git a/.obsidian/plugins/obsidian-task-collector/main.js b/.obsidian/plugins/obsidian-task-collector/main.js index 13241e53..723db2f0 100644 --- a/.obsidian/plugins/obsidian-task-collector/main.js +++ b/.obsidian/plugins/obsidian-task-collector/main.js @@ -61,11 +61,12 @@ var TaskCollector = class { constructor(app) { this.app = app; this.app = app; - this.completedOrCanceled = new RegExp(/^(\s*- \[)[xX-](\] .*)$/); - this.anyListItem = new RegExp(/^(\s*- )([^\\[].*)$/); - this.anyTaskMark = new RegExp(/^(\s*- \[).(\] .*)$/); + this.anyListItem = new RegExp(/^([\s>]*- )([^\\[].*)$/); + this.anyTaskMark = new RegExp(/^([\s>]*- \[).(\] .*)$/); + this.blockQuote = new RegExp(/^(\s*>[\s>]*)(.*)$/); this.blockRef = new RegExp(/^(.*?)( \^[A-Za-z0-9-]+)?$/); - this.stripTask = new RegExp(/^(\s*-) \[.\] (.*)$/); + this.continuation = new RegExp(/^( {2,}|\t)/); + this.stripTask = new RegExp(/^([\s>]*-) \[.\] (.*)$/); } updateSettings(settings) { this.settings = settings; @@ -88,7 +89,7 @@ var TaskCollector = class { } } } - const completedTasks = this.settings.supportCanceledTasks ? "xX-" : "xX"; + const completedTasks = (this.settings.onlyLowercaseX ? "x" : "xX") + (this.settings.supportCanceledTasks ? "-" : ""); if (this.settings.incompleteTaskValues.indexOf(" ") < 0) { this.settings.incompleteTaskValues = " " + this.settings.incompleteTaskValues; } @@ -110,10 +111,10 @@ var TaskCollector = class { return param ? new RegExp(param + "( \\^[A-Za-z0-9-]+)?$") : null; } tryCreateCompleteRegex(param) { - return new RegExp(`^(\\s*- \\[)[${param}](\\] .*)$`); + return new RegExp(`^([\\s>]*- \\[)[${param}](\\] .*)$`); } tryCreateIncompleteRegex(param) { - return new RegExp(`^(\\s*- \\[)[${param}](\\] .*)$`); + return new RegExp(`^([\\s>]*- \\[)[${param}](\\] .*)$`); } removeCheckboxFromLine(lineText) { return lineText.replace(this.stripTask, "$1 $2"); @@ -124,6 +125,7 @@ var TaskCollector = class { marked = marked.replace(this.initSettings.removeRegExp, ""); } if (this.settings.appendDateFormat) { + const strictLineEnding = lineText.endsWith(" "); let blockid = ""; const match = this.blockRef.exec(marked); if (match && match[2]) { @@ -134,6 +136,9 @@ var TaskCollector = class { marked += " "; } marked += (0, import_obsidian.moment)().format(this.settings.appendDateFormat) + blockid; + if (strictLineEnding) { + marked += " "; + } } return marked; } @@ -190,6 +195,7 @@ var TaskCollector = class { } resetTaskLine(lineText, mark = " ") { let marked = lineText.replace(this.anyTaskMark, "$1" + mark + "$2"); + const strictLineEnding = lineText.endsWith(" "); let blockid = ""; const match = this.blockRef.exec(marked); if (match && match[2]) { @@ -200,6 +206,9 @@ var TaskCollector = class { marked = marked.replace(this.initSettings.resetRegExp, ""); } marked = marked.replace(/\s*$/, blockid); + if (strictLineEnding) { + marked += " "; + } return marked; } resetTaskOnLine(editor, i, mark) { @@ -221,7 +230,7 @@ var TaskCollector = class { } else if (line.trim() === LOG_HEADING) { inCompletedSection = true; result.push(line); - } else if (this.completedOrCanceled.exec(line)) { + } else if (this.isCompletedTaskLine(line)) { result.push(this.resetTaskLine(line)); } else { result.push(line); @@ -243,6 +252,7 @@ var TaskCollector = class { const newTasks = []; let inCompletedSection = false; let inTask = false; + let inCallout = false; let completedItemsIndex = lines.length; for (let line of lines) { if (inCompletedSection) { @@ -257,17 +267,18 @@ var TaskCollector = class { completedItemsIndex = remaining.push(line); remaining.push("%%%COMPLETED_ITEMS_GO_HERE%%%"); } else { - const taskMatch = line.match(/^(\s*)- \[(.)\]/); if (this.isCompletedTaskLine(line)) { if (this.settings.completedAreaRemoveCheckbox) { line = this.removeCheckboxFromLine(line); } inTask = true; + inCallout = this.isCallout(line); newTasks.push(line); - } else if (inTask && !taskMatch && line.match(/^( {2,}|\t)/)) { + } else if (inTask && !this.isTaskLine(line) && this.isContinuation(line, inCallout)) { newTasks.push(line); } else { inTask = false; + inCallout = false; remaining.push(line); } } @@ -284,6 +295,21 @@ var TaskCollector = class { isIncompleteTaskLine(lineText) { return this.initSettings.incompleteTaskRegExp.test(lineText); } + isTaskLine(lineText) { + return this.anyTaskMark.test(lineText); + } + isContinuation(lineText, inCallout) { + if (inCallout) { + const match = this.blockQuote.exec(lineText); + if (match) { + return match[1].endsWith(">") || match[1].endsWith(" ") || match[1].endsWith(" "); + } + } + return this.continuation.test(lineText); + } + isCallout(lineText) { + return this.blockQuote.test(lineText); + } }; // src/taskcollector-Settings.ts @@ -300,7 +326,8 @@ var DEFAULT_SETTINGS = { rightClickResetTask: false, rightClickResetAll: false, rightClickToggleAll: false, - completedAreaRemoveCheckbox: false + completedAreaRemoveCheckbox: false, + onlyLowercaseX: false }; // src/taskcollector-SettingsTab.ts @@ -315,16 +342,23 @@ var TaskCollectorSettingsTab = class extends import_obsidian2.PluginSettingTab { this.containerEl.empty(); this.containerEl.createEl("h1", { text: "Task Collector" }); const tempSettings = Object.assign(this.taskCollector.settings); + new import_obsidian2.Setting(this.containerEl).setName("Only support x for completed tasks").setDesc("Only use 'x' (lower case) to indicate completed tasks.").addToggle((toggle) => toggle.setValue(tempSettings.onlyLowercaseX).onChange((value) => __async(this, null, function* () { + tempSettings.onlyLowercaseX = value; + this.taskCollector.updateSettings(tempSettings); + yield this.plugin.saveSettings(); + }))); new import_obsidian2.Setting(this.containerEl).setName("Support canceled tasks").setDesc("Use a - to indicate canceled tasks. Canceled tasks are processed in the same way as completed tasks using options below.").addToggle((toggle) => toggle.setValue(tempSettings.supportCanceledTasks).onChange((value) => __async(this, null, function* () { tempSettings.supportCanceledTasks = value; this.taskCollector.updateSettings(tempSettings); yield this.plugin.saveSettings(); }))); new import_obsidian2.Setting(this.containerEl).setName("Additional task types").setDesc("Specify the set of single characters that indicate in-progress or incomplete tasks, e.g. 'i> !?D'.").addText((text) => text.setPlaceholder("> !?").setValue(tempSettings.incompleteTaskValues).onChange((value) => __async(this, null, function* () { - if (value.contains("x") || value.contains("X")) { - console.log(`Set of characters should not contain the marker for completed tasks: ${value}`); + if (value.contains("x")) { + console.log(`Set of characters should not contain the marker for completed tasks (x): ${value}`); + } else if (!tempSettings.onlyLowercaseX && value.contains("X")) { + console.log(`Set of characters should not contain the marker for canceled tasks (X): ${value}`); } else if (tempSettings.supportCanceledTasks && value.contains("-")) { - console.log(`Set of characters should not contain the marker for canceled tasks: ${value}`); + console.log(`Set of characters should not contain the marker for canceled tasks (-): ${value}`); } else { if (!value.contains(" ")) { value = " " + value; @@ -348,7 +382,7 @@ var TaskCollectorSettingsTab = class extends import_obsidian2.PluginSettingTab { console.log(`Error parsing specified date format: ${value}`); } }))); - new import_obsidian2.Setting(this.containerEl).setName("Remove text in completed task").setDesc("Text matching this regular expression should be removed from the task text. Be careful! Test your expression separately. The global flag, 'g' is used for a per-line match.").addText((text) => text.setPlaceholder(" #(todo|task)").setValue(tempSettings.removeExpression).onChange((value) => __async(this, null, function* () { + new import_obsidian2.Setting(this.containerEl).setName("Remove text in completed task").setDesc("Text matching this regular expression should be removed from the task text. Be careful! Test your expression first. The global flag, 'g' is used for a per-line match.").addText((text) => text.setPlaceholder(" #(todo|task)").setValue(tempSettings.removeExpression).onChange((value) => __async(this, null, function* () { try { this.taskCollector.tryCreateRemoveRegex(value); tempSettings.removeExpression = value; @@ -425,7 +459,7 @@ var TaskMarkModal = class extends import_obsidian3.Modal { } onOpen() { const selector = this.contentEl.createDiv("taskcollector-selector markdown-preview-view"); - const completedTasks = this.taskCollector.settings.supportCanceledTasks ? "xX-" : "xX"; + const completedTasks = (this.taskCollector.settings.onlyLowercaseX ? "x" : "xX") + (this.taskCollector.settings.supportCanceledTasks ? "-" : ""); const completedList = selector.createEl("ul"); completedList.addClass("contains-task-list"); this.addTaskValues(completedList, completedTasks, true); diff --git a/.obsidian/plugins/obsidian-task-collector/manifest.json b/.obsidian/plugins/obsidian-task-collector/manifest.json index 68d2ea31..c4e5a223 100644 --- a/.obsidian/plugins/obsidian-task-collector/manifest.json +++ b/.obsidian/plugins/obsidian-task-collector/manifest.json @@ -1,8 +1,8 @@ { "id": "obsidian-task-collector", "name": "Task Collector (TC)", - "version": "0.7.7", - "minAppVersion": "0.12.10", + "version": "0.7.8", + "minAppVersion": "0.13.10", "description": "Manage completed tasks within a document", "author": "ebullient", "authorUrl": "https://github.com/ebullient", diff --git a/.obsidian/plugins/obsidian-task-collector/styles.css b/.obsidian/plugins/obsidian-task-collector/styles.css index 486e4a52..3e4fde34 100644 --- a/.obsidian/plugins/obsidian-task-collector/styles.css +++ b/.obsidian/plugins/obsidian-task-collector/styles.css @@ -41,7 +41,7 @@ #taskcollector-modal .modal .markdown-preview-view ul > li > span { font-family: var(--font-monospace); } -#taskcollector-modal .modal .markdown-preview-view ul > li > .task-list-item-checkbox { +#taskcollector-modal .modal .markdown-preview-view ul > li.task-list-item .task-list-item-checkbox { margin-right: 4px; margin-left: unset; } diff --git a/.obsidian/workspace b/.obsidian/workspace index f1e5662f..d62a1af3 100644 --- a/.obsidian/workspace +++ b/.obsidian/workspace @@ -9,7 +9,7 @@ "state": { "type": "markdown", "state": { - "file": "01.02 Home/@Main Dashboard.md", + "file": "05.02 Networks/Server Tools.md", "mode": "preview", "source": false } @@ -77,7 +77,7 @@ "state": { "type": "backlink", "state": { - "file": "01.02 Home/@Main Dashboard.md", + "file": "05.02 Networks/Server Tools.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -94,7 +94,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "01.02 Home/@Main Dashboard.md", + "file": "05.02 Networks/Server Tools.md", "linksCollapsed": false, "unlinkedCollapsed": false } @@ -153,15 +153,15 @@ }, "active": "19fe3fd3bef5272b", "lastOpenFiles": [ + "05.02 Networks/Server Tools.md", + "05.02 Networks/VPS Console Dialogue.md", "01.02 Home/@Main Dashboard.md", - "00.01 Admin/Calendars/2022-04-22.md", - "00.01 Admin/Calendars/2022-04-21.md", - "00.01 Admin/Calendars/2022-04-20.md", - "00.02 Inbox/Morning Buns.md", - "00.02 Inbox/Bibimbap.md", - "00.01 Admin/Calendars/2022-04-19.md", - "00.03 News/The improbable endless heroism of Volodymyr Zelensky.md", - "00.03 News/One Last Trip.md", - "00.03 News/The curse of sliced bread.md" + "00.01 Admin/Calendars/2022-04-23.md", + "00.01 Admin/Calendars/2022-04-24.md", + "00.03 News/What happened to Starbucks How a progressive company lost its way.md", + "00.03 News/Babies and chicks help solve one of psychology’s oldest puzzles.md", + "00.03 News/The Miseducation of Maria Montessori.md", + "00.03 News/“The Eye in the Sea” camera observes elusive deep sea animals.md", + "00.03 News/Jeffrey Epstein, a Rare Cello and an Enduring Mystery.md" ] } \ No newline at end of file diff --git a/00.01 Admin/Calendars/2022-04-18.md b/00.01 Admin/Calendars/2022-04-18.md index 10cf0ee0..cd70efe3 100644 --- a/00.01 Admin/Calendars/2022-04-18.md +++ b/00.01 Admin/Calendars/2022-04-18.md @@ -89,10 +89,10 @@ This section does serve for quick memos. %% ### %%   -- [ ] 12:49 [[2022-04-18|Memo]], [[@Lifestyle]]: check the Tennis Club at the top of the mountain 📆2022-04-23 +- [x] 12:49 [[2022-04-18|Memo]], [[@Lifestyle]]: check the Tennis Club at the top of the mountain 📅 2022-04-23 ✅ 2022-04-23 - [ ] 14:12 [[2022-04-18|Memo]], [[@Lifestyle]]: Find a cleaner 📆2022-04-24 -- [ ] 14:30 [[2022-04-18|Memo]], [[Selfhosting]], [[Server Alias]], [[Configuring Fail2ban]]: check (imported) nginx filters 📆2022-04-23 -- [ ] 17:54 [[2022-04-18|Memo]], [[@Lifestyle]]: Look up the afrench sailing circle 📆2022-04-25 +- [x] 14:30 [[2022-04-18|Memo]], [[Selfhosting]], [[Server Alias]], [[Configuring Fail2ban]]: check (imported) nginx filters 📅 2022-04-23 ✅ 2022-04-23 +- [x] 17:54 [[2022-04-18|Memo]], [[@Lifestyle]]: Look up the afrench sailing circle 📅 2022-04-25 ✅ 2022-04-23 --- diff --git a/00.01 Admin/Calendars/2022-04-22.md b/00.01 Admin/Calendars/2022-04-22.md index bf679c49..8bac009f 100644 --- a/00.01 Admin/Calendars/2022-04-22.md +++ b/00.01 Admin/Calendars/2022-04-22.md @@ -13,9 +13,9 @@ Stress: 40 FrontHeadBar: 5 EarHeadBar: 45 BackHeadBar: 35 -Water: 0.5 -Coffee: 2 -Steps: +Water: 2.5 +Coffee: 5 +Steps: 12100 Ski: Riding: Racket: diff --git a/00.01 Admin/Calendars/2022-04-23.md b/00.01 Admin/Calendars/2022-04-23.md new file mode 100644 index 00000000..0d7de7f9 --- /dev/null +++ b/00.01 Admin/Calendars/2022-04-23.md @@ -0,0 +1,104 @@ +--- + +Date: 2022-04-23 +DocType: Note +Hierarchy: +TimeStamp: +location: +CollapseMetaTable: Yes +Sleep: 9.5 +Happiness: 90 +Gratefulness: 90 +Stress: 40 +FrontHeadBar: 5 +EarHeadBar: 45 +BackHeadBar: 35 +Water: 2 +Coffee: 4 +Steps: 10714 +Ski: +Riding: +Racket: +Football: +title: "Daily Note" +allDay: true +date: 2022-04-23 + +--- + +%% Parent:: [[@Life Admin]] %% + +--- + +[[2022-04-22|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2022-04-24|🗓 Next >>]] + +--- + +  + +```button +name Record today's health +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-2022-04-23Edit + +```button +name Save +type command +action Save current file +id Save +``` +^button-2022-04-23NSave + +  + +# 2022-04-23 + +  + +```ad-abstract +title: Summary +collapse: open +Note Description +``` + +  + +```toc +style: number +``` + +  + +--- + +  + +### Memos + +  + +#### Memos + +This section does serve for quick memos. + +  + + +%% ### %% +  + +--- + +  + +### Notes + +  + +Loret ipsum + +  +  \ No newline at end of file diff --git a/00.01 Admin/Calendars/2022-04-24 2nd tour élections présidentielles.md b/00.01 Admin/Calendars/2022-04-24 2nd tour élections présidentielles.md index 1bf01579..9c292b1e 100644 --- a/00.01 Admin/Calendars/2022-04-24 2nd tour élections présidentielles.md +++ b/00.01 Admin/Calendars/2022-04-24 2nd tour élections présidentielles.md @@ -5,4 +5,4 @@ date: 2022-04-24 endDate: 2022-04-25 --- -2nd tour des élections présidentielles le [[2022-04-24|24 Avril]]. \ No newline at end of file +2nd tour des élections présidentielles le [[2022-04-24|24 Avril]] à [[@@Paris|Paris]]. \ No newline at end of file diff --git a/00.01 Admin/Calendars/2022-04-24.md b/00.01 Admin/Calendars/2022-04-24.md new file mode 100644 index 00000000..9a9135c4 --- /dev/null +++ b/00.01 Admin/Calendars/2022-04-24.md @@ -0,0 +1,104 @@ +--- + +Date: 2022-04-24 +DocType: Note +Hierarchy: +TimeStamp: +location: +CollapseMetaTable: Yes +Sleep: 8 +Happiness: 90 +Gratefulness: 90 +Stress: 40 +FrontHeadBar: 5 +EarHeadBar: 45 +BackHeadBar: 35 +Water: +Coffee: +Steps: +Ski: +Riding: +Racket: +Football: +title: "Daily Note" +allDay: true +date: 2022-04-24 + +--- + +%% Parent:: [[@Life Admin]] %% + +--- + +[[2022-04-23|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2022-04-25|🗓 Next >>]] + +--- + +  + +```button +name Record today's health +type command +action MetaEdit: Run MetaEdit +id EditMetaData +``` +^button-2022-04-24Edit + +```button +name Save +type command +action Save current file +id Save +``` +^button-2022-04-24NSave + +  + +# 2022-04-24 + +  + +```ad-abstract +title: Summary +collapse: open +Note Description +``` + +  + +```toc +style: number +``` + +  + +--- + +  + +### Memos + +  + +#### Memos + +This section does serve for quick memos. + +  + + +%% ### %% +  + +--- + +  + +### Notes + +  + +Loret ipsum + +  +  \ No newline at end of file diff --git a/00.03 News/Babies and chicks help solve one of psychology’s oldest puzzles.md b/00.03 News/Babies and chicks help solve one of psychology’s oldest puzzles.md index 8f25dc26..6d94fd93 100644 --- a/00.03 News/Babies and chicks help solve one of psychology’s oldest puzzles.md +++ b/00.03 News/Babies and chicks help solve one of psychology’s oldest puzzles.md @@ -13,7 +13,7 @@ CollapseMetaTable: Yes --- Parent:: [[@News|News]] -Read:: No +Read:: [[2022-04-23]] --- diff --git a/00.03 News/Jeffrey Epstein, a Rare Cello and an Enduring Mystery.md b/00.03 News/Jeffrey Epstein, a Rare Cello and an Enduring Mystery.md new file mode 100644 index 00000000..274a024a --- /dev/null +++ b/00.03 News/Jeffrey Epstein, a Rare Cello and an Enduring Mystery.md @@ -0,0 +1,208 @@ +--- + +Alias: [""] +Tag: ["Society", "Crime", "Epstein"] +Date: 2022-04-23 +DocType: "WebClipping" +Hierarchy: +TimeStamp: 2022-04-23 +Link: https://www.nytimes.com/2022/04/22/business/jeffrey-epstein-william-derosa.html +location: +CollapseMetaTable: Yes + +--- + +Parent:: [[@News|News]] +Read:: No + +--- + +  + +```button +name Save +type command +action Save current file +id Save +``` +^button-JeffreyEpsteinaRareCelloandanEnduringMysteryNSave + +  + +# Jeffrey Epstein, a Rare Cello and an Enduring Mystery + +![](https://static01.nyt.com/images/2022/04/24/business/24epstein-cello-illo/24epstein-cello-illo-articleLarge.jpg?quality=75&auto=webp&disable=upscale) + +Credit...Joan Wong + +The Great Read + +A cello’s strange odyssey helps explain how the notorious Mr. Epstein surrounded himself with the world’s richest and most powerful men. + +Credit...Joan Wong + +- April 22, 2022 + +When Jeffrey Epstein died in jail in 2019, he took many secrets with him. One was how a sexual predator and college dropout managed to forge bonds with an astonishing number of the world’s richest and most powerful men, like Britain’s Prince Andrew and the crown prince of Saudi Arabia. + +Another was why Mr. Epstein owned a rare Italian cello. It was the only nonfinancial asset listed on his foundation’s annual tax forms, described simply as “cello” and carried on the books at a value of $165,676. + +Mr. Epstein had never played the cello or shown any interest in musical instruments as an investment. + +The first mystery is large, and it is still being untangled by lawyers, victims and journalists. The second is seemingly small, contained to the rarefied world of fine string instruments. But the two mysteries are connected. And the cello’s strange journey into and out of Mr. Epstein’s possession offers a window into the notorious criminal’s life and legacy. + +Mr. Epstein’s Manhattan mansion was filled with curiosities. There was a portrait of Bill Clinton in a blue dress, a stuffed giraffe, prosthetic breasts in the master bathroom. + +But more than objects, Mr. Epstein collected people. Over the years he cultivated leaders in the fields of business, finance, politics, science, mathematics, academia, music, even yoga. He often cemented the relationships with introductions to others in his orbit, donations to causes they supported or other gifts and favors. + +That is where the cello came in. + +## False Claims and Accordion Lessons + +As a child growing up in Brooklyn, Mr. Epstein and his younger brother, Mark, showed an aptitude for music. Both began lessons on the saxophone, then switched to more difficult double-reed instruments. Jeffrey played the bassoon, Mark the oboe, both in high demand in orchestras and other ensembles. It was as a bassoonist that Jeffrey earned a scholarship in 1967 to Interlochen, the prestigious summer music camp nestled in the woods of northern Michigan. When his mother visited him that summer, he asked her to bring bagels. + +As an adult, Mr. Epstein falsely claimed to have had a budding career as a concert pianist. And he claimed to have begun piano lessons at age 5, which Mark Epstein said in an interview was not true. (He took lessons on the accordion as a young boy.) Mr. Epstein later took piano lessons, but he never achieved more than a high-school level of proficiency. + +It was the cello that became a recurring motif in Mr. Epstein’s self-told life story, starting after he and a friend backpacked in Europe in the early 1970s. Among the stories Mr. Epstein later recounted was playing the piano for Jacqueline du Pré, the British cello virtuoso. In Mr. Epstein’s telling, he met Ms. du Pré in 1971 while visiting London. Ms. du Pré enjoyed the patronage of Queen Elizabeth II, and it was through the cellist that Mr. Epstein said he’d gained access to members of the British royal family, forging an especially close friendship with Prince Andrew. + +Image + +![Mr. Epstein claimed to have met the cellist Jacqueline du Pré in London in 1971, and to have accompanied her.](https://static01.nyt.com/images/2022/04/24/business/00epstein-cello-dupre/merlin_205691529_76398195-11c2-48fc-a017-76317eae1561-articleLarge.jpg?quality=75&auto=webp&disable=upscale) + +Credit...Hulton-Deutsch Collection/Corbis via Getty Images + +The tale was not entirely implausible. Ms. du Pré, who died in 1987, was still performing at the time Mr. Epstein visited London, where he bought a full-length fur coat that he wore for years afterward. But Ms. du Pré hardly needed Mr. Epstein as an accompanist, since, among the world’s countless other professional musicians, she was married to the celebrated pianist Daniel Barenboim. + +At Interlochen, to which Mr. Epstein became a significant donor and regular visitor, he met and befriended a 14-year-old cellist, Melissa Solomon, in 1997. According to her account in [a 2019 podcast](https://www.stitcher.com/show/broken-jeffrey-epstein/episode/s1-e4-where-the-strings-are-64497040), he insisted she apply to Juilliard and agreed to pay her tuition there. She said he never attempted to have sex with her (he did get her to massage his feet), but after she declined to attend a party with Prince Andrew, Mr. Epstein cut ties and stopped paying her tuition. + +Another Interlochen student, identified only as Jane, testified in the recent trial of Mr. Epstein’s closest associate, Ghislaine Maxwell. Jane said that Mr. Epstein and Ms. Maxwell began grooming her when she was a 13-year-old student at the camp and that Mr. Epstein subsequently raped her, all while promising to advance her career. + +## Thanksgiving at the Ranch + +In the mid-1990s, Mr. Epstein showed up backstage at the Kravis Center in West Palm Beach, Fla., after a performance by the cellist William DeRosa, a young prodigy who’d made his concert debut with the Los Angeles Philharmonic at age 11. By the time Mr. Epstein saw him, Mr. DeRosa was regarded as one of the world’s best cellists, performing at Carnegie Hall, on television and with leading symphony orchestras. + +Image + +Credit...Peter Schaaf/ICM Artists + +Mr. Epstein’s and Mr. DeRosa’s paths didn’t cross again until around 2004, when Mr. DeRosa began dating a blond model named Kersti Ferguson. + +Originally from Savannah, Ga., Ms. Ferguson said in an interview that she met Mr. Epstein through a mutual friend when she was 18. Ms. Ferguson and Mr. Epstein spent time at his Palm Beach estate, where she met Ms. Maxwell. Mr. Epstein invited Ms. Ferguson to his Virgin Islands estate while she was in college, and after she broke up with a boyfriend, Mr. Epstein flew her and her mother to his New Mexico ranch for Thanksgiving. He sometimes called her four times a day. He showed her photos of himself with what he said were his powerful friends, among them former President Bill Clinton, the Microsoft co-founder Bill Gates, the Israeli prime minister Ehud Barak and Mohammed bin Salman, the crown prince of Saudi Arabia. + +After she began dating Mr. DeRosa, Mr. Epstein insisted on checking him out. “Be nice,” Mr. DeRosa recalled Mr. Epstein warning him. He seemed fascinated by Mr. DeRosa’s musical talents. He once suggested they play together, but Mr. DeRosa brushed him off. He said he had never heard Mr. Epstein play the piano. + +Mr. DeRosa and Mr. Epstein discussed their shared admiration for Ms. du Pré, with whom Mr. DeRosa had spent a summer studying and living. Mr. DeRosa had a collection of every recording Ms. du Pré had released, and he and Mr. Epstein sometimes listened to them together. When Mr. Epstein asked to borrow them, Mr. DeRosa obliged. (He said Mr. Epstein never returned them.) + +In 2006, Mr. Epstein [was arrested](https://www.nytimes.com/2006/09/03/us/03epstein.html) in Florida after investigators found evidence that he’d been sexually involved with girls. Ms. Ferguson said Mr. Epstein never suggested having sex with her or asked her to recruit other young women. On the contrary, when Ms. Ferguson attempted to hug him, he’d “shrivel up,” she said, as if afraid of catching a disease. And she thought he and Ms. Maxwell were in love, even though Mr. Epstein confided in Ms. Ferguson that he had no intention of marrying. + +## Rich and Powerful + +Image + +Credit...Ruby Washington/The New York Times + +For a time after his arrest, Ms. Ferguson didn’t hear from him. Mr. Epstein pleaded guilty to soliciting an underage prostitute and [was sentenced](https://www.nytimes.com/2020/11/12/us/politics/jeffrey-epstein-justice-department-miami.html) to 13 months in jail, though he was allowed to serve much of that time at home. + +Then, in 2010, as Mr. Epstein was trying to reconstitute his orbit of the rich and powerful, he called her. “I need to buy a cello,” Mr. Epstein said abruptly, asking if she would enlist Mr. DeRosa in the search. When Mr. Epstein next spoke to Mr. DeRosa, he explained that he was buying a cello for a young Israeli cellist. “Go find one,” he ordered, then hung up. + +At first Mr. DeRosa didn’t take Mr. Epstein’s command seriously. But Mr. Epstein kept calling, as did members of his staff, asking if he’d made any progress. Mr. DeRosa got to work tracking down a cello. + +Like many professional musicians, Mr. DeRosa was wired into the small world of rare string instruments, a few of which command prices as high as $20 million. His own cello, made by the Italian master Domenico Montagnana in 1739, is considered one of the world’s finest and is likely worth millions of dollars. Mr. DeRosa assured Mr. Epstein he wouldn’t have to spend that much. + +Soon after, Mr. DeRosa was visiting his mother in Los Angeles when he learned of a cello being sold there by a musician who recorded soundtracks for Hollywood studios. (Before that, the cello had been played by a member of the Indianapolis symphony orchestra.) + +While not a Stradivarius or a Montagnana, this cello had a distinguished pedigree, and was manufactured by Ettore Soffritti, who worked in the string instrument center of Ferrara, Italy, from the late 1800s until his death in 1928. Benning Violins, the Los Angeles dealer, described the cello’s sound as “rich and powerful” and said the instrument was “suitable for the finest of cellists.” + +Mr. DeRosa tried the cello. He was smitten. He said he considered it “one of the greatest modern cellos in existence.” (By “modern” he meant any produced after the Italian Renaissance.) With an asking price of $185,000, he also considered it a bargain. + +Mr. Epstein seemed pleased when Mr. DeRosa told him he’d found something. He said the cello’s intended recipient — a young Israeli man named Yoed Nir — had to test the instrument first. Mr. DeRosa knew nearly every up-and-coming cellist, but he had never heard of Mr. Nir. + +Mr. DeRosa had the cello on a trial basis, and Mr. Nir tested the instrument on a visit to Mr. DeRosa’s mother’s house in Los Angeles. Mr. Nir, who was about 30 years old and had dark, shoulder-length hair, which he tossed theatrically while playing, played some of Bach’s unaccompanied cello suites. He had clearly had musical training (he was a graduate of the Jerusalem Academy of Music and Dance), but Mr. DeRosa considered his playing unexceptional by his exacting standards. He could think of many young cellists more deserving of such an instrument. “I thought it incredibly odd that Jeffrey had chosen this guy,” Mr. DeRosa recalled. + +Mr. Nir approved of the instrument, and Mr. Epstein had his accountant, Richard Kahn, step in to negotiate the purchase from Benning Violins. Mr. Kahn obtained an appraisal, then bargained down the price to $165,000. (Mr. DeRosa, who felt like his reputation was on the line since he’d initiated the transaction, found this insulting.) + +When Mr. Epstein refused to buy an economy class ticket to fly the instrument back to New York — the usual method for transporting a valuable cello — Mr. DeRosa sent him an angry email accusing him of being a cheapskate. “I’m done,” he told Mr. Epstein. + +“Why are you so agitated?” Mr. Epstein responded. + +## ‘You Can’t Treat Someone Like That’ + +Weeks later, when Mr. DeRosa was back in New York, Mr. Epstein’s assistant called and said Mr. DeRosa should be at his house the next morning at exactly 7:30 a.m. There, Mr. Epstein gestured toward a large unopened cardboard box. Mr. DeRosa said he opened the package and verified that it was same cello he’d located in Los Angeles. + +“Did you make any money on the transaction?” Mr. Epstein asked. + +“No,” Mr. DeRosa answered, furious at the insinuation that he’d taken a cut. + +Mr. Epstein walked out without further comment. “He showed no interest in the cello,” Mr. DeRosa recalled. + +Ms. Ferguson was upset when she heard about the meeting. She called Mr. Epstein and chastised him. “You can’t treat someone like that,” she said. He was unapologetic. + +The money to buy the cello came from Mr. Epstein’s foundation, and the purchase was reflected on its 2011 tax return. Mr. Kahn drew up an agreement in which the cello would be lent to Mr. Nir at no cost, according to a person familiar with the arrangement. + +Image + +Credit...Michelle V. Agins/The New York Times + +Not long after, the singer Judy Collins performed at the Café Carlyle. A [positive review](https://www.nytimes.com/2011/02/17/arts/music/17collins.html) in The New York Times mentioned in passing that Ms. Collins had “added a new element, a cellist, Yoed Nir.” + +Mr. Epstein and Ms. Ferguson subsequently papered over their disagreement, and she urged Mr. DeRosa to forgive him. When a valuable Stradivarius cello came on the market, Mr. Epstein offered to buy it for Mr. DeRosa’s use. Mr. DeRosa had a unique connection to the instrument, since a foundation had previously owned it and lent it to him early in his career. + +So confident was the seller that a deal would come together that Mr. DeRosa took possession of the instrument. But Mr. Epstein balked at the asking price of $14 million, refusing to pay more than $10 million, according to Mr. DeRosa. The deal unraveled, and Mr. DeRosa returned the cello. It later sold for more than the asking price, Mr. DeRosa said. + +## Mr. DeRosa Has Regrets + +Mr. DeRosa and Ms. Ferguson were shocked in 2019 when Mr. Epstein was arrested and charged with sex trafficking. Ms. Ferguson couldn’t reconcile the allegations with the man she thought she knew. Given his wealth and connections to powerful people, she figured he’d somehow get off the hook. She wrote him a letter in jail offering to visit and bring food. She never got a reply. On Aug. 10, Mr. Epstein [died by suicide](https://www.nytimes.com/2019/08/10/nyregion/jeffrey-epstein-suicide.html). + +Several months later, Mr. DeRosa emailed Mr. Nir to find out what had happened to the Soffritti cello. Mr. Nir said only that he’d returned it. At the Epstein foundation’s request, Mr. Nir had delivered the cello to a New York law firm in October 2019. Its case was broken, and the cello itself had suffered some damage, according to Mr. DeRosa. (Mr. Nir said the case wasn’t broken when he returned it and that the instrument was “in very good playing condition.”) The foundation asked Benning Violins to again market and sell it, and Benning agreed to supply a new case. + +Wittingly or not, Mr. Epstein had made a sound investment. This time the price was $220,000 — or 33 percent more than what Mr. Epstein had paid eight years earlier. With the backing of a financial partner whom Mr. DeRosa wouldn’t identify, he took possession of the cello in early 2020, just before the coronavirus pandemic brought an end to live performances. + +Like many people in Mr. Epstein’s orbit, Mr. DeRosa now regrets ever getting tangled up with him and wishes he had kept the cello for himself. “I wish I’d never let Jeffrey buy the cello,” Mr. DeRosa said. “I’m not a dealer. I’m a concert cellist. I was always angry at myself that I let it go.” + +## Back on the Market + +Two years later, the Epstein cello was back on the market. + +All of Mr. DeRosa’s performances during the pandemic were canceled. An extra cello was a luxury he could no longer afford. + +Julian Hersh, a cellist and co-founder of Darnton & Hersh violins in Chicago, thought the cello might be useful to a company he was starting with Jonathan Koh, a music faculty member at University of California, Berkeley. There Mr. Koh had witnessed Silicon Valley’s fascination with the blockchain, cryptocurrencies and nonfungible tokens. His idea was to market digital images of rare instruments, or fractional shares of them, as N.F.T.s, in some cases along with videos of professional musicians playing the instruments. He and Mr. Hersh reasoned that rare instruments were works of art, and if an N.F.T. for a work by the artist known as Beeple could [sell at Christie’s](https://www.nytimes.com/2021/03/11/arts/design/nft-auction-christies-beeple.html) in 2020 for $69 million, why not a token for a rare instrument? Payment would be exclusively in cryptocurrency, adding to the allure for a new generation of investors. + +Image + +Credit...Peter Prato for The New York Times + +Mr. Hersh wasn’t deterred by the cello’s provenance. “Jeffrey was horrible,” he said. “No question about it.” But there was a clear title — in other words, there was no dispute over the cello’s ownership — which was what really mattered to investors. + +Mr. Hersh and Mr. Koh launched their new venture, called Musikhaus, in January. They described its mission as “bridging the worlds of classical music with the rapidly evolving world of nonfungible tokens” to “make timeless digital collectibles.” Among the first offerings was the Epstein cello. + +The listing came just days after [Ms. Maxwell’s conviction](https://www.nytimes.com/2021/12/29/nyregion/ghislaine-maxwell-guilty-verdict.html) for sex trafficking and conspiracy, which thrust the Epstein saga back into the news. Dealers and collectors grimaced at what seemed an attempt to capitalize on Mr. Epstein’s notoriety. “The timing was terrible,” Mr. Hersh acknowledged. The Epstein connection “was just too hot. I blame myself.” + +At first Mr. Hersh removed the reference to Mr. Epstein from the cello’s description, but he then decided the provenance shouldn’t be concealed. He removed the listing from their website altogether. He hopes to re-list the Soffritti N.F.T. in the future. “So what if Jeffrey owned it?” Mr. Hersh said. “It’s still one of the best 20th-century cellos in the world.” + +## A Clue at the Cafe + +The mystery persists: Why had Mr. Epstein bought the cello in the first place? What was his connection to Mr. Nir? + +An important clue emerged at the 2011 Judy Collins concert at the Café Carlyle. Ms. Collins’s longtime musical arranger and pianist, Russell Walden, recalled that one thing about the evening stuck in his memory. At the cafe, he met Mr. Nir’s wife, Anat. Mr. Nir mentioned that she was the daughter of Mr. Barak, the former Israeli prime minister. + +There are hardly any public references to Mr. Barak’s children. Reached recently in Tel Aviv, he confirmed that Yoed and Anat Nir are his son-in-law and daughter. + +Image + +Credit...Corinna Kern/Reuters + +Mr. Barak — who was prime minister from 1999 to 2001 and later served in other high-ranking government jobs — said that another former prime minister, Shimon Peres, introduced him to Mr. Epstein in 2003. Mr. Barak has said that he and Mr. Epstein met dozens of times but he “never took part in any party or event with women or anything like that.” + +Over the years Mr. Epstein wooed Mr. Barak by, among other things, [investing $1 million](https://www.nytimes.com/2019/07/16/world/middleeast/epstein-israel-barak-ehud.html) in a limited partnership established by Mr. Barak in 2015. + +He said he introduced Mr. Epstein to Mr. Nir in 2010 or 2011, though he didn’t know that Mr. Epstein subsequently lent Mr. Nir the cello. Therefore, Mr. Barak said, it “could not be true” that Mr. Epstein used the cello loan to curry favor. A more likely explanation, he said, “is that Mr. Epstein did it based on the reputation of Yoed as an extremely gifted cellist.” (Asked if he’d ever told his father-in-law about the loan, Mr. Nir declined to answer.) + +Nonetheless, the loan of a $165,000 cello was the kind of favor that Mr. Epstein might only have made known when he wanted something in return. After all, not just anybody had the resources and connections to source an extraordinary cello for the relative of a powerful political leader — just the type of person that Mr. Epstein had a knack for keeping close. + +Ronen Bergman contributed reporting. Susan Beachy contributed research. + +  +  + +--- +`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))` \ No newline at end of file diff --git a/00.03 News/The Man Behind Ethereum Is Worried About Crypto's Future 1.md b/00.03 News/The Man Behind Ethereum Is Worried About Crypto's Future 1.md deleted file mode 100644 index 10cf97c0..00000000 --- a/00.03 News/The Man Behind Ethereum Is Worried About Crypto's Future 1.md +++ /dev/null @@ -1,195 +0,0 @@ ---- - -dg-publish: true -Alias: [""] -Tag: ["Tech", "Crypto", "Ethereum"] -Date: 2022-03-21 -DocType: "WebClipping" -Hierarchy: -TimeStamp: 2022-03-21 -Link: https://time.com/6158182/vitalik-buterin-ethereum-profile/ -location: -CollapseMetaTable: Yes - ---- - -Parent:: [[@News|News]] -Read:: No - ---- - -  - -```button -name Save -type command -action Save current file -id Save -``` -^button-TheManBehindEthereumIsWorriedAboutCryptoFutureNSave - -  - -# The Man Behind Ethereum Is Worried About Crypto's Future - -In a few minutes, electronic music will start pulsing, stuffed animals will be flung through the air, women will emerge spinning Technicolor hula hoops, and a mechanical bull will rev into action, bucking off one delighted rider after another. It’s the closing party of ETHDenver, a weeklong cryptocurrency conference [dedicated to the blockchain Ethereum](https://time.com/6147486/ethereum-book-cryptopians/). Lines have stretched around the block for days. Now, on this Sunday night in February, the giddy energy is peaking. - -But as the crowd pushes inside, a wiry man with elfin features is sprinting out of the venue, past astonished selfie takers and venture capitalists. Some call out, imploring him to stay; others even chase him down the street, on foot and on scooters. Yet the man outruns them all, disappearing into the privacy of his hotel lobby, alone. - -Vitalik Buterin, the most influential person in crypto, didn’t come to Denver to party. He doesn’t drink or particularly enjoy crowds. Not that there isn’t plenty for the 28-year-old creator of Ethereum to celebrate. Nine years ago, Buterin dreamed up Ethereum as a way to leverage the blockchain technology underlying Bitcoin for all sorts of uses beyond currency. Since then, it has emerged as the bedrock layer of what advocates say will be a new, [open-source, decentralized internet](https://time.com/6150884/ukraine-russia-attack-open-source-intelligence/). Ether, the platform’s native currency, has become the second biggest cryptocurrency behind Bitcoin, powering a trillion-dollar ecosystem that [rivals Visa](https://stark.mirror.xyz/q3OnsK7mvfGtTQ72nfoxLyEV5lfYOqUfJIoKBx7BG1I) in terms of the money it moves. Ethereum has brought thousands of unbanked people around the world into financial systems, allowed capital to flow unencumbered across borders, and provided the infrastructure for entrepreneurs to build all sorts of new products, from payment systems to prediction markets, digital swap meets to medical-research hubs. - -![](https://api.time.com/wp-content/uploads/2022/03/TIM220328_Buterin.Cover_.FINAL2_.jpg) - -Photograph by Benjamin Rasmussen for TIME - -But even as crypto has soared in value and volume, Buterin has watched the world he created evolve with a mixture of pride and dread. Ethereum has made a handful of white men unfathomably rich, pumped [pollutants into the air](https://time.com/6120237/nfts-environmental-impact/), and emerged as a vehicle for tax evasion, [money laundering,](https://www.bbc.com/news/technology-60072195) and mind-boggling scams. “Crypto itself has a lot of dystopian potential if implemented wrong,” the Russian-born Canadian explains the morning after the party in an 80-minute interview in his hotel room. - -Buterin worries about the dangers to overeager investors, the soaring transaction fees, and the shameless displays of wealth that have come to dominate [public perception of crypto](https://time.com/6120237/nfts-environmental-impact/). “The peril is you have these $3 million monkeys and it becomes a different kind of gambling,” he says, referring to the Bored Ape Yacht Club, an überpopular NFT collection of garish primate cartoons that has become a digital-age status symbol for millionaires including [Jimmy Fallon and Paris Hilton](https://www.latimes.com/business/technology/story/2022-01-26/jimmy-fallon-nft-ape-nbc), and which have traded for more than $1 million a pop. “There definitely are lots of people that are just buying yachts and [Lambos](https://digiday.com/marketing/lambo-lamborghini-became-status-brand-crypto-boom/).” - -**Read More:** *[Politicians Show Their Increasing Interest In Crypto at ETHDenver 2022](https://time.com/6150430/ethdenver-2022-recap/)* - -Buterin hopes Ethereum will become the launchpad for all sorts of sociopolitical experimentation: fairer voting systems, urban planning, universal basic income, public-works projects. Above all, he wants the platform to be a counterweight to authoritarian governments and to upend Silicon Valley’s stranglehold over our digital lives. But he acknowledges that his vision for the transformative power of Ethereum is at risk of being overtaken by greed. And so he has reluctantly begun to take on a bigger public role in shaping its future. “If we don’t exercise our voice, the only things that get built are the things that are immediately profitable,” he says, reedy voice rising and falling as he fidgets his hands and sticks his toes between the cushions of a lumpy gray couch. “And those are often far from what’s actually the best for the world.” - -The irony is that despite all of Buterin’s cachet, he may not have the ability to prevent Ethereum from veering off course. That’s because he designed it as a decentralized platform, responsive not only to his own vision but also to the will of its builders, investors, and ever sprawling community. Buterin is not the formal leader of Ethereum. And he fundamentally rejects the idea that anyone should hold unilateral power over its future. - -![](https://api.time.com/wp-content/uploads/2022/03/vitalik-buterin-ethereum-ethdenver-keynote.jpg) - -Buterin dons Shiba Inu pajama pants onstage at ETHDenver - -Benjamin Rasmussen for TIME - -Which has left Buterin reliant on the limited tools of soft power: writing blog posts, giving interviews, conducting research, speaking at conferences where many attendees just want to bask in the glow of their newfound riches. “I’ve been yelling a lot, and sometimes that yelling does feel like howling into the wind,” he says, his eyes darting across the room. Whether or not his approach works (and how much sway Buterin has over his own brainchild) may be the difference between a future in which Ethereum becomes the basis of a new era of digital life, and one in which it’s just another instrument of financial speculation—credit-default swaps with a utopian patina. - -**Three days after** the music stops at ETHDenver, Buterin’s attention turns across the world, back to the region where he was born. In the war launched by Russian President Vladimir Putin, cryptocurrency almost immediately became a tool of Ukrainian resistance. [More than $100 million](https://time.com/6153320/crypto-ukraine-charity/) in crypto was raised in the invasion’s first three weeks for the Ukrainian government and NGOs. Cryptocurrency has also provided a lifeline for some fleeing Ukrainians whose banks are inaccessible. At the same time, regulators worry that it will be used by Russian oligarchs to evade sanctions. - -Buterin has sprung into action too, matching hundreds of thousands of dollars in grants toward relief efforts and publicly lambasting Putin’s decision to invade. “One silver lining of the situation in the last three weeks is that it has reminded a lot of people in the crypto space that ultimately the goal of crypto is not to play games with million-dollar pictures of monkeys, it’s to do things that accomplish meaningful effects in the real world,” Buterin wrote in an email to TIME on March 14**.** - -His outspoken advocacy marks a change for a leader who has been slow to find his political voice. “One of the decisions I made in 2022 is to try to be more risk-taking and less neutral,” Buterin says. “I would rather Ethereum offend some people than turn into something that stands for nothing.” - -The war is personal to Buterin, who has both Russian and Ukrainian ancestry. He was born outside Moscow in 1994 to two computer scientists, Dmitry Buterin and Natalia Ameline, a few years after the fall of the Soviet Union. Monetary and social systems had collapsed; his mother’s parents lost their life savings [amid rising inflation](https://time.com/6152697/inflation-democrats-midterm-elections-2022/). “Growing up in the USSR, I didn’t realize most of the stuff I’d been told in school that was good, like communism, was all propaganda,” explains Dmitry. “So I wanted Vitalik to question conventions and beliefs, and he grew up very independent as a thinker.” - -The family initially lived in a university dorm room with a shared bathroom. There were no disposable diapers available, so his parents washed his by hand. Vitalik grew up with a turbulent, teeming mind. Dmitry says Vitalik learned how to read before he could sleep through the night, and was slow to form sentences compared with his peers. “Because his mind was going so fast,” Dmitry recalls, “it was actually hard for him to express himself verbally for some time.” - -Instead, Vitalik gravitated to the clarity of numbers. At 4, he inherited his parents’ old IBM computer and started playing around with Excel spreadsheets. At 7, he could recite more than a hundred digits of pi, and would shout out math equations to pass the time. By 12, he was coding inside Microsoft Office Suite. The precocious child’s isolation from his peers had been exacerbated by a move to Toronto in 2000, the same year Putin was first elected. His father characterizes Vitalik’s Canadian upbringing as “lucky and naive.” Vitalik himself uses the words “lonely and disconnected.” - -![](https://api.time.com/wp-content/uploads/2022/03/vitalik-buterin-ethereum-childhood-ibm.jpg) - -Buterin on his IBM - -Courtesy Dmitry Buterin - -In 2011, Dmitry introduced Vitalik to Bitcoin, which had been created in the wake of the 2008 financial crisis. After seeing the collapse of financial systems in both Russia and the U.S., Dmitry was intrigued by the idea of an alternative global money source that was uncontrolled by authorities. Vitalik soon began writing articles exploring the new technology for the magazine Bitcoin Weekly, for which he earned 5 bitcoins a pop (back then, some $4; today, it would be worth about $200,000). - -Even as a teenager, Vitalik Buterin proved to be a pithy writer, able to articulate complex ideas about cryptocurrency and its underlying technology in clear prose. At 18, he co-founded *Bitcoin Magazine* and became its lead writer, earning a following both in Toronto and abroad. “A lot of people think of him as a typical techie engineer,” says Nathan Schneider, a media-studies professor at the University of Colorado, Boulder, who first interviewed Buterin in 2014. “But a core of his practice even more so is observation and writing—and that helped him see a cohesive vision that others weren’t seeing yet.” - -As Buterin learned more about the blockchain technology on which Bitcoin was built, he began to believe using it purely for currency was a waste. The blockchain, he thought, could serve as an efficient method for securing all sorts of assets: web applications, organizations, financial derivatives, nonpredatory loan programs, even wills. Each of these could be operated by “smart contracts,” code that could be programmed to carry out transactions without the need for intermediaries. A decentralized version of the rideshare industry, for example, could be built to send money directly from passengers to drivers, without Uber swiping a cut of the proceeds. - -*Read the rest of Buterin’s interview in TIME’s newsletter Into the Metaverse.* [*Subscribe for a weekly guide to the future of the Internet.*](https://time.com/newsletters/?newsletter_name=metaverse&source=meta_onsite) *You can find* [*past issues of the newsletter here*](https://time.com/tag/into-the-metaverse/)*.* - -In 2013, Buterin dropped out of college and wrote a 36-page white paper laying out his vision for Ethereum: a new open-source blockchain on which programmers could build any sort of application they wished. (Buterin swiped the name from a Wikipedia list of elements from science fiction.) He sent it to friends in the Bitcoin community, who passed it around. Soon a handful of programmers and businessmen around the world sought out Buterin in hopes of helping him bring it to life. Within months, a group of eight men who would become known as Ethereum’s founders were sharing a three-story Airbnb in Switzerland, writing code and [wooing investors](https://time.com/6140467/metaverse-real-estate/). - -While some of the other founders mixed work and play—watching *Game of Thrones,* persuading friends to bring over beer in exchange for Ether IOUs—Buterin mostly kept to himself, coding away on his laptop, according to Laura Shin’s [recent book about the history of Ethereum, *The Cryptopians*](https://time.com/6147486/ethereum-book-cryptopians/). Over time, it became apparent that the group had very different plans for the nascent technology. Buterin wanted a decentralized open platform on which anyone could build anything. Others wanted to use the technology to create a business. One idea was to build the crypto equivalent to Google, in which Ethereum would use customer data to sell targeted ads. The men also squabbled over power and titles. One co-founder, Charles Hoskinson, appointed himself CEO—a designation that was of no interest to Buterin, who joked his title would be C-3PO, after the droid from *Star Wars.* - -The ensuing conflicts left Buterin with culture shock. In the space of a few months, he had gone from a cloistered life of writing code and technical articles to a that of a decisionmaker grappling with bloated egos and power struggles. His vision for Ethereum hung in the balance. “The biggest divide was definitely that a lot of these people cared about making money. For me, that was totally not my goal,” says Buterin, whose net worth is at least $800 million, according to public records on the blockchain whose accuracy was confirmed by a spokesperson. “There were even times at the beginning where I was negotiating down the percentages of the Ether distribution that both myself and the other top-level founders would get, in order to be more egalitarian. That did make them upset.” - -![](https://api.time.com/wp-content/uploads/2022/03/WETHEREUM-graphic.jpg) - -Buterin says the other founders tried to take advantage of his naiveté to push through their own ideas about how Ethereum should run. “People used my fear of regulators against me,” he recalls, “saying that we should have a for-profit entity because it’s so much simpler legally than making a nonprofit.” As tensions rose, the group implored Buterin to make a decision. In June 2014, he asked Hoskinson and Amir Chetrit, two co-founders who were pushing Ethereum to become a business, to leave the group. He then set in motion the creation of the Ethereum Foundation (EF), a nonprofit established to safeguard Ethereum’s infrastructure and fund research and development projects. - -One by one, all the other founders peeled off over the next few years to pursue their own projects, either in tandem with Ethereum or as direct competitors. Some of them remain critical of Buterin’s approach. “In the dichotomy between centralization and anarchy, Ethereum seems to be going toward anarchy,” says Hoskinson, who now leads his own blockchain, Cardano. “We think there’s a middle ground to create some sort of blockchain-based governance system.” - -With the founders splintered, Buterin emerged as Ethereum’s philosophical leader. He had a seat on the EF board and the clout to shape industry trends and move markets with his public pronouncements. He even became known as “V God” in China. But he didn’t exactly step into the power vacuum. “He’s not good at bossing people around,” says Aya Miyaguchi, the executive director of the EF. “From a social-navigation perspective, he was immature. He’s probably still conflict-averse,” says Danny Ryan, a lead researcher at the EF. Buterin calls his struggle to inhabit the role of an organizational leader “my curse for the first few years at Ethereum.” - -It’s not hard to see why. Buterin still does not present stereotypical leadership qualities when you meet him. He sniffles and stutters through his sentences, walks stiffly, and struggles to hold eye contact. He puts almost no effort into his clothing, mostly wearing Uniqlo tees or garments gifted to him by friends. His disheveled appearance has made him an easy target on social media: he [recently shared insults](https://twitter.com/VitalikButerin/status/1481737116514017282) from online hecklers who said he looked like a “Bond villain” or an “alien crackhead.” - -Yet almost everyone who has a full conversation with Buterin comes away starry-eyed. Buterin is wryly funny and almost wholly devoid of pretension or ego. He’s an unabashed geek whose eyes spark when he alights upon one of his favorite concepts, whether it be quadratic voting or the governance system futarchy. Just as Ethereum is designed to be an everything machine, Buterin is an everything thinker, fluent in disciplines ranging from sociological theory to advanced calculus to [land-tax history.](https://vitalik.ca/general/2018/04/20/radical_markets.html) (He’s currently using Duolingo to learn his fifth and sixth languages.) He doesn’t talk down to people, and he eschews a security detail. “An emotional part of me says that once you start going down that way, *professionalizing* is just another word for losing your soul,” he says. - -![](https://api.time.com/wp-content/uploads/2022/03/vitalik-buterin-ethereum-ethdenver-conference.jpg) - -Buterin, seen through a monitor at ETHDenver - -Benjamin Rasmussen for TIME - -Alexis Ohanian, the co-founder of Reddit and a major crypto investor, says being around Buterin gives him “a similar vibe to when I first got to know Sir Tim Berners-Lee,” the inventor of the World Wide Web. “He’s very thoughtful and unassuming,” Ohanian says, “and he’s giving the world some of the most powerful Legos it’s ever seen.” - -For years, Buterin has been grappling with how much power to exercise in Ethereum’s decentralized ecosystem. The first major test came in 2016, when a newly created Ethereum-based fundraising body called the DAO was hacked for $60 million, which amounted at the time to more than 4% of all Ether in circulation. The hack tested the [crypto community’s values](https://time.com/6144332/the-problem-with-nfts-video/): if they truly believed no central authority should override the code governing smart contracts, then thousands of investors would simply have to eat the loss—which could, in turn, encourage more hackers. On the other hand, if Buterin chose to reverse the hack using a maneuver called a hard fork, he would be wielding the same kind of central authority as the financial systems he sought to replace. - -Buterin took a middle ground. He consulted with other Ethereum leaders, wrote blog posts advocating for the hard fork, and watched as the community voted overwhelmingly in favor of that option via forums and petitions. When Ethereum developers created the fork, users and miners had the option to stick with the hacked version of the blockchain. But they overwhelmingly chose the forked version, and Ethereum quickly recovered in value. - -To Buterin, the DAO hack epitomized the promise of a decentralized approach to governance. “Leadership has to rely much more on soft power and less on hard power, so leaders have to actually take into account the feelings of the community and treat them with respect,” he says. “Leadership positions aren’t fixed, so if leaders stop performing, the world forgets about them. And the converse is that it’s very easy for new leaders to rise up.” - -**Over the past few years,** countless leaders have risen up in Ethereum, building all kinds of products, tokens, and subcultures. There was the ICO boom of 2017, in which venture capitalists raised billions of dollars for blockchain projects. There was DeFi summer in 2020, in which new trading mechanisms and derivative structures sent money whizzing around the world at hyperspeed. And there was last year’s explosion of NFTs: tradeable digital goods, like profile pictures, art collections, and sports cards, that skyrocketed in value. - -Skeptics have derided the utility of NFTs, in which billion-dollar economies have been built upon the perceived digital ownership of simple images that can easily be copied and pasted. But they have rapidly become one of the most utilized components of the Ethereum ecosystem. In January, the NFT trading platform OpenSea hit a record $5 billion in monthly sales. - -![](https://api.time.com/wp-content/uploads/2022/03/vitalik-buterin-ethereum-ethdenver-conference-crowd.jpg) - -Conference­goers line up to ask Buterin questions after his keynote - -Benjamin Rasmussen for TIME - -Buterin didn’t predict [the rise of NFTs,](https://time.com/5947911/nft-environmental-toll/) and has watched the phenomenon with a mixture of interest and anxiety. On one hand, they have helped to turbocharge the price of Ether, which has increased more than tenfold in value over the past two years. (Disclosure: I own less than $1,300 worth of Ether, which I purchased in 2021.) But their volume has overwhelmed the network, leading to a steep rise in congestion fees, in which, for instance, bidders trying to secure a rare NFT pay hundreds of dollars extra to make sure their transactions are expedited. - -**Read More:** *[NFT Art Collectors Are Playing a Risky Game—And Winning](https://time.com/6126878/nft-art-collectors/)* - -The fees have undermined some of Buterin’s favorite projects on the blockchain. Take [Proof of Humanity](https://time.com/6142810/proof-of-humanity/), which awards a universal basic income—currently about $40 per month**—**to anyone who signs up. Depending on the week, the network’s congestion fees can make pulling money out of your wallet to pay for basic needs prohibitively expensive. “With fees being the way they are today,” Buterin says, “it really gets to the point where the financial derivatives and the gambley stuff start pricing out some of the cool stuff.” - -Inequities have crept into crypto in other ways, including a stark lack of gender and racial diversity. “It hasn’t been among the things I’ve put a lot of intellectual effort into,” Buterin admits of gender parity. “The ecosystem does need to improve there.” He’s scornful of the dominance of coin voting, a voting process for DAOs that Buterin feels is just a new version of plutocracy, one in which wealthy venture capitalists can make self-interested decisions with little resistance. “It’s become a de facto standard, which is a dystopia I’ve been seeing unfolding over the last few years,” he says. - -These problems have sparked a backlash both inside and outside the blockchain community. [As crypto rockets](https://time.com/6111700/ether-ethereum-record-high/) toward the mainstream, its esoteric jargon, idiosyncratic culture, and financial excesses have been met with widespread disdain. Meanwhile, frustrated users are decamping to newer blockchains like Solana and BNB Chain, driven by the prospect of lower transaction fees, alternative building tools, or different philosophical values. - -Buterin understands why people are moving away from Ethereum. Unlike virtually any other leader in a trillion-dollar industry, he says he’s fine with it—especially given that Ethereum’s current problems stem from the fact that it has too many users. (Losing immense riches doesn’t faze him much, either: last year, he [dumped $6 billion worth of Shiba Inu tokens](https://www.coindesk.com/markets/2021/05/17/vitalik-buterin-burns-6b-in-shib-tokens-says-he-doesnt-want-the-power/) that were gifted to him, explaining that he wanted to give some to charity, help maintain the meme coin’s value, and surrender his role as a “locus of power.”) - -In the meantime, he and the EF—which holds almost a billion dollars worth of Ether in reserve, a representative confirmed—are taking several approaches to improve the ecosystem. Last year, they handed out $27 million to Ethereum-based projects, up from $7.7 million in 2019, to recipients including smart-contract developers and an educational conference in Lagos. - -The EF research team is also working on two crucial technical updates. The first is known as the “merge,” which converts Ethereum from Proof of Work, a form of blockchain verification, to Proof of Stake, which the EF says will reduce Ethereum’s energy usage by [more than 99%](https://blog.ethereum.org/2021/05/18/country-power-no-more/) and make the network more secure. Buterin has been stumping for Proof of Stake since Ethereum’s founding, but repeated delays have turned implementation into a *Waiting for Godot*–style drama. At ETHDenver, the EF researcher Danny Ryan declared that the merge would happen within the next six months, unless “something insanely catastrophic” happens. The same day, Buterin encouraged companies worried about the environmental impact to delay using Ethereum until the merge is completed—even if it “gets delayed until 2025.” - -![](https://api.time.com/wp-content/uploads/2022/03/vitalik-buterin-ethereum-ethdenver-nft-gallery.jpg) - -ETHDenver attendee Brent Burdick checks his phone in an NFT gallery room - -Benjamin Rasmussen for TIME - -In January, Moxie Marlinspike, co-founder of the messaging app Signal, wrote a [widely read critique](https://moxie.org/2022/01/07/web3-first-impressions.html) noting that despite its collectivist mantras, so-called web3 was already coalescing around centralized platforms. As he often does when faced with legitimate criticism, Buterin responded with a [thoughtful, detailed post](https://np.reddit.com/r/ethereum/comments/ryk3it/my_first_impressions_of_web3/hrrz15r/) on Reddit. “The properly authenticated decentralized blockchain world is coming, and is much closer to being here than many people think,” he wrote. “I see no technical reason why the future needs to look like the status quo today.” - -Buterin is aware that crypto’s utopian promises sound stale to many, and calls the race to implement sharding in the face of competition a “ticking time bomb.” “If we don’t have sharding fast enough, then people might just start migrating to more centralized solutions,” he says. “And if after all that stuff happens and it still centralizes, then yes, there’s a much stronger argument that there’s a big problem.” - -**As the technical kinks** get worked out, Buterin has turned his attention toward larger sociopolitical issues he thinks the [blockchain might solve](https://time.com/6142810/proof-of-humanity/). On his blog and on Twitter, you’ll find treatises on [housing](https://vitalik.ca/general/2021/12/19/bullveto.html); on [voting systems](https://vitalik.ca/general/2021/05/25/voting2.html); on the best way to distribute [public goods](https://vitalik.ca/general/2021/11/16/retro1.html); on [city building](https://vitalik.ca/general/2021/10/31/cities.html) and longevity research. While Buterin spent much of the pandemic living in Singapore, he increasingly lives as a digital nomad, writing dispatches from the road. - -Those who know Buterin well have noticed a philosophical shift over the years. “He’s gone on a journey from being more sympathetic to anarcho-capitalist thinking to Georgist-type thinking,” says Glen Weyl, an economist who is one of his close collaborators, referring to a theory that holds the value of the commons should belong equally to all members of society. One of Buterin’s recent posts calls for the creation of a new type of NFT, based not on monetary value but on participation and identity. For instance, the allocation of votes in an organization might be determined by the commitment an individual has shown to the group, as opposed to the number of tokens they own. “NFTs can represent much more of who you are and not just what you can afford,” he [writes](https://vitalik.ca/general/2022/01/26/soulbound.html). - -**Read More:** *[How Crypto Investors Are Handling Plunging Prices](https://time.com/6141028/crypto-crash-investors/)* - -While Buterin’s blog is one of his main tools of public persuasion, his posts aren’t meant to be decrees, but rather intellectual explorations that invite debate. Buterin often dissects the flaws of obscure ideas he once wrote effusively about, like Harberger taxes. His blog is a model for how a leader can work through complex ideas with transparency and rigor, exposing the messy process of intellectual growth for all to see, and perhaps learn from. - -Some of Buterin’s more radical ideas can provoke alarm. In January, he caused a minor outrage on Twitter by [advocating for synthetic wombs](https://twitter.com/vitalikbuterin/status/1483491180906045440?lang=en), which he argued could reduce the pay gap between men and women. He predicts there’s a decent chance someone born today will live to be 3,000, and takes the anti-diabetes medication Metformin in the hope of slowing his body’s aging, despite [mixed studies](https://www.nytimes.com/2019/06/19/well/move/an-anti-aging-pill-think-twice.html) on the drug’s efficacy. - -[*Subscribe to TIME’s newsletter* *Into the Metaverse* *for a weekly guide to the future of the Internet.*](https://time.com/newsletters/?newsletter_name=metaverse&source=meta_onsite) *You can find* [*past issues of the newsletter here*](https://time.com/tag/into-the-metaverse/)*.* - -As governmental bodies prepare to wade into crypto—in March, [President Biden signed an Executive Order](https://time.com/6156247/biden-crypto-executive-order/) seeking a federal plan for regulating digital assets—Buterin has increasingly been sought out by politicians. At ETHDenver, he held a private conversation with Colorado Governor Jared Polis, a Democrat who supports cryptocurrencies. Buterin is anxious about crypto’s political valence in the U.S., where Republicans have generally been more eager to embrace it. “There’s definitely signs that are making it seem like crypto is on the verge of becoming a right-leaning thing,” Buterin says. “If it does happen, we’ll sacrifice a lot of the potential it has to offer.” - -To Buterin, the worst-case scenario for the future of crypto is that blockchain technology ends up concentrated in the hands of dictatorial governments. He is unhappy with [El Salvador’s rollout of Bitcoin](https://time.com/6103299/bitcoin-el-salvador-nayib-bukele/) as legal tender, which has been riddled with identity theft and volatility. The prospect of governments using the technology to crack down on dissent is one reason Buterin is adamant about crypto remaining decentralized. He sees the technology as the most powerful equalizer to surveillance technology deployed by governments (like China’s) and powerful companies (like Meta) alike. - -If Mark Zuckerberg shouldn’t have the power to make epoch-changing decisions or control users’ data for profit, Buterin believes, then neither should he—even if that limits his ability to shape the future of his creation, sends some people to other blockchains, or allows others to use his platform in unsavory ways. “I would love to have an ecosystem that has lots of good crazy and bad crazy,” Buterin says. “Bad crazy is when there’s just huge amounts of money being drained and all it’s doing is subsidizing the hacker industry. Good crazy is when there’s tech work and research and development and public goods coming out of the other end. So there’s this battle. And we have to be intentional, and make sure more of the right things happen.” - -*—With reporting by Nik Popli and Mariah Espada/Washington* - -More Must-Read Stories From TIME - ---- - -- Moldovans Fear They’ll Be Putin’s Next Target. [**Their Prime Minister Is Preparing**](https://time.com/6156227/moldova-russia-ukraine-natalia-gavrilita/?utm_source=roundup&utm_campaign=20220316) for the Worst -- This Is Why [**We’re Still Struggling With Anti-AAPI Hate**](https://time.com/6157617/atlanta-shootings-why-were-still-struggling-with-anti-aapi-hate/?utm_source=roundup&utm_campaign=20220316) One Year After Atlanta Shootings -- What to Know About a [**Fourth COVID-19 Vaccine Dose**](https://time.com/6157560/fourth-covid-19-vaccine-dose/?utm_source=roundup&utm_campaign=20220316) -- Evan Rachel Wood, Marilyn Manson and [**the Stories We Tell Ourselves About Iconoclastic Rock Stars**](https://time.com/6157354/phoenix-rising-evan-rachel-wood-marilyn-manson/?utm_source=roundup&utm_campaign=20220316) -- After Fleeing Ukraine, [**LGBTQ Refugees Search for Safety**](https://time.com/6156672/lgbtq-ukraine-refugees-russia/?utm_source=roundup&utm_campaign=20220316) in Countries Hostile to Their Rights -- A [**Haitian Man's Brutal Experience With U.S. Border Agents**](https://time.com/6144970/mirard-joseph-haitian-migrants-del-rio-border/?utm_source=roundup&utm_campaign=20220316) Sparked Outrage. Now He's Telling His Story -- 'It’s Our Home Turf.' [**The Man On Ukraine's Digital Frontline**](https://time.com/6157308/its-our-home-turf-the-man-on-ukraines-digital-frontline/?utm_source=roundup&utm_campaign=20220316) - -**Contact us** at [letters@time.com](mailto:letters@time.com?subject=(READER%20FEEDBACK)%20The%20Man%20Behind%20Ethereum%20Is%20Worried%20About%20Crypto's%20Future&body=https%3A%2F%2Ftime.com%2F6158182%2Fvitalik-buterin-ethereum-profile%2F). - -  -  - ---- -`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))` \ No newline at end of file diff --git a/00.03 News/The Miseducation of Maria Montessori.md b/00.03 News/The Miseducation of Maria Montessori.md index 780974f2..1e6402b4 100644 --- a/00.03 News/The Miseducation of Maria Montessori.md +++ b/00.03 News/The Miseducation of Maria Montessori.md @@ -14,7 +14,7 @@ CollapseMetaTable: Yes --- Parent:: [[@News|News]] -Read:: No +Read:: [[2022-04-23]] --- diff --git a/00.03 News/The Unravelling of an Expert on Serial Killers.md b/00.03 News/The Unravelling of an Expert on Serial Killers.md index 2ab60180..6bf335d0 100644 --- a/00.03 News/The Unravelling of an Expert on Serial Killers.md +++ b/00.03 News/The Unravelling of an Expert on Serial Killers.md @@ -14,7 +14,7 @@ CollapseMetaTable: Yes --- Parent:: [[@News|News]] -Read:: No +Read:: [[2022-04-23]] --- diff --git a/00.03 News/TikTok Star Ava Majury Discovers the Dark Side of Fame.md b/00.03 News/TikTok Star Ava Majury Discovers the Dark Side of Fame.md index b5c83a33..0be24f93 100644 --- a/00.03 News/TikTok Star Ava Majury Discovers the Dark Side of Fame.md +++ b/00.03 News/TikTok Star Ava Majury Discovers the Dark Side of Fame.md @@ -13,7 +13,7 @@ CollapseMetaTable: Yes --- Parent:: [[@News|News]] -Read:: No +Read:: [[2022-04-23]] --- diff --git a/00.03 News/You Don’t Know Much About Jay Penske. And He’s Fine With That..md b/00.03 News/You Don’t Know Much About Jay Penske. And He’s Fine With That..md index 896f58bf..d6c71101 100644 --- a/00.03 News/You Don’t Know Much About Jay Penske. And He’s Fine With That..md +++ b/00.03 News/You Don’t Know Much About Jay Penske. And He’s Fine With That..md @@ -14,7 +14,7 @@ CollapseMetaTable: Yes --- Parent:: [[@News|News]] -Read:: No +Read:: [[2022-04-23]] --- diff --git a/00.03 News/“The Eye in the Sea” camera observes elusive deep sea animals.md b/00.03 News/“The Eye in the Sea” camera observes elusive deep sea animals.md new file mode 100644 index 00000000..def7f85c --- /dev/null +++ b/00.03 News/“The Eye in the Sea” camera observes elusive deep sea animals.md @@ -0,0 +1,191 @@ +--- + +dg-publish: true +Alias: [""] +Tag: ["Nature", "Science", "Animal", "Sea"] +Date: 2022-04-23 +DocType: "WebClipping" +Hierarchy: +TimeStamp: 2022-04-23 +Link: https://www.vox.com/science-and-health/2022/4/20/23020129/edith-widder-eye-in-the-sea-camera-giant-squid +location: +CollapseMetaTable: Yes + +--- + +Parent:: [[@News|News]] +Read:: No + +--- + +  + +```button +name Save +type command +action Save current file +id Save +``` +^button-TheEyeintheSeaNSave + +  + +# “The Eye in the Sea” camera observes elusive deep sea animals + +Marine biologist Edith Widder loves the ocean, but there is one thing she envies about her colleagues who study life on land. + +On land, if scientists want to observe animals in their natural habitat, undisturbed, they can set up special concealment spots, or “blinds,” that hide their presence from their subjects. Undisturbed, animals will reveal amazing secrets: mating rituals, hunting habits, or special behaviors that help them avoid predators. But for a long time, Widder couldn’t conceal herself enough to glean these kinds of details from underwater research subjects. + +“We’re just so obtrusive,” Widder says, when she describes the options that are most readily available to a marine biologist, like observing sea creatures aboard a submarine. “When we go down there with our big, noisy thrusters and bright white lights.” She says the fish and other animals are disturbed by the noise and the vibrations, so even if they don’t swim away, they won’t necessarily act naturally. And so, Widder suspected that there were lots of great scientific insights and lessons of natural history, all being left unlearned. + +Studying fish in labs is also not a perfect solution. Over the course of her decades-long career, when Widder captured animals from the deep ocean and brought them into laboratory aquariums for study, the ocean animals would sometimes start behaving weirdly. Animals that might normally swim around would just float at the top of tanks and generally act like they were in a glass cage, thousands of miles away from home. + + ![](https://cdn.vox-cdn.com/thumbor/q3j0eFI5f_BkBeNayiCE8k6ths4=/0x0:2220x3000/1200x0/filters:focal(0x0:2220x3000):no_upscale()/cdn.vox-cdn.com/uploads/chorus_asset/file/23387721/Edie_in_Wasp__1_A.JPEG) + +Ocean biologist Edith Widder, early in her career as a marine explorer, in a diving suit known as a WASP. + +Courtesy of Edith Widder + +“It just leaves you with so many questions when you see an animal like this,” Widder says. “And how can we ever know these things?” + +This was why Widder wanted the chance to observe ocean animals like the [gulper eel](https://oceanconservancy.org/blog/2019/12/09/gulper-eels/), or [sixgill sharks](https://www.floridamuseum.ufl.edu/discover-fish/species-profiles/hexanchus-griseus/), or even the extremely elusive [giant squid](https://ocean.si.edu/ocean-life/invertebrates/giant-squid), without them noticing her presence. + +“I don’t think people have any concept of how little we understand life on our own planet,” she says. + +But in order to understand that life better — at least in the ocean — she would need to create the equivalent of a blind for the ocean. And so, she did, by mimicking the amazing adaptations of sea creatures she’d studied, and using them to design a camera she calls “The Eye in the Sea.” In her book, [*Below the Edge of Darkness*](https://www.amazon.com/Below-Edge-Darkness-Memoir-Exploring-ebook/dp/B08M2Z5ZW1), and on the latest episode of Vox’s [*Unexplainable* podcast](https://www.vox.com/unexplainable), Widder recalls her quest to build this underwater eye, and the unexpected scientific treasures it has allowed her to witness. + +It started decades ago, with journeys down into the depths of the ocean, where Widder encountered some very strange fish. + +## An amazing discovery that left Widder wanting more + +It was 1989. Widder had squeezed into a Johnson Sea Link submersible. This was a deep-water vehicle with a big, transparent sphere that researchers like Widder could sit in and observe ocean life while maneuvering robotic arms to drop samples into collection buckets. At the time, it was one of the few submersibles available for research into questions about life in the middle of the ocean, instead of just the seafloor, or the surface waters. + +Widder and Phil Santos, the submersible’s pilot, were nearing the end of their dive. As she remembers, it was late in the day, and they’d already been called to return to the surface. “You really don’t want to mess with people’s dinner times,” she says. A late return “makes you very unpopular.” + +But as they were preparing to come up, Widder saw something extremely weird swimming out in front of them: a fish with a super long, skinny tail, a long, racing-stripe-like strip running down its side, and a huge, pelican-like mouth. + +She recognized it as a gulper eel, a mysterious, deep-sea fish that’s truly weird. Unlike other eels, [it doesn’t have scales or pelvic fins or a swim bladder](https://twilightzone.whoi.edu/explore-the-otz/creature-features/pelican-eel/). It’s also hard to find. + +“I had never seen \[a live\] one before and have never seen one since,” Widder says. “To see a live one is very, very rare.” + +Excited, Widder started fiddling with the controls on her camera, hoping to capture the eel on film. But when she looked up again, it was gone. And in its place, there was a big, brown balloon. + +“It was just… *what the hell*,” she remembers. Then, before her eyes, the balloon deflated, forming back into the shape of an eel. She realized that the balloon *was* the eel — the fish had puffed up its own jaw, stretching into the rounded shape. Widder suspects they were the first people to ever witness this behavior. + +“I didn’t know they could do that. I don’t know if *anybody* knew they could do that,” she said to Santos, as the eel did the trick again, this time while she was filming it. + +And then, Santos bumped the vehicle’s thrusters just enough to slide the eel into one of the eight plexiglass cylinders used to hold samples on the submersible. Suddenly, they hadn’t just filmed the rare eel. They had caught it. + +Together, Santos and Widder finally surfaced and brought the gulper eel to their shipboard lab, along with some excited colleagues. + + ![](https://cdn.vox-cdn.com/thumbor/rHBaWPi30rL5kmqZSsCNUPz-cjw=/0x0:3000x1742/1200x0/filters:focal(0x0:3000x1742):no_upscale()/cdn.vox-cdn.com/uploads/chorus_asset/file/23387722/Gulper_comp2__1_.JPG) + +The mysterious gulper eel in non-balloon form. + +Courtesy of Edith Widder + +But this is where the frustrations set in. On the one hand, this experience had been an absolute triumph. Widder had an unprecedented chance to study a rare eel, alive. She was making cool discoveries about its behavior. + +But on the other hand, she was left with endless questions: Why did the gulper eel turn into a balloon? Why, as she also observed while studying it, did it let out a blindingly bright bioluminescent glow? Were these defensive maneuvers? Why use one in some cases, and another in others? + +Widder says she had no good way of answering these questions, because the gulper eel wasn’t going to behave normally under lab conditions, and she couldn’t know how the presence of the sub changed its behavior. + +But the experience inspired her to build a tool that would let her answer these questions — not just for gulper eels, for lots of ocean animals. + +## Building an ocean blind + +The experience with the eel, and others like it, stuck in Widder’s mind. By the mid-1990s, she’d decided that she wanted to invent a tool that would let her see ocean creatures like gulper eels up close without needing to put them in tanks or scare them with submersibles. + +She thought that an undersea camera would be the best tool for the job, but there was a big obstacle she had to overcome: the darkness of the deep ocean. In the past, when scientists sent down cameras, they’d also sent down bright, white lights to light up the ocean depths. But Widder thought these lights were scaring away all the animals, or at least keeping them from acting naturally. They weren’t all that much less intrusive than the submarine thrusters. + +Widder knew that she would still need light if she wanted her camera to be able to film. But she thought she might be able to solve the problem of scaring animals away by drawing inspiration from a special predator she’d studied known as a [stoplight loosejaw](https://twilightzone.whoi.edu/explore-the-otz/creature-features/stoplight-loosejaw/), or “stoplight fish.” + +Like many deep-sea creatures, the stoplight fish is mildly horrifying at first glance. It has a long, dark body, pale eyes, and a jaw full of spiky teeth. But it gets its name from the unusual patches just below its eye that glow with red and green bioluminescence. + + ![](https://cdn.vox-cdn.com/thumbor/rpkxCThDfynUAe988xrjQQKJACE=/0x0:2100x739/1200x0/filters:focal(0x0:2100x739):no_upscale()/cdn.vox-cdn.com/uploads/chorus_asset/file/23387725/Malacosteus_niger.jpeg) + +This rendering of a stoplight loosejaw is from a [1896 book on ocean fish](https://www.biodiversitylibrary.org/page/4330655#page/48/mode/1up). + +The red bioluminescence, in particular, is unusual. Most ocean animals that produce bioluminescence make blue light. + +To understand why, a quick explanation of light in water: Red light cannot travel very far in ocean water. That’s because it has long wavelengths, [and winds up getting absorbed quickly by the water](http://manoa.hawaii.edu/exploringourfluidearth/physical/ocean-depths/light-ocean). That’s why a red swimsuit can appear black underwater. + +Blue light, by contrast, has short wavelengths, so it travels much farther. It makes sense, then, that deep ocean creatures that are producing light to attract mates, or lure in prey, or flash out communications, use blue light to do so. + +But because most of the bioluminescence in the deep ocean is blue light, Widder says, most ocean animals have also evolved to see blue light, so the stoplight fish’s red light is invisible to them. + +“The cool thing about the stoplight fish is that it uses its bioluminescence like a sniper scope,” Widder says. “It makes red light and it can see red light that other fish can’t see. So it can sneak up on them, illuminate them clearly, and see them without being seen.” In this case, the fish’s “scope” is extremely short-range, but it’s still useful to have an invisible flashlight when you’re trying to illuminate your dinner without alarming it. + +Widder realized that if she could imitate the stoplight fish, then she would have a way of lighting up the ocean without disturbing many of its residents. But it wasn’t as simple as just flashing a red light bulb under the sea. She had to reconstruct the specific way the fish generated the red light, covering the light source with a filter that could strain out all the other colors, so that no accidental hints of blue or green light snuck through to alert the fish. + +She then paired her camera with a blue light lure: several blue LED lights in an epoxy mold that would light up like an “electronic jellyfish,” attracting predators to her camera so she could film them. + +She gave the whole contraption a name: The Eye in the Sea. And in 2004, she finally had the chance to test it out for the first time. + + ![](https://cdn.vox-cdn.com/thumbor/hVFzuwitWEemp_ZPvJmXbNvmQks=/0x0:3000x2250/1200x0/filters:focal(0x0:3000x2250):no_upscale()/cdn.vox-cdn.com/uploads/chorus_asset/file/23387733/e_jellyA.JPEG) + +The “electronic jellyfish,” a lure made out of blue LED lights. + +Courtesy of Edith Widder + + ![](https://cdn.vox-cdn.com/thumbor/68VIISC69Lftx7BLBNzaEraSg0Q=/0x0:3000x2250/1200x0/filters:focal(0x0:3000x2250):no_upscale()/cdn.vox-cdn.com/uploads/chorus_asset/file/23387748/EITS3_in_situA.JPEG) + +The Eye in the Sea in place on the seafloor, ready to record underwater happenings. + +Courtesy of Edith Widder + +## The Eye in the Sea opens up + +The first test was in the Gulf of Mexico, where Widder left the Eye in the Sea on the seafloor overnight. She wanted to start by just watching the seafloor, lit up by red light, to see how creatures might react. And then, a few hours in, she planned to turn on the blue “electronic jellyfish” lure, to see if it attracted any predators. + +When they got the Eye in the Sea back on deck the next day, Widder went back to the lab, alone, to review the footage. + +To the untrained eye, it wasn’t particularly thrilling. The camera was black and white, and, in Widder’s words, “pretty crummy.” But she didn’t care, because to her, what she was seeing was extraordinary: the fish were not afraid of her red light at all. They were swimming straight toward and around her camera, letting themselves be filmed. + +“I was, for the very first time, seeing the world as it actually is instead of how it appears when we go down and disturb it. And I was ecstatic,” she remembers. “I had my window into the deep sea.” + +Then, she got to the part of the footage where the electronic jellyfish turned on and started flashing tiny lights to attract predators. + +A minute and 26 seconds later, a squid swam on screen that Widder describes as “so new to science, it could not even be placed in any known scientific family. Not just genus, but *family*.” Most squid have long, thin tentacles, Widder says, [but this one had short, muscular ones](https://tos.org/oceanography/assets/docs/20-4_widder.pdf). + +“I screamed so loud when that squid appeared that they heard me up on the bridge,” she says. “And every time after that, when we recovered the Eye in the Sea, I had a crowd around me.” + +## A whole new ocean view + +Widder eventually got money from the National Science Foundation to improve her camera, and use it as a window into the ocean world. + +By 2012, Widder had also developed a new version of the Eye in the Sea called “[The Medusa,](https://oceanexplorer.noaa.gov/explorations/15biolum/background/medusa/medusa.html)” which she was able to test off the coast of Japan. The goal of the expedition was to capture footage of the giant squid, an incredibly elusive animal that can grow as large as a four-story building, but had until that point, only ever been studied from dead specimens. + +Widder thought that, like all the fish before it, the squid had been scared away by the bright white lights researchers had sent down with film equipment in the past. She hoped the Medusa’s red lights and subtle blue lure would be more successful. And they were. + +“They were actually filming at the moment that I was reviewing the video and saw it and just completely lost my mind,” she remembers. Since then, she’s filmed the squid multiple times. + + ![](https://cdn.vox-cdn.com/thumbor/i4brBhlogCMLePqgY7S0CxLqjYQ=/0x0:3000x2250/1200x0/filters:focal(0x0:3000x2250):no_upscale()/cdn.vox-cdn.com/uploads/chorus_asset/file/23387753/Attack_1B__1_A.JPEG) + +A still from video footage the Medusa captured of the giant squid in 2012. + +Courtesy of Edith Widder + + ![](https://cdn.vox-cdn.com/thumbor/CksdAB8zod11JJIfc988dr9tKAU=/0x0:3000x1922/1200x0/filters:focal(0x0:3000x1922):no_upscale()/cdn.vox-cdn.com/uploads/chorus_asset/file/23387756/Giant_6_gill_2.JPG) + +A sixgill shark approaches. + +Courtesy of Edith Widder + +She’s also continued to discover new behaviors — behaviors that she can witness in context, instead of trying to understand them in a lab, as she had to with her captured gulper eel. + +She’s particularly proud of what she’s learned about sixgill sharks, which live near the ocean floor and scavenge for food. With the Eye in the Sea, Widder was able to capture footage of the sharks going vertical in the water to suck up muck from the ocean floor and run it through their gills. She believes that they’re doing this in order to sieve tiny bits of food out of that muck. + +“It goes a long way to explaining how these giants manage to survive in such a food-poor environment,” she says. “But how are we ever going to know these things unless we can observe them like that?” + +Of course, countless questions remain. Widder has still never fully answered her questions about gulper eels, for example, because she hasn’t seen them again with the Eye, and she’s turned up many other questions about ocean life over the course of her career. But now, at least, she has a tool she can use to answer those questions. And she’s excited to keep exploring. Before her career ends, she hopes to answer critical questions about [marine snow](https://oceanexplorer.noaa.gov/facts/marinesnow.html) — the fecal pellets and plankton bodies that fall from the surface and nourish all the ocean life below. + +“For me, the appeal of science is the notion of actually seeing something or learning something that nobody else has ever seen or known,” she says. + +And by that standard, Widder has had an incredibly appealing career. + +  +  + +--- +`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))` \ No newline at end of file diff --git a/05.02 Networks/Configuring UFW.md b/05.02 Networks/Configuring UFW.md index da08001f..39fe3fea 100644 --- a/05.02 Networks/Configuring UFW.md +++ b/05.02 Networks/Configuring UFW.md @@ -237,13 +237,15 @@ sudo bash /etc/addip4ban/addip4ban.sh #### Ban List Tasks -- [ ] [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix 🔁 every week on Saturday 📅 2022-04-23 +- [ ] [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix 🔁 every week on Saturday 📅 2022-04-30 +- [x] [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix 🔁 every week on Saturday 📅 2022-04-23 ✅ 2022-04-22 - [x] [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix 🔁 every week on Saturday 📅 2022-04-16 ✅ 2022-04-16 - [x] [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix 🔁 every week on Saturday 📅 2022-04-10 ✅ 2022-04-10 - [x] [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix 🔁 every week on Saturday 📅 2022-04-02 ✅ 2022-04-02 - [x] [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix 🔁 every week on Saturday 📅 2022-03-26 ✅ 2022-03-26 - [x] [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix 🔁 every week on Saturday 📅 2022-03-19 ✅ 2022-03-18 -- [ ] [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list 🔁 every month on Saturday 📅 2022-04-23 +- [ ] [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list 🔁 every month on Saturday 📅 2022-04-30 +- [x] [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list 🔁 every month on Saturday 📅 2022-04-23 ✅ 2022-04-22 - [x] [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list 🔁 every month on Saturday 📅 2022-04-16 ✅ 2022-04-16 - [x] [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list 🔁 every month on Saturday 📅 2022-04-10 ✅ 2022-04-10 - [x] [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list 🔁 every month on Saturday 📅 2022-04-02 ✅ 2022-04-02 diff --git a/06.02 Investments/Crypto Tasks.md b/06.02 Investments/Crypto Tasks.md index 794f7196..7a9af9c3 100644 --- a/06.02 Investments/Crypto Tasks.md +++ b/06.02 Investments/Crypto Tasks.md @@ -72,7 +72,8 @@ All tasks and to-dos Crypto-related. [[#^Top|TOP]]   -- [ ] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2022-04-22 +- [ ] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2022-04-29 +- [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2022-04-22 ✅ 2022-04-22 - [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2022-04-15 ✅ 2022-04-15 - [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2022-04-08 ✅ 2022-04-08 - [x] [[Crypto Tasks#internet alerts|monitor Crypto news and publications]] 🔁 every week on Friday 📅 2022-04-01 ✅ 2022-04-01 diff --git a/06.02 Investments/Equity Tasks.md b/06.02 Investments/Equity Tasks.md index 2cb69a79..d7a6c2a6 100644 --- a/06.02 Investments/Equity Tasks.md +++ b/06.02 Investments/Equity Tasks.md @@ -72,7 +72,8 @@ Note summarising all tasks and to-dos for Listed Equity investments. [[#^Top|TOP]]   -- [ ] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2022-04-22 +- [ ] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2022-04-29 +- [x] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2022-04-22 ✅ 2022-04-22 - [x] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2022-04-15 ✅ 2022-04-15 - [x] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2022-04-08 ✅ 2022-04-08 - [x] [[Equity Tasks#internet alerts|monitor Equity news and publications]] 🔁 every week on Friday 📅 2022-04-01 ✅ 2022-04-01 diff --git a/06.02 Investments/VC Tasks.md b/06.02 Investments/VC Tasks.md index aa9c0f92..6c256e3d 100644 --- a/06.02 Investments/VC Tasks.md +++ b/06.02 Investments/VC Tasks.md @@ -72,7 +72,8 @@ Tasks and to-dos for VC investments. [[#^Top|TOP]]   -- [ ] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2022-04-22 +- [ ] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2022-04-29 +- [x] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2022-04-22 ✅ 2022-04-22 - [x] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2022-04-15 ✅ 2022-04-15 - [x] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2022-04-08 ✅ 2022-04-08 - [x] [[VC Tasks#internet alerts|monitor VC news and publications]] 🔁 every week on Friday 📅 2022-04-01 ✅ 2022-04-01